# XSS (Cross Site Scripting)
## Metodologija
1. Proverite da li se **bilo koja vrednost koju kontrolišete** (_parametri_, _putanja_, _zaglavlja_?, _kolačići_?) **odražava** u HTML-u ili se **koristi** od strane **JS** koda.
2. **Pronađite kontekst** u kojem se odražava/korišćen.
3. Ako je **odraženo**
1. Proverite **koje simbole možete koristiti** i u zavisnosti od toga, pripremite payload:
1. U **sirovom HTML-u**:
1. Možete li kreirati nove HTML tagove?
2. Možete li koristiti događaje ili atribute koji podržavaju `javascript:` protokol?
3. Možete li zaobići zaštite?
4. Da li se HTML sadržaj interpretira od strane bilo kog klijentskog JS engine-a (_AngularJS_, _VueJS_, _Mavo_...), mogli biste zloupotrebiti [**Client Side Template Injection**](../client-side-template-injection-csti.md).
5. Ako ne možete kreirati HTML tagove koji izvršavaju JS kod, možete li zloupotrebiti [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)?
2. Unutar **HTML taga**:
1. Možete li izaći u kontekst sirovog HTML-a?
2. Možete li kreirati nove događaje/atribute za izvršavanje JS koda?
3. Da li atribut u kojem ste zarobljeni podržava izvršavanje JS-a?
4. Možete li zaobići zaštite?
3. Unutar **JavaScript koda**:
1. Možete li pobjeći iz ``** oznaka HTML stranice, unutar `.js` datoteke ili unutar atributa koristeći **`javascript:`** protokol:
- Ako se odražava između **``** oznaka, čak i ako je vaš unos unutar bilo kakvih navodnika, možete pokušati da injektujete `` i pobegnete iz ovog konteksta. Ovo funkcioniše jer **pregledač prvo analizira HTML oznake** a zatim sadržaj, stoga neće primetiti da je vaša injektovana `` oznaka unutar HTML koda.
- Ako se odražava **unutar JS stringa** i poslednji trik ne funkcioniše, potrebno je da **izađete** iz stringa, **izvršite** svoj kod i **rekonstruišete** JS kod (ako dođe do greške, neće biti izvršen):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
- Ako se odražava unutar template literals, možete **ugraditi JS izraze** koristeći `${ ... }` sintaksu: `` var greetings = `Hello, ${alert(1)}` ``
- **Unicode kodiranje** funkcioniše za pisanje **validnog javascript koda**:
```javascript
alert(1)
alert(1)
alert(1)
```
#### Javascript Hoisting
Javascript Hoisting se odnosi na mogućnost da **deklarirate funkcije, promenljive ili klase nakon što su korišćene kako biste mogli da iskoristite scenarije gde XSS koristi nedeklarisane promenljive ili funkcije.**\
**Pogledajte sledeću stranicu za više informacija:**
{{#ref}}
js-hoisting.md
{{#endref}}
### Javascript Funkcija
Nekoliko web stranica ima krajnje tačke koje **prihvataju kao parametar ime funkcije koja treba da se izvrši**. Uobičajen primer koji se može videti u praksi je nešto poput: `?callback=callbackFunc`.
Dobar način da saznate da li nešto što je direktno dato od strane korisnika pokušava da se izvrši je **modifikovanje vrednosti parametra** (na primer na 'Vulnerable') i gledanje u konzoli za greške poput:
.png>)
U slučaju da je ranjivo, mogli biste da **pokrenete alert** jednostavno slanjem vrednosti: **`?callback=alert(1)`**. Međutim, veoma je uobičajeno da će ove krajnje tačke **validirati sadržaj** kako bi dozvolile samo slova, brojeve, tačke i donje crte (**`[\w\._]`**).
Međutim, čak i sa tom ograničenjem, još uvek je moguće izvršiti neke radnje. To je zato što možete koristiti te validne karaktere da **pristupite bilo kojem elementu u DOM-u**:
.png>)
Neke korisne funkcije za ovo:
```
firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement
```
Možete takođe pokušati da **pokrenete Javascript funkcije** direktno: `obj.sales.delOrders`.
Međutim, obično su krajnje tačke koje izvršavaju navedenu funkciju krajnje tačke bez mnogo zanimljivog DOM-a, **druge stranice u istom poreklu** će imati **zanimljiviji DOM** za izvođenje više akcija.
Stoga je, kako bi se **zloupotrebila ova ranjivost u različitom DOM-u**, razvijena **Same Origin Method Execution (SOME)** eksploatacija:
{{#ref}}
some-same-origin-method-execution.md
{{#endref}}
### DOM
Postoji **JS kod** koji **nebezbedno** koristi neke **podatke koje kontroliše napadač** kao što je `location.href`. Napadač bi mogao da zloupotrebi ovo da izvrši proizvoljan JS kod.
{{#ref}}
dom-xss.md
{{#endref}}
### **Univerzalni XSS**
Ove vrste XSS mogu se naći **svuda**. Ne zavise samo od klijentske eksploatacije web aplikacije, već od **bilo kog** **konteksta**. Ove vrste **proizvoljnog izvršavanja JavaScript-a** mogu čak biti zloupotrebljene za dobijanje **RCE**, **čitanje** **proizvoljnih** **datoteka** na klijentima i serverima, i još mnogo toga.\
Neki **primeri**:
{{#ref}}
server-side-xss-dynamic-pdf.md
{{#endref}}
{{#ref}}
../../network-services-pentesting/pentesting-web/electron-desktop-apps/
{{#endref}}
## WAF zaobilaženje kodiranja slike
.jpg>)
## Umetanje unutar sirovog HTML-a
Kada se vaš unos odražava **unutar HTML stranice** ili možete da pobegnete i umetnete HTML kod u ovom kontekstu, **prva** stvar koju treba da uradite je da proverite da li možete da zloupotrebite `<` da kreirate nove oznake: Samo pokušajte da **odrazite** taj **karakter** i proverite da li je **HTML kodiran** ili **izbrisan** ili ako je **odražen bez promena**. **Samo u poslednjem slučaju ćete moći da iskoristite ovaj slučaj**.\
Za ove slučajeve takođe **imajte na umu** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
_**Napomena: HTML komentar se može zatvoriti koristeći\*\*\*\*\*\*** \***\*`-->`\*\*** \***\*ili \*\*\*\*\*\***`--!>`\*\*_
U ovom slučaju i ako se ne koristi crna/bela lista, mogli biste koristiti payload-e kao:
```html