JSON, XML & Yaml Hacking & Issues

Reading time: 4 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Go JSON Decoder

Masuala yafuatayo yaligundulika katika Go JSON ingawa yanaweza kuwepo katika lugha nyingine pia. Masuala haya yaliwekwa wazi katika hiki kipande cha blog.

Parsers za JSON, XML, na YAML za Go zina historia ndefu ya kutokuelewana na mipangilio isiyo salama ambayo inaweza kutumika kuzidi uthibitisho, kuinua mamlaka, au kuhamasisha data nyeti.

(Un)Marshaling Data Isiyotarajiwa

Lengo ni kutumia structs ambazo zinamruhusu mshambuliaji kusoma/kandika maeneo nyeti (mfano, IsAdmin, Password).

  • Mfano wa Struct:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Uthibitisho wa Kawaida
  1. Kikosi kilichokosekana (hakuna kikosi = uwanja bado unachambuliwa kwa chaguo-msingi):
go
type User struct {
Username string
}

Payload:

json
{"Username": "admin"}
  1. Matumizi yasiyo sahihi ya -:
go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

json
{"-": true}

βœ”οΈ Njia sahihi ya kuzuia uwanja usiweze (kuwekwa) au (kuondolewa) kutoka kwa marshaling:

go
type User struct {
IsAdmin bool `json:"-"`
}

Parser Differentials

Lengo ni kupita idhini kwa kutumia jinsi parser tofauti zinavyotafsiri payload sawa kwa njia tofauti kama katika:

  • CVE-2017-12635: Apache CouchDB bypass kupitia funguo za nakala
  • 2022: Zoom 0-click RCE kupitia kutokuelewana kwa parser ya XML
  • GitLab 2025 SAML bypass kupitia tabia za XML

1. Duplicate Fields: Go's encoding/json inachukua field ya mwisho.

go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction

Waparser wengine (k.m., Jackson ya Java) wanaweza kuchukua ya kwanza.

2. Kutokuwa na Muktadha wa Herufi: Go haina muktadha wa herufi:

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

Hata hila za Unicode zinafanya kazi:

go
json.Unmarshal([]byte(`{"aβ„ͺtionΕΏ": "bypass"}`), &req)

3. Mismatch ya huduma nyingi: Fikiria:

  • Proxy iliyoandikwa kwa Go
  • Huduma ya AuthZ iliyoandikwa kwa Python

Mshambuliaji anatumia:

json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python inaona UserAction, inaruhusu
  • Go inaona AdminAction, inatekeleza

Mchanganyiko wa Muundo wa Takwimu (Polyglots)

Lengo ni kutumia mifumo inayochanganya muundo (JSON/XML/YAML) au kushindwa kufungua kwenye makosa ya parser kama:

  • CVE-2020-16250: HashiCorp Vault ilipars JSON kwa kutumia parser ya XML baada ya STS kurudisha JSON badala ya XML.

Mshambuliaji anadhibiti:

  • Kichwa cha Accept: application/json
  • Udhibiti wa sehemu ya mwili wa JSON

Parser ya XML ya Go ilipars bila kujali na kuamini utambulisho ulioingizwa.

  • Payload iliyoundwa:
json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

Result:

  • Go JSON parser: Action_2 (case-insensitive + last wins)
  • YAML parser: Action_1 (case-sensitive)
  • XML parser: parses "Action_3" inside the string

πŸ” Mitigations

HatariSuluhisho
Nyamba zisizojulikanadecoder.DisallowUnknownFields()
Nyamba za kurudi (JSON)❌ Hakuna suluhisho katika stdlib
Mechi isiyo na herufi kubwa❌ Hakuna suluhisho katika stdlib
Takataka za XML❌ Hakuna suluhisho katika stdlib
YAML: funguo zisizojulikanayaml.KnownFields(true)

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks