CSP Bypass â Medium
De ontwikkelaar begrijpt dat het whitelisten van externe domeinen gevaarlijk is en stapt over op een Nonce-systeem.
1. Predict (Voorspel)â
De CSP-header is aangepast:
Content-Security-Policy: script-src 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA='
Alleen scripts met het exacte wachtwoordje (de nonce) als attribuut mogen draaien:
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA="> console.log("Dit mag!"); </script>
Vraag: Waar heeft de ontwikkelaar bij de implementatie van dit systeem een kritieke fout gemaakt?
Antwoord
"Nonce" staat voor "Number Used ONCE" â het idee is dat de server bij elke paginaweergave een nieuw, willekeurig wachtwoordje genereert. Deze ontwikkelaar heeft de nonce echter hardcoded in de broncode gezet. De nonce verandert nooit. Een hacker leest de broncode, kopieert de vaste nonce en voegt die toe aan zijn XSS-payload.
2. Run (Uitvoeren)â
Start het lab en bekijk het formulier.
Labbeperking: Het inspecteren van HTTP-response headers in een iframe is beperkt. Het lab simuleert de nonce-logica, maar voor het volledig inspecteren van headers heb je een lokale DVWA-installatie nodig.
Probeer <script>alert(1)</script> in te vullen. Observeer dat het geblokkeerd wordt.
3. Investigate (Onderzoeken)â
Open F12 â Elements en zoek in de HTML naar <script nonce=. Noteer de waarde van het nonce-attribuut op de bestaande script-tags van de pagina.
Vraag: Verandert de nonce-waarde als je de pagina ververst (F5)? Wat onthult dit over de beveiliging?
Antwoord
De nonce-waarde blijft gelijk na elke paginaverversing â hij is statisch. Dit betekent dat elke aanvaller die de broncode kan lezen (wat bij een webpagina altijd mogelijk is), de nonce-waarde kent en kan hergebruiken in zijn eigen payload. Een statische nonce biedt geen betere bescherming dan geen nonce.
4. Modify & Make (Aanpassen & Maken)â
Gebruik de gevonden nonce-waarde om een inline script langs de CSP te smokkelen.
Tip
Voeg het nonce-attribuut toe aan je eigen <script>-tag met de nonce-waarde die je in de HTML hebt gevonden.
Antwoord
Vul in:
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1);</script>
De browser controleert de nonce, ziet dat die exact overeenkomt met de waarde in de CSP-header, en staat de uitvoering toe.
5. â Wat moest je zien?â
- Een script zonder de nonce wordt door de browser geblokkeerd.
- Een script met de juiste nonce wordt wÊl uitgevoerd â er verschijnt een pop-up.
- De nonce-waarde in de broncode is gelijk aan de waarde in de CSP-header â ze zijn hardcoded en identiek.
Werkt het niet? Controleer of je de nonce-waarde precies hebt overgetypt, inclusief de = aan het einde.