Ga naar hoofdinhoud

CSP Bypass — Impossible

Hoe stel je een CSP-header zó in dat hij écht niet te omzeilen is?

1. Predict (Voorspel)

De server en de frontend zijn in perfecte harmonie. De JSONP endpoints (die flexibele parameters uitspuugden) zijn verwijderd en vervangen door moderne REST (JSON) API's die onmogelijk code kunnen genereren. De CSP is als volgt:

Content-Security-Policy: default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; frame-ancestors 'none';

Vraag: Wat betekent het woordje default-src 'none' en waarom is dit de gouden standaard?

Antwoord

Met default-src 'none' geef je de browser een bikkelhard commando: "Blokkeer werkelijk álles (afbeeldingen, lettertypes, scripts, iframes, audio) wat deze pagina probeert in te laden, tenzij ik daarachter specifiek en expliciet uitzonderingen voor heb gemaakt." Vervolgens opent de beheerder slechts mondjesmaat kleine deurtjes (script-src 'self'). Deze 'Zero Trust' benadering voorkomt lekken waarbij een hacker nét dat ene type bestand misbruikt dat je was vergeten dicht te zetten.

2. Run & Investigate

Start het lab.

Laden...

Probeer elke eerdere CSP bypass aanval. Omdat er geen slordige whitelists zijn, de JSONP-achterdeur dicht is en er geen voorspelbare Nonces gebruikt worden, weigert de browser structureel elke actie.

3. ✓ Wat moest je zien?

Controle
  • Geen enkele eerdere bypass werkt: geen Pastebin-script, geen statische nonce, geen JSONP-callback.
  • In F12 Network -> Headers zie je een strakke CSP met default-src 'none' plus expliciete 'self'-uitzonderingen.
  • In F12 Console verschijnen rode CSP-fouten ("Refused to execute…") bij elke poging tot inline script.

Krijg je tóch iets gehackt? Dan staat het level rechtsboven niet op Impossible.

Wat heb je geleerd?

  • CSP is een tweede verdedigingslinie: CSP lost het probleem van XSS niet op de server op, maar functioneert als een "veiligheidsgordel" in de browser voor het geval de server toch een foutje maakt.
  • Whitelist gevaren: Vertrouw nooit algemene CDN's, cloud-storage of Pastebins in je CSP.
  • Nonces moeten uniek zijn: Een Number Used Once mag nooit vastgeprogrammeerd staan. Genereer een random string in de backend bij elke paginaweergave.
  • JSONP is dood: JSONP is ouderwets en inherent kwetsbaar (het is letterlijk bedoeld om code injectie toe te staan). Gebruik de Fetch API en normale JSON!