JSON, XML & Yaml Hacking & Issues
Reading time: 4 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 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. Mismatch 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>"
}
Risultato:
- Go JSON parser:
Action_2
(non sensibile al maiuscolo + ultimo vince) - YAML parser:
Action_1
(sensibile al maiuscolo) - XML parser: analizza
"Action_3"
all'interno della stringa
🔐 Mitigazioni
Rischio | Soluzione |
---|---|
Campi sconosciuti | decoder.DisallowUnknownFields() |
Campi duplicati (JSON) | ❌ Nessuna soluzione nella stdlib |
Corrispondenza non sensibile al maiuscolo | ❌ Nessuna soluzione nella stdlib |
Dati spazzatura XML | ❌ Nessuna soluzione nella stdlib |
YAML: chiavi sconosciute | yaml.KnownFields(true) |
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.