Parameter Pollution | JSON Injection

Reading time: 9 minutes

Parameter Pollution

tip

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

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

HTTP Parameter Pollution (HPP) Overview

HTTP Parameter Pollution (HPP) एक तकनीक है जहाँ हमलावर HTTP पैरामीटर को इस तरह से बदलते हैं कि वे वेब एप्लिकेशन के व्यवहार को अनपेक्षित तरीकों से बदल देते हैं। यह हेरफेर HTTP पैरामीटर को जोड़ने, संशोधित करने या डुप्लिकेट करने के द्वारा किया जाता है। इन हेरफेरों का प्रभाव सीधे उपयोगकर्ता को दिखाई नहीं देता लेकिन यह सर्वर साइड पर एप्लिकेशन की कार्यक्षमता को महत्वपूर्ण रूप से बदल सकता है, जिसका अवलोकन क्लाइंट साइड पर किया जा सकता है।

Example of HTTP Parameter Pollution (HPP)

एक बैंकिंग एप्लिकेशन लेनदेन URL:

  • Original URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000

एक अतिरिक्त from पैरामीटर जोड़ने पर:

  • Manipulated URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC

लेनदेन गलत तरीके से accountC पर चार्ज किया जा सकता है बजाय accountA के, जो HPP की क्षमता को दर्शाता है कि यह लेनदेन या अन्य कार्यक्षमताओं जैसे पासवर्ड रीसेट, 2FA सेटिंग्स, या API कुंजी अनुरोधों में हेरफेर कर सकता है।

Technology-Specific Parameter Parsing

  • पैरामीटर को कैसे पार्स और प्राथमिकता दी जाती है, यह अंतर्निहित वेब तकनीक पर निर्भर करता है, जो HPP के शोषण को प्रभावित करता है।
  • Wappalyzer जैसे उपकरण इन तकनीकों और उनके पार्सिंग व्यवहार की पहचान करने में मदद करते हैं।

PHP and HPP Exploitation

OTP Manipulation Case:

  • Context: एक लॉगिन तंत्र जिसमें एक वन-टाइम पासवर्ड (OTP) की आवश्यकता थी, का शोषण किया गया।
  • Method: OTP अनुरोध को Burp Suite जैसे उपकरणों का उपयोग करके इंटरसेप्ट करके, हमलावरों ने HTTP अनुरोध में email पैरामीटर को डुप्लिकेट किया।
  • Outcome: OTP, जो प्रारंभिक ईमेल के लिए था, को इसके बजाय हेरफेर किए गए अनुरोध में निर्दिष्ट दूसरे ईमेल पते पर भेजा गया। यह दोष अनधिकृत पहुंच की अनुमति देता है, जो लक्षित सुरक्षा उपाय को दरकिनार करता है।

यह परिदृश्य एप्लिकेशन के बैकएंड में एक महत्वपूर्ण चूक को उजागर करता है, जिसने OTP उत्पन्न करने के लिए पहले email पैरामीटर को संसाधित किया लेकिन डिलीवरी के लिए अंतिम का उपयोग किया।

API Key Manipulation Case:

  • Scenario: एक एप्लिकेशन उपयोगकर्ताओं को उनके प्रोफ़ाइल सेटिंग्स पृष्ठ के माध्यम से API कुंजी को अपडेट करने की अनुमति देता है।
  • Attack Vector: एक हमलावर यह पता लगाता है कि POST अनुरोध में एक अतिरिक्त api_key पैरामीटर जोड़कर, वे API कुंजी अपडेट फ़ंक्शन के परिणाम को हेरफेर कर सकते हैं।
  • Technique: Burp Suite जैसे उपकरण का उपयोग करते हुए, हमलावर एक अनुरोध तैयार करता है जिसमें दो api_key पैरामीटर होते हैं: एक वैध और एक दुर्भावनापूर्ण। सर्वर, केवल अंतिम घटना को संसाधित करते हुए, API कुंजी को हमलावर द्वारा प्रदान किए गए मान पर अपडेट करता है।
  • Result: हमलावर पीड़ित की API कार्यक्षमता पर नियंत्रण प्राप्त करता है, संभावित रूप से निजी डेटा तक अनधिकृत पहुंच या संशोधन कर सकता है।

यह उदाहरण सुरक्षित पैरामीटर हैंडलिंग की आवश्यकता को और अधिक उजागर करता है, विशेष रूप से API कुंजी प्रबंधन जैसी महत्वपूर्ण सुविधाओं में।

Parameter Parsing: Flask vs. PHP

वेब तकनीकों द्वारा डुप्लिकेट HTTP पैरामीटर को संभालने का तरीका भिन्न होता है, जो HPP हमलों के प्रति उनकी संवेदनशीलता को प्रभावित करता है:

  • Flask: पहले मिले पैरामीटर मान को अपनाता है, जैसे a=1 एक क्वेरी स्ट्रिंग a=1&a=2 में, प्रारंभिक उदाहरण को बाद के डुप्लिकेट्स पर प्राथमिकता देता है।
  • PHP (on Apache HTTP Server): इसके विपरीत, अंतिम पैरामीटर मान को प्राथमिकता देता है, दिए गए उदाहरण में a=2 का चयन करता है। यह व्यवहार अनजाने में HPP शोषण को सुविधाजनक बना सकता है, हमलावर द्वारा हेरफेर किए गए पैरामीटर को मूल पर सम्मानित करते हुए।

Parameter pollution by technology

There results were taken from https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89

PHP 8.3.11 AND Apache 2.4.62

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg

  1. पैरामीटर नाम में %00 के बाद कुछ भी नजरअंदाज करें।
  2. name[] को एरे के रूप में संभालें।
  3. _GET का मतलब GET विधि नहीं है।
  4. अंतिम पैरामीटर को प्राथमिकता दें।

Ruby 3.3.5 and WEBrick 1.8.2

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg

  1. पैरामीटर को विभाजित करने के लिए & और ; सीमांकक का उपयोग करता है।
  2. नाम[] को मान्यता नहीं दी गई।
  3. पहले पैरामीटर को प्राथमिकता दें।

Spring MVC 6.0.23 AND Apache Tomcat 10.1.30

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg

  1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping।
  2. POST RequestMapping & PostMapping नाम[] को मान्यता देते हैं।
  3. यदि name और name[] दोनों मौजूद हैं तो नाम को प्राथमिकता दें।
  4. पैरामीटर को जोड़ें जैसे कि first,last।
  5. POST RequestMapping & PostMapping सामग्री प्रकार के साथ क्वेरी पैरामीटर को मान्यता देते हैं।

NodeJS 20.17.0 AND Express 4.21.0

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg

  1. नाम[] को मान्यता देते हैं।
  2. पैरामीटर को जोड़ें जैसे कि first,last।

GO 1.22.7

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg

  1. नाम[] को मान्यता नहीं दी गई।
  2. पहले पैरामीटर को प्राथमिकता दें।

Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg

  1. नाम[] को मान्यता नहीं दी गई।
  2. पहले पैरामीटर को प्राथमिकता दें।

Python 3.12.6 AND Django 4.2.15

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg

  1. नाम[] को मान्यता नहीं दी गई।
  2. अंतिम पैरामीटर को प्राथमिकता दें।

Python 3.12.6 AND Tornado 6.4.1

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg

  1. नाम[] को मान्यता नहीं दी गई।
  2. अंतिम पैरामीटर को प्राथमिकता दें।

JSON Injection

Duplicate keys

ini
obj = {"test": "user", "test": "admin"}

फ्रंट-एंड पहले उदाहरण पर विश्वास कर सकता है जबकि बैकएंड कुंजी के दूसरे उदाहरण का उपयोग करता है।

कुंजी टकराव: वर्ण संक्षेपण और टिप्पणियाँ

कुछ वर्ण फ्रंटएंड द्वारा सही ढंग से व्याख्यायित नहीं किए जाएंगे लेकिन बैकएंड उन्हें व्याख्यायित करेगा और उन कुंजियों का उपयोग करेगा, यह कुछ प्रतिबंधों को बायपास करने के लिए उपयोगी हो सकता है:

json
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}

ध्यान दें कि इन मामलों में फ्रंट एंड यह सोच सकता है कि test == 1 है और बैकएंड यह सोच सकता है कि test == 2 है।

इसका उपयोग मान प्रतिबंधों को बायपास करने के लिए भी किया जा सकता है जैसे:

json
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}

टिप्पणी संक्षेपण का उपयोग करना

ini
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}

यहाँ हम प्रत्येक पार्सर से सीरियलाइज़र का उपयोग करेंगे ताकि इसके संबंधित आउटपुट को देख सकें।

सीरियलाइज़र 1 (जैसे, GoLang का GoJay लाइब्रेरी) उत्पादन करेगा:

  • description = "Duplicate with comments"
  • test = 2
  • extra = ""

सीरियलाइज़र 2 (जैसे, Java का JSON-iterator लाइब्रेरी) उत्पादन करेगा:

  • description = "Duplicate with comments"
  • extra = "/*"
  • extra2 = "*/"
  • test = 1

वैकल्पिक रूप से, टिप्पणियों का सीधा उपयोग भी प्रभावी हो सकता है:

ini
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}

Java का GSON पुस्तकालय:

json
{ "description": "Comment support", "test": 1, "extra": "a" }

Ruby का simdjson पुस्तकालय:

json
{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }

असंगत प्राथमिकता: डीसिरियलाइजेशन बनाम सीरियलाइजेशन

ini
obj = {"test": 1, "test": 2}

obj["test"] // 1
obj.toString() // {"test": 2}

Float और Integer

संख्या

undefined
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

कई प्रतिनिधित्वों में डिकोड किया जा सकता है, जिसमें:

undefined
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807

जो असंगतियाँ उत्पन्न कर सकता है

संदर्भ

tip

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

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