diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index f14c8f5f7..cecdd7dc0 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -4,64 +4,65 @@ ## Metodologija -1. Proverite da li se **bilo koja vrednost koju kontrolišete** (_parametri_, _putanja_, _zaglavlja_?, _kolačići_?) **odražava** u HTML-u ili se **koristi** od strane **JS** koda. -2. **Pronađite kontekst** gde se odražava/koristi. -3. Ako je **odraženo** -1. Proverite **koje simbole možete koristiti** i u zavisnosti od toga, pripremite payload: -1. U **sirovom HTML-u**: -1. Možete li kreirati nove HTML tagove? -2. Možete li koristiti događaje ili atribute koji podržavaju `javascript:` protokol? -3. Možete li zaobići zaštite? -4. Da li se HTML sadržaj interpretira od strane bilo kog klijentskog JS engine-a (_AngularJS_, _VueJS_, _Mavo_...), mogli biste zloupotrebiti [**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 zloupotrebiti [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? +1. Proveri da li je **bilo koja vrednost kojom upravljaš** (_parameters_, _path_, _headers_?, _cookies_?) **reflektovana** u HTML-u ili **korišćena** u **JS** kodu. +2. Utvrdi **kontekst** u kome se reflektuje/korišćen je tvoj input. +3. Ako je **reflektovano** +1. Proveri **koje simbole možeš da koristiš** i u zavisnosti od toga, pripremi payload: +1. U **raw HTML**: +1. Možeš li da kreiraš nove HTML tagove? +2. Možeš li da koristiš event-e ili atribute koji podržavaju `javascript:` protokol? +3. Možeš li da zaobiđeš zaštite? +4. Da li HTML sadržaj interpretira neki client side JS engine (_AngularJS_, _VueJS_, _Mavo_...), u tom slučaju možeš zloupotrebiti [**Client Side Template Injection**](../client-side-template-injection-csti.md). +5. Ako ne možeš da kreiraš HTML tagove koji izvršavaju JS kod, možeš li zloupotrebiti [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? 2. Unutar **HTML taga**: -1. Možete li izaći u kontekst sirovog HTML-a? -2. Možete li kreirati nove događaje/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? +1. Možeš li da izađeš u raw HTML kontekst? +2. Možeš li da kreiraš nove event-e/atribute za izvršavanje JS koda? +3. Da li atribut u kome si "zarobljen" podržava izvršavanje JS-a? +4. Možeš li da zaobiđeš zaštite? 3. Unutar **JavaScript koda**: -1. Možete li pobjeći iz ``** oznaka HTML stranice, unutar `.js` datoteke ili unutar atributa koristeći **`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 se odražava između **``** oznaka, čak i ako je vaš unos unutar bilo kakvih navodnika, možete pokušati da injektujete `` i pobegnete iz ovog konteksta. Ovo funkcioniše jer **pregledač prvo analizira HTML oznake** a zatim sadržaj, stoga neće primetiti da je vaša injektovana `` oznaka unutar HTML koda. -- Ako se odražava **unutar JS stringa** i poslednji trik ne funkcioniše, potrebno je da **izađete** iz stringa, **izvršite** svoj kod i **rekonstruišete** JS kod (ako dođe do greške, neće biti izvršen): +- Ako se reflektuje između **``** tagova, čak i ako je vaš unos unutar bilo koje vrste navodnika, možete pokušati da ubacite `` i izađete iz tog konteksta. Ovo funkcioniše jer **pregledač će prvo parsirati HTML tagove** pa zatim sadržaj, dakle, neće primetiti da je vaš ubačeni `` tag unutar HTML koda. +- Ako se reflektuje **unutar JS stringa** i poslednji trik ne radi, moraćete da **izađete** iz stringa, **izvršite** svoj kod i **rekonstruišete** JS kod (ako postoji neka greška, on neće biti izvršen: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- Ako se odražava unutar template literals, možete **ugraditi JS izraze** koristeći `${ ... }` sintaksu: `` var greetings = `Hello, ${alert(1)}` `` -- **Unicode kodiranje** 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 za pisanje **valid javascript code**: ```javascript alert(1) alert(1) @@ -85,8 +86,8 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting se odnosi na mogućnost da **deklarirate funkcije, promenljive ili klase nakon što su korišćene, tako da možete iskoristiti scenarije gde XSS koristi nedeklarisane promenljive ili funkcije.**\ -**Pogledajte sledeću stranicu za više informacija:** +Javascript Hoisting references the opportunity to **declare functions, variables or classes after they are used so you can abuse scenarios where a XSS is using undeclared variables or functions.**\ +**Check the following page for more info:** {{#ref}} @@ -95,19 +96,19 @@ js-hoisting.md ### Javascript Function -Nekoliko web stranica ima krajnje tačke koje **prihvataju kao parametar ime funkcije koja treba da se izvrši**. Uobičajen primer koji se može videti u praksi je nešto poput: `?callback=callbackFunc`. +Several web pages have endpoints that **accept as parameter the name of the function to execute**. A common example to see in the wild is something like: `?callback=callbackFunc`. -Dobar način da saznate da li nešto što je direktno dato od korisnika pokušava da se izvrši je **modifikovanje vrednosti parametra** (na primer na 'Vulnerable') i gledanje u konzoli za greške poput: +A good way to find out if something given directly by the user is trying to be executed is **modifying the param value** (for example to 'Vulnerable') and looking in the console for errors like: ![](<../../images/image (711).png>) -U slučaju da je ranjivo, mogli biste da **pokrenete alert** jednostavno slanjem vrednosti: **`?callback=alert(1)`**. Međutim, veoma je uobičajeno da će ove krajnje tačke **validirati sadržaj** kako bi dozvolile samo slova, brojeve, tačke i donje crte (**`[\w\._]`**). +In case it's vulnerable, you could be able to **trigger an alert** just doing sending the value: **`?callback=alert(1)`**. However, it' very common that this endpoints will **validate the content** to only allow letters, numbers, dots and underscores (**`[\w\._]`**). -Međutim, čak i sa tom ograničenjem, još uvek je moguće izvršiti neke radnje. To je zato što možete koristiti te validne karaktere da **pristupite bilo kojem elementu u DOM-u**: +However, even with that limitation it's still possible to perform some actions. This is because you can use that valid chars to **access any element in the DOM**: ![](<../../images/image (747).png>) -Neke korisne funkcije za ovo: +Some useful functions for this: ``` firstElementChild lastElementChild @@ -115,11 +116,12 @@ nextElementSibiling lastElementSibiling parentElement ``` -Možete takođe pokušati da **pokrenete Javascript funkcije** direktno: `obj.sales.delOrders`. +Možete takođe pokušati da direktno **pokrenete Javascript funkcije**: `obj.sales.delOrders`. -Međutim, obično su krajnje tačke koje izvršavaju navedenu funkciju krajnje tačke bez mnogo zanimljivog DOM-a, **druge stranice u istom poreklu** će imati **zanimljiviji DOM** za izvođenje više akcija. +Međutim, obično su endpointi koji izvršavaju naznačenu funkciju endpointi bez mnogo zanimljivog DOM-a; **other pages in the same origin** obično imaju **zanimljiviji DOM** za izvođenje dodatnih akcija. + +Zbog toga, kako bi se **iskoristila ova ranjivost u drugom DOM-u**, razvijena je eksploatacija **Same Origin Method Execution (SOME)**: -Stoga, kako bi se **zloupotrebila ova ranjivost u različitom DOM-u**, razvijena je **Same Origin Method Execution (SOME)** eksploatacija: {{#ref}} some-same-origin-method-execution.md @@ -127,36 +129,39 @@ some-same-origin-method-execution.md ### DOM -Postoji **JS kod** koji **nebezbedno** koristi neke **podatke koje kontroliše napadač** kao što je `location.href`. Napadač bi mogao da zloupotrebi ovo da izvrši proizvoljan JS kod. +Postoji **JS code** koji **nesigurno** koristi neke **podatke pod kontrolom napadača** kao što je `location.href`. Napadač to može zloupotrebiti da izvrši proizvoljan JS kod. + {{#ref}} dom-xss.md {{#endref}} -### **Univerzalni XSS** +### **Universal XSS** -Ove vrste XSS mogu se naći **svuda**. Ne zavise samo od klijentske eksploatacije web aplikacije, već od **bilo kog** **konteksta**. Ove vrste **proizvoljnog izvršavanja JavaScript-a** mogu čak biti zloupotrebljene za dobijanje **RCE**, **čitanje** **proizvoljnih** **datoteka** na klijentima i serverima, i još mnogo toga.\ +Ovakve vrste XSS mogu se naći **bilo gde**. Ne zavise samo od iskorišćavanja klijenta web aplikacije već od **bilo kog** **konteksta**. Ovakva **arbitrary JavaScript execution** može čak biti zloupotrebljena za dobijanje **RCE**, **čitati** **proizvoljne** **fajlove** na klijentima i serverima, i još mnogo toga.\ Neki **primeri**: + {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} + {{#ref}} ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} -## WAF zaobilaženje kodiranja slike +## WAF bypass encoding image ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) -## Umetanje unutar sirovog HTML-a +## Injecting inside raw HTML -Kada se vaš unos odražava **unutar HTML stranice** ili možete pobjeći i umetnuti 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**.\ +Kada je vaš unos reflektovan **inside the HTML page** ili možete izaći iz konteksta i ubaciti HTML kod u tom kontekstu, **prva** stvar koju treba da uradite je da proverite da li možete zloupotrebiti `<` za kreiranje novih tagova: jednostavno pokušajte da **reflektujete** taj **karakter** i proverite da li se **HTML enkoduje**, briše ili se **reflektuje bez izmena**. **Samo u poslednjem slučaju moći ćete da iskoristite ovu ranjivost**.\ Za ove slučajeve takođe **imajte na umu** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ -_**Napomena: HTML komentar se može zatvoriti koristeći\*\***\***\*`-->`\*\***\***\*ili \*\***`--!>`\*\*_ +_**Napomena: A HTML comment can be closed using\*\***\***\*`-->`\*\***\***\*or \*\***`--!>`\*\*_ -U ovom slučaju i ako se ne koristi crna/bela lista, mogli biste koristiti payload-e kao: +U ovom slučaju i ako se ne koristi black/whitelisting, možete koristiti payloads like: ```html ` tagova ili između HTML događaja koji mogu izvršiti JS kod ili između atributa koji prihvataju `javascript:` protokol. +U tim slučajevima vaš **input** biće **reflektovan unutar JS koda** u `.js` fajlu ili između `` tagova ili između HTML events koji mogu izvršiti JS kod ili između atributa koji prihvataju `javascript:` protokol. -### Izbegavanje \` lako možete **izbeći zatvaranje `` možete lako **escape-ovati zatvaranje ` ``` -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. +Obratite pažnju da u ovom primeru mi **nismo čak ni zatvorili jednostruki navodnik**. To je zato što se **HTML parsiranje prvo vrši u pregledaču**, što podrazumeva identifikaciju elemenata stranice, uključujući blokove skripti. Parsiranje JavaScript-a radi razumevanja i izvršavanja ugrađenih skripti obavlja se tek nakon toga. ### Unutar JS koda -Ako se `<>` sanitizuju, još uvek možete **izbeći string** gde se vaš unos **nalazi** i **izvršiti proizvoljni JS**. Važno je **ispraviti JS sintaksu**, jer ako postoje bilo kakve greške, JS kod neće biti izvršen: +Ako se `<>` sanitizuju, i dalje možete **escape the string** gde je vaš unos **located** i **execute arbitrary JS**. Važno je **fix JS syntax**, jer ako postoje bilo kakve greške, JS code se neće izvršiti: ``` '-alert(document.domain)-' ';alert(document.domain)// \';alert(document.domain)// ``` -### Template literals \`\` +#### JS-in-JS string break → inject → repair pattern -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.\ -Stoga, ako primetite da se vaš unos **reflektuje** unutar JS niza koji koristi backticks, možete zloupotrebiti sintaksu `${ ... }` da izvršite **arbitrarni JS kod**: +Kada korisnički unos dospe unutar navedenog JavaScript string-a (npr. server-side echo u inline script), možete prekinuti string, inject kod i popraviti sintaksu kako bi parsiranje ostalo ispravno. Opšti kostur: +``` +" // end original string +; // safely terminate the statement + // attacker-controlled JS +; a = " // repair and resume expected string/statement +``` +Primer URL obrasca kada se ranjiv parametar reflektuje u JS stringu: +``` +?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 filters blokiraju keywords. + +### Template literals `` + +Da bi se konstruisali **strings**, pored single i double quotes, JS takođe prihvata **backticks** **` `` `**. Ovo je poznato kao template literals jer omogućavaju **embedded JS expressions** koristeći `${ ... }` sintaksu.\ +Dakle, ako otkrijete da je vaš input **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 @@ -506,20 +526,35 @@ return loop } loop`` ``` -### Izvršavanje kodova u kodiranom obliku +### Izvršavanje enkodiranog 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 @@ -740,47 +775,47 @@ top['al\x65rt'](1) top[8680439..toString(30)](1) ``` -## **DOM ranjivosti** +## **DOM vulnerabilities** -Postoji **JS kod** koji koristi **nesigurne podatke koje kontroliše napadač** kao što je `location.href`. Napadač može iskoristiti ovo da izvrši proizvoljan JS kod.\ -**Zbog proširenja objašnjenja o** [**DOM ranjivostima, premešteno je na ovu stranicu**](dom-xss.md)**:** +Postoji **JS code** koji koristi **nebezbedne podatke koje kontroliše napadač** kao što je `location.href`. Napadač može iskoristiti ovo za izvršavanje proizvoljnog JS koda.\ +**Zbog obimnosti objašnjenja** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} -Tamo ćete pronaći detaljno **objašnjenje šta su DOM ranjivosti, kako se izazivaju i kako ih iskoristiti**.\ -Takođe, ne zaboravite da **na kraju pomenutog posta** možete pronaći objašnjenje o [**DOM Clobbering napadima**](dom-xss.md#dom-clobbering). +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 pronaći objašnjenje o [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering). -### Unapređenje Self-XSS +### Upgrading Self-XSS ### Cookie XSS -Ako možete izazvati XSS slanjem payload-a unutar kolačića, to 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 pokrenuti XSS slanjem payload-a unutar cookie-ja, to je obično self-XSS. Međutim, ako pronađete **vulnerable subdomain to XSS**, možete zloupotrebiti ovaj XSS da ubacite cookie za ceo domen i time pokrenete cookie XSS u 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}} -Možete pronaći sjajan primer zloupotrebe ove tehnike u [**ovom blog postu**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). +Možete pronaći odličan primer zloupotrebe ove tehnike u [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). -### Slanje vaše sesije administratoru +### Sending your session to the admin -Možda korisnik može podeliti svoj profil sa administratorom i ako je self XSS unutar profila korisnika, a administrator mu pristupi, on će aktivirati ranjivost. +Moguće je da korisnik podeli svoj profil sa adminom i ako se self XSS nalazi u profilu korisnika i admin mu pristupi, admin će aktivirati ranjivost. -### Odbijanje sesije +### Session Mirroring -Ako pronađete neki self XSS i web stranica ima **odbacivanje sesije za administratore**, na primer, omogućavajući klijentima da traže pomoć, a da bi administrator mogao da vam pomogne, videće ono što vi vidite u svojoj sesiji, ali iz svoje sesije. +Ako pronađete self XSS i web stranica ima **session mirroring for administrators**, na primer omogućavajući klijentima da traže pomoć, admin da bi vam pomogao videće ono što vi vidite u svojoj sesiji ali iz njegove sesije. -Možete naterati **administratora da aktivira vaš self XSS** i ukrade njegove kolačiće/sesiju. +Možete navesti **administrator trigger your self XSS** i ukrasti njegove cookies/session. -## Ostali Bypasses +## Other Bypasses -### Normalizovani Unicode +### Normalised Unicode -Možete proveriti da li se **reflektovane vrednosti** normalizuju u **unicode** na serveru (ili na klijentskoj strani) i zloupotrebiti ovu funkcionalnost da zaobiđete zaštite. [**Pronađite primer ovde**](../unicode-injection/index.html#xss-cross-site-scripting). +Možete proveriti da li su **reflected values** unicode normalized na serveru (ili na klijentskoj 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 @@ -788,18 +823,18 @@ Možete proveriti da li se **reflektovane vrednosti** normalizuju u **unicode** ``` ### Ruby-On-Rails bypass -Zbog **RoR masovne dodeljivanje** navodnici se ubacuju u HTML i tada se zaobilaže ograničenja navodnika, a dodatna polja (onfocus) mogu se dodati unutar taga.\ -Primer forme ([from this report](https://hackerone.com/reports/709336)), ako pošaljete payload: +Zbog **RoR mass assignment** navodnici se ubacuju u HTML i onda je ograničenje navodnika zaobiđeno i dodatna polja (onfocus) mogu se dodati unutar taga.\ +Primer formulara ([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 ``` -Par "Ključ","Vrednost" će biti vraćen ovako: +Par "Key","Value" biće vraćen ovako: ``` {" onfocus=javascript:alert('xss') autofocus a"=>"a"} ``` -Zatim će biti umetnut onfocus atribut i XSS se dešava. +Zatim će atribut onfocus biti umetnut i doći će do XSS. -### Posebne kombinacije +### Specijalne kombinacije ```html