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

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:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Vulnerabilità comuni
  1. Tag mancante (nessun tag = il campo viene comunque analizzato per impostazione predefinita):
go
type User struct {
Username string
}

Payload:

json
{"Username": "admin"}
  1. Uso errato di -:
go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

json
{"-": true}

✔️ Modo corretto per bloccare un campo dall'essere (de)serializzato:

go
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.

go
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:

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

Anche i trucchi Unicode funzionano:

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

3. Mismatch tra servizi: Immagina:

  • Proxy scritto in Go
  • Servizio AuthZ scritto in Python

L'attaccante invia:

json
{
"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:
json
{
"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

RischioSoluzione
Campi sconosciutidecoder.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 sconosciuteyaml.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