JSON, XML & Yaml Hacking & Issues

Reading time: 4 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 festgestellt, obwohl sie auch in anderen Sprachen vorhanden sein könnten. Diese Probleme wurden in diesem Blogbeitrag veröffentlicht.

Go’s JSON-, XML- und YAML-Parser haben eine lange Liste von Inkonsistenzen und unsicheren Standardeinstellungen, die ausgenutzt werden können, um Authentifizierung zu umgehen, Berechtigungen zu eskalieren oder sensible Daten zu exfiltrieren.

(Un)Marshaling Unerwarteter Daten

Das Ziel ist es, Strukturen auszunutzen, die es einem Angreifer ermöglichen, sensible Felder zu lesen/schreiben (z. B. IsAdmin, Password).

  • Beispielstruktur:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Häufige Schwachstellen
  1. Fehlendes Tag (kein Tag = Feld wird standardmäßig weiterhin analysiert):
go
type User struct {
Username string
}

Nutzlast:

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

Nutzlast:

json
{"-": true}

✔️ Richtige Methode, um ein Feld vom (De)Serialisieren abzuhalten:

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

Parser-Differenzen

Das Ziel ist es, die Autorisierung zu umgehen, indem man ausnutzt, wie verschiedene Parser dasselbe Payload unterschiedlich interpretieren, wie in:

  • CVE-2017-12635: Apache CouchDB Umgehung über doppelte Schlüssel
  • 2022: Zoom 0-Klick RCE über XML-Parser-Inkonsistenz
  • GitLab 2025 SAML-Umgehung über XML-Eigenheiten

1. Doppelte Felder: 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. Javas Jackson) können das erste nehmen.

2. Groß-/Kleinschreibung: Go ist nicht groß-/kleinschreibungsempfindlich:

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

Sogar Unicode-Tricks funktionieren:

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

3. Cross-Service-Mismatch: Stellen Sie sich vor:

  • Proxy, geschrieben in Go
  • AuthZ-Dienst, geschrieben in Python

Angreifer sendet:

json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python sieht UserAction, erlaubt es
  • Go sieht AdminAction, führt es aus

Datenformatverwirrung (Polyglots)

Das Ziel ist es, Systeme auszunutzen, die Formate (JSON/XML/YAML) mischen oder bei Parserfehlern offen bleiben, wie z.B.:

  • CVE-2020-16250: HashiCorp Vault analysierte JSON mit einem XML-Parser, nachdem STS JSON anstelle von XML zurückgegeben hatte.

Der Angreifer kontrolliert:

  • Den Accept: application/json Header
  • Teilweise Kontrolle des JSON-Körpers

Der XML-Parser von Go analysierte es trotzdem und vertraute der injizierten Identität.

  • Ausgeklügelte Payload:
json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
  • Go JSON Parser: Action_2 (nicht groß-/kleinschreibungsempfindlich + letzter gewinnt)
  • YAML Parser: Action_1 (groß-/kleinschreibungsempfindlich)
  • XML Parser: parst "Action_3" innerhalb des Strings

🔐 Minderung

RisikoLösung
Unbekannte Felderdecoder.DisallowUnknownFields()
Duplizierte Felder (JSON)❌ Keine Lösung in der Standardbibliothek
Groß-/Kleinschreibungsempfindliche Übereinstimmung❌ Keine Lösung in der Standardbibliothek
XML-Mülldaten❌ Keine Lösung in der Standardbibliothek
YAML: unbekannte Schlüsselyaml.KnownFields(true)

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