JSON, XML & Yaml Hacking & Issues

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-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)Maršalovanje Neočekivanih Podataka

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
}

Payload:

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

Teret:

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 ubačenom 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

🔐 Mogućnosti ublažavanja

RizikRešenje
Nepoznata poljadecoder.DisallowUnknownFields()
Duplirana polja (JSON)❌ Nema rešenja u stdlib
Poklapanje bez obzira na velika i mala slova❌ Nema rešenja u stdlib
XML smešni podaci❌ Nema rešenja u stdlib
YAML: nepoznati ključeviyaml.KnownFields(true)

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