JSON, XML & Yaml Hacking & Issues

Reading time: 5 minutes

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Go JSON Decoder

Se detectaron los siguientes problemas en el Go JSON, aunque también podrían estar presentes en otros lenguajes. Estos problemas se publicaron en esta entrada de blog.

Los analizadores JSON, XML y YAML de Go tienen una larga trayectoria de inconsistencias y configuraciones predeterminadas inseguras que pueden ser abusadas para eludir la autenticación, escalar privilegios o exfiltrar datos sensibles.

(Un)Marshaling Datos Inesperados

El objetivo es explotar estructuras que permitan a un atacante leer/escribir campos sensibles (por ejemplo, IsAdmin, Password).

  • Example Struct:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Vulnerabilidades Comunes
  1. Etiqueta faltante (sin etiqueta = el campo aún se analiza por defecto):
go
type User struct {
Username string
}

Carga útil:

json
{"Username": "admin"}
  1. Uso incorrecto de -:
go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Carga útil:

json
{"-": true}

✔️ Forma adecuada de bloquear un campo para que no sea (des)serializado:

go
type User struct {
IsAdmin bool `json:"-"`
}

Diferenciales de Parser

El objetivo es eludir la autorización aprovechando cómo diferentes parsers interpretan la misma carga útil de manera diferente, como en:

  • CVE-2017-12635: elusión de Apache CouchDB a través de claves duplicadas
  • 2022: RCE de Zoom 0-click a través de la inconsistencia del parser XML
  • elusión de SAML de GitLab 2025 a través de peculiaridades de XML

1. Campos Duplicados: El encoding/json de Go toma el último campo.

go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction

Otros analizadores (por ejemplo, Jackson de Java) pueden tomar el primero.

2. Insensibilidad a Mayúsculas y Minúsculas: Go es insensible a mayúsculas y minúsculas:

go
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field

Incluso los trucos de Unicode funcionan:

go
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)

3. Desajuste entre servicios: Imagina:

  • Proxy escrito en Go
  • Servicio de AuthZ escrito en Python

El atacante envía:

json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python ve UserAction, lo permite
  • Go ve AdminAction, lo ejecuta

Confusión de Formato de Datos (Políglotas)

El objetivo es explotar sistemas que mezclan formatos (JSON/XML/YAML) o que fallan abiertamente en errores de análisis como:

  • CVE-2020-16250: HashiCorp Vault analizó JSON con un analizador XML después de que STS devolviera JSON en lugar de XML.

El atacante controla:

  • El encabezado Accept: application/json
  • Control parcial del cuerpo JSON

El analizador XML de Go lo analizó de todos modos y confió en la identidad inyectada.

  • Carga útil elaborada:
json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

Resultado:

  • Go JSON parser: Action_2 (sin distinción entre mayúsculas y minúsculas + el último gana)
  • YAML parser: Action_1 (sensible a mayúsculas y minúsculas)
  • XML parser: analiza "Action_3" dentro de la cadena

🔐 Mitigaciones

RiesgoSolución
Campos desconocidosdecoder.DisallowUnknownFields()
Campos duplicados (JSON)❌ Sin solución en stdlib
Coincidencia sin distinción❌ Sin solución en stdlib
Datos basura en XML❌ Sin solución en stdlib
YAML: claves desconocidasyaml.KnownFields(true)

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks