JSON, XML & Yaml Hacking & Issues

Reading time: 5 minutes

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

Go JSON Decoder

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 cet article de blog.

Les parseurs JSON, XML et YAML de Go ont une longue liste d'incohérences et de valeurs par défaut non sécurisées qui peuvent être exploitées pour contourner l'authentification, escalader les privilèges ou exfiltrer des données sensibles.

(Un)Marshaling Unexpected Data

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

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

Charge utile :

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

Charge utile :

json
{"-": true}

✔️ Méthode appropriée pour bloquer un champ de (dé)sérialisation :

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

Différences de Parser

L'objectif est de contourner l'autorisation en exploitant la façon dont différents parsers interprètent la même charge utile de manière différente, comme dans :

  • CVE-2017-12635 : contournement d'Apache CouchDB via des clés dupliquées
  • 2022 : RCE 0-click de Zoom via une incohérence du parser XML
  • Contournement SAML de GitLab 2025 via des particularités XML

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

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

D'autres analyseurs (par exemple, Jackson de Java) peuvent prendre le premier.

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

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

Même les astuces Unicode fonctionnent :

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

3. Mismatch entre services :
Imaginez :

  • Proxy écrit en Go
  • Service AuthZ écrit en Python

L'attaquant envoie :

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

Confusion de format de données (Polyglots)

L'objectif est d'exploiter des systèmes qui mélangent des formats (JSON/XML/YAML) ou échouent en mode ouvert lors d'erreurs de parsing comme :

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

L'attaquant contrôle :

  • L'en-tête Accept: application/json
  • Un contrôle partiel du corps JSON

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

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

Résultat :

  • Go JSON parser : Action_2 (insensible à la casse + dernier gagne)
  • YAML parser : Action_1 (sensible à la casse)
  • XML parser : analyse "Action_3" à l'intérieur de la chaîne

🔐 Atténuations

RisqueCorrection
Champs inconnusdecoder.DisallowUnknownFields()
Champs dupliqués (JSON)❌ Pas de correction dans la stdlib
Correspondance insensible à la casse❌ Pas de correction dans la stdlib
Données XML indésirables❌ Pas de correction dans la stdlib
YAML : clés inconnuesyaml.KnownFields(true)

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