Content Security Policy (CSP) Bypass
Last updated
Last updated
Rejoignez le serveur HackenProof Discord pour communiquer avec des pirates expérimentés et des chasseurs de primes !
Perspectives de piratage Engagez-vous avec du contenu qui explore le frisson et les défis du piratage
Actualités de piratage en temps réel Restez à jour avec le monde du piratage en évolution rapide grâce aux actualités et aux informations en temps réel
Dernières annonces Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme
Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs pirates dès aujourd'hui !
La politique de sécurité du contenu (CSP) est reconnue comme une technologie de navigateur, principalement destinée à protéger contre des attaques telles que le script intersite (XSS). Elle fonctionne en définissant et en détaillant les chemins et les sources à partir desquels les ressources peuvent être chargées en toute sécurité par le navigateur. Ces ressources comprennent une gamme d'éléments tels que des images, des cadres et du JavaScript. Par exemple, une politique peut autoriser le chargement et l'exécution de ressources à partir du même domaine (self), y compris des ressources intégrées et l'exécution de code de chaîne via des fonctions telles que eval
, setTimeout
ou setInterval
.
La mise en œuvre de la CSP est réalisée via des en-têtes de réponse ou en incorporant des éléments meta dans la page HTML. En suivant cette politique, les navigateurs appliquent proactivement ces stipulations et bloquent immédiatement toute violation détectée.
Implémenté via l'en-tête de réponse:
Implémenté via balise meta :
CSP peut être appliqué ou surveillé en utilisant ces en-têtes :
Content-Security-Policy
: Applique le 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 dans des environnements de pré-production.
CSP restreint les origines pour le chargement de contenu actif et passif, contrôlant des aspects tels que l'exécution de JavaScript en ligne et l'utilisation de eval()
. Un exemple de politique est :
script-src: Autorise des sources spécifiques pour JavaScript, y compris des URL, des scripts en ligne et des 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 récupérer des ressources lorsque des directives de récupération spécifiques sont absentes.
child-src: Spécifie les ressources autorisées pour les travailleurs web et le contenu des cadres intégrés.
connect-src: Restreint les URL qui peuvent être chargées en utilisant des interfaces comme fetch, WebSocket, XMLHttpRequest.
frame-src: Restreint les URL pour les cadres.
frame-ancestors: Spécifie quelles sources peuvent intégrer la page actuelle, applicable aux éléments tels que <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 à l'aide de @font-face
.
manifest-src: Définit les sources autorisées des fichiers de manifeste d'application.
media-src: Définit les sources autorisées pour le chargement d'objets multimédias.
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 à l'aide des éléments <base>
.
form-action: Liste les points de terminaison valides pour les soumissions de formulaire.
plugin-types: Restreint les types MIME qu'une 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 auquel 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 tous les moyens (a, form, window.location, window.open, etc.)
*
: 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 exemple, images encodées en Base64).
'none'
: Bloque le chargement depuis n'importe quelle source.
'unsafe-eval'
: Autorise l'utilisation de eval()
et des méthodes similaires, non recommandé pour des raisons de sécurité.
'unsafe-hashes'
: Active des gestionnaires d'événements en ligne spécifiques.
'unsafe-inline'
: Autorise l'utilisation de ressources en ligne comme les <script>
ou <style>
en ligne, non recommandé pour des raisons de sécurité.
'nonce'
: Une liste blanche pour des scripts en ligne spécifiques en utilisant un nonce cryptographique (nombre utilisé une fois).
Si l'exécution JS est limitée, il est possible d'obtenir un nonce utilisé à l'intérieur de la page avec doc.defaultView.top.document.querySelector("[nonce]")
et de le réutiliser pour charger un script malveillant (si strict-dynamic est utilisé, toute source autorisée peut charger de nouvelles sources donc ce n'est pas nécessaire), comme dans :
'sha256-<hash>'
: Liste blanche des scripts avec un hachage sha256 spécifique.
'strict-dynamic'
: Autorise le chargement de scripts depuis n'importe quelle source s'ils ont été listés en tant que nonce ou hachage.
'host'
: Spécifie un hôte spécifique, comme example.com
.
https:
: Restreint les URL à celles qui utilisent HTTPS.
blob:
: Autorise le chargement de ressources à partir d'URL Blob (par exemple, des URL Blob créées via JavaScript).
filesystem:
: Autorise le chargement de ressources à partir du système de fichiers.
'report-sample'
: Inclut un échantillon du code en violation dans le rapport de violation (utile pour le débogage).
'strict-origin'
: Similaire à 'self' mais garantit que le niveau de sécurité du protocole des sources correspond au document (seules les origines sécurisées peuvent charger des ressources à partir d'origines sécurisées).
'strict-origin-when-cross-origin'
: Envoie des URL complètes lors de la réalisation de requêtes de même origine, mais envoie uniquement l'origine lorsque la requête est cross-origin.
'unsafe-allow-redirects'
: Autorise le chargement de ressources qui redirigeront immédiatement vers une autre ressource. Non recommandé car cela affaiblit la sécurité.
Working payload: "/><script>alert(1);</script>
self + 'unsafe-inline' via Iframes
Payload de travail:
Si vous parvenez d'une manière ou d'une autre à faire en sorte qu'un code JS autorisé crée une nouvelle balise script dans le DOM avec votre code JS, car un script autorisé le crée, la nouvelle balise script pourra être exécutée.
Payload de travail:
Il semble que cela ne fonctionne plus
Payloads de travail :
Si vous pouvez télécharger un fichier JS, vous pouvez contourner ce CSP :
Charge utile fonctionnelle :
Cependant, il est très probable que le serveur valide le fichier téléchargé et ne vous permettra d'uploader que des types de fichiers spécifiques.
De plus, même si vous pouviez télécharger un code JS à l'intérieur d'un fichier en utilisant une extension acceptée par le serveur (comme : script.png), cela ne suffirait pas car certains serveurs comme le serveur apache sélectionnent le type MIME du fichier en fonction de l'extension et les navigateurs comme Chrome refuseront d'exécuter du code Javascript à l'intérieur de quelque chose qui devrait être une image. "Heureusement", il y a des erreurs. Par exemple, lors d'un CTF, j'ai appris qu'Apache ne reconnaît pas l'extension .wave, donc il ne la sert pas avec un type MIME comme audio/*.
À partir de là, si vous trouvez une XSS et un téléchargement de fichier, et que vous parvenez à trouver une extension mal interprétée, vous pourriez essayer de télécharger un fichier avec cette extension et le contenu du script. Ou, si le serveur vérifie le format correct du fichier téléchargé, créez un polyglotte (quelques exemples de polyglottes ici).
Si l'injection de JS n'est pas possible, vous pouvez toujours essayer d'exfiltrer par exemple des informations d'identification en injectant une action de formulaire (et peut-être en espérant que les gestionnaires de mots de passe remplissent automatiquement les mots de passe). Vous pouvez trouver un exemple dans ce rapport. De plus, notez que default-src
ne couvre pas les actions de formulaire.
Pour certains des payloads suivants, unsafe-eval
n'est même pas nécessaire.
Chargez une version vulnérable d'Angular et exécutez du JS arbitraire :
Payloads utilisant Angular + une bibliothèque avec des fonctions qui retournent l'objet window
(consultez cet article):
L'article montre que vous pourriez charger toutes les bibliothèques depuis cdn.cloudflare.com
(ou tout autre référentiel de bibliothèques JS autorisé), exécuter toutes les fonctions ajoutées de chaque bibliothèque, et vérifier quelles fonctions de quelles bibliothèques retournent l'objet window
.
Abus du code JS de Google reCAPTCHA
Selon ce compte rendu de CTF, vous pouvez abuser de https://www.google.com/recaptcha/ à l'intérieur d'un CSP pour exécuter du code JS arbitraire en contournant le CSP :
Plus de payloads de cet article:
Abus de www.google.com pour une redirection ouverte
L'URL suivante redirige vers example.com (à partir de ici):
Il est possible d'abuser de Google Apps Script pour recevoir des informations dans une page à l'intérieur de script.google.com. Comme c'est fait dans ce rapport.
Les scénarios comme celui-ci où script-src
est défini sur self
et un domaine particulier qui est autorisé peuvent être contournés en utilisant JSONP. Les points de terminaison JSONP permettent des méthodes de rappel non sécurisées qui permettent à un attaquant d'exécuter une XSS, charge utile de travail:
JSONBee contient des points de terminaison JSONP prêts à l'emploi pour contourner la CSP de différents sites web.
La même vulnérabilité se produira si le point de terminaison de confiance contient une redirection ouverte car si le point de terminaison initial est de confiance, les redirections sont de confiance.
Comme décrit dans le post suivant, il existe de nombreux domaines tiers, qui pourraient être autorisés quelque part dans la CSP, peuvent être utilisés pour soit exfiltrer des données soit exécuter du code JavaScript. Certains de ces tiers sont :
Si vous trouvez l'un des domaines autorisés dans la CSP de votre cible, il est probable que vous puissiez contourner la CSP en vous inscrivant sur le service tiers et, soit exfiltrer des données vers ce service, soit exécuter du code.
Par exemple, si vous trouvez la CSP suivante :
Dans certains cas, il peut être nécessaire de contourner la politique de sécurité du contenu (CSP) pour mener à bien une attaque. Voici quelques techniques courantes pour contourner CSP :
unsafe-inline
Si la CSP autorise unsafe-inline
pour les scripts ou les styles, vous pouvez exécuter du code JavaScript arbitraire en l'injectant directement dans les balises <script>
ou <style>
.
En exploitant les événements autorisés par la CSP, comme onclick
ou onmouseover
, vous pouvez exécuter du code JavaScript en réponse à ces événements.
eval()
Si la CSP autorise l'utilisation de eval()
, vous pouvez exécuter du code JavaScript dynamiquement en utilisant cette fonction.
En utilisant des extensions du navigateur qui ne sont pas soumises à la CSP du site, vous pouvez exécuter du code JavaScript arbitraire.
data:
ou blob:
URLsEn utilisant des URLs data:
ou blob:
, vous pouvez charger du code JavaScript externe sans déclencher la CSP.
Il est important de noter que le contournement de la CSP peut être considéré comme une violation de la politique de sécurité d'un site et peut être illégal. Il est recommandé de toujours obtenir une autorisation explicite avant de tenter de contourner une CSP.
Vous devriez être capable d'exfiltrer des données, de la même manière que cela a toujours été fait avec Google Analytics/Google Tag Manager. Dans ce cas, suivez ces étapes générales :
Créez un compte développeur Facebook ici.
Créez une nouvelle application "Facebook Login" et sélectionnez "Site Web".
Allez dans "Paramètres -> Général" et obtenez votre "ID d'application".
Sur le site cible dont vous souhaitez exfiltrer des données, vous pouvez le faire directement en utilisant le gadget SDK Facebook "fbq" via un "customEvent" et la charge utile de données.