JSON, XML & Yaml Hacking & Issues
Reading time: 4 minutes
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
Wykryto następujące problemy w Go JSON, chociaż mogą one występować również w innych językach. Problemy te zostały opublikowane w tym wpisie na blogu.
Parsers JSON, XML i YAML w Go mają długą historię niespójności i niebezpiecznych domyślnych ustawień, które mogą być wykorzystywane do obejścia uwierzytelniania, eskalacji uprawnień lub ekstrakcji wrażliwych danych.
(Un)Marshaling Unexpected Data
Celem jest wykorzystanie struktur, które pozwalają atakującemu na odczyt/zapis wrażliwych pól (np. IsAdmin
, Password
).
- Przykład struktury:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Powszechne podatności
- Brak tagu (brak tagu = pole jest nadal analizowane domyślnie):
type User struct {
Username string
}
Ładunek:
{"Username": "admin"}
- Nieprawidłowe użycie
-
:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Ładunek:
{"-": true}
✔️ Prawidłowy sposób blokowania pola przed (de)serializacją:
type User struct {
IsAdmin bool `json:"-"`
}
Różnice w parserach
Celem jest obejście autoryzacji poprzez wykorzystanie sposobu, w jaki różne parsery interpretują ten sam ładunek w różny sposób, jak w przypadku:
- CVE-2017-12635: obejście Apache CouchDB za pomocą zduplikowanych kluczy
- 2022: Zoom 0-click RCE poprzez niespójność parsera XML
- GitLab 2025 obejście SAML poprzez dziwactwa XML
1. Zduplikowane pola:
Go's encoding/json
bierze ostatnie pole.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
Inne parsery (np. Jackson w Javie) mogą brać pierwszy.
2. Niezależność od wielkości liter: Go jest niezależny od wielkości liter:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Nawet sztuczki z Unicode działają:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. Niedopasowanie między usługami: Wyobraź sobie:
- Proxy napisane w Go
- Usługa AuthZ napisana w Pythonie
Napastnik wysyła:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python widzi
UserAction
, pozwala na to - Go widzi
AdminAction
, wykonuje to
Confuzja formatu danych (Polygloty)
Celem jest wykorzystanie systemów, które mieszają formaty (JSON/XML/YAML) lub otwierają się na błędy parsera, takie jak:
- CVE-2020-16250: HashiCorp Vault analizował JSON za pomocą parsera XML po tym, jak STS zwrócił JSON zamiast XML.
Atakujący kontroluje:
- Nagłówek
Accept: application/json
- Częściową kontrolę nad ciałem JSON
Parser XML Go i tak to zanalizował i zaufał wstrzykniętej tożsamości.
- Opracowany ładunek:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
- Go JSON parser:
Action_2
(niezależny od wielkości liter + ostatni wygrywa) - YAML parser:
Action_1
(wrażliwy na wielkość liter) - XML parser: analizuje
"Action_3"
wewnątrz ciągu
🔐 Mitigacje
Ryzyko | Naprawa |
---|---|
Nieznane pola | decoder.DisallowUnknownFields() |
Duplikujące się pola (JSON) | ❌ Brak naprawy w stdlib |
Dopasowanie niezależne od wielkości liter | ❌ Brak naprawy w stdlib |
Śmieciowe dane XML | ❌ Brak naprawy w stdlib |
YAML: nieznane klucze | yaml.KnownFields(true) |
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.