CSP Bypass

Def et fonctionnement :


https://book.hacktricks.xyz/pentesting-web/content-security-policy-csp-bypass
Content Security Policy (CSP) est une techno sur le snavigateurs qui a pour but de protéger de certaines attaques comme les XSS, Clickjacking, Injections.
Il s'agit d'un header HTTP qui permet de restreindre les ressources qui peuvent être chargées et les URLs qui peuvent être demandées.
Le SCP peut aussi être appliqué avec un meta tag.
Exemples :

Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

Il y a deux types de header :
Un block et un report qui ne block pas mais report seulement.

Exploitation :


Le but est de trouver si des règles non sécurisées peuvent être exploités.
Il est très utile de savoir détecter :
https://bluetriangle.com/blog/how-to-find-out-if-a-site-has-a-content-security-policy-csp-deployed
Pasted image 20240410153005.png

Unsafe-Inline :

Exploitation :


La configuration suivante dispose de failles :

Content-Security-Policy: default-src 'self' 'unsafe-inline';

Unsafe-inline annule quasiment toute l'utilité de CSP, laissant passer la majorité des failles.
Dans le challeng ile faut aller dans le report d'une vulnérabilité qui va ensuite effectuer une action.
Pasted image 20240410144627.png
Après inspection on sait que le CSP est le suivant :
Pasted image 20240410153005.png

connect-src 'none'; font-src 'none'; frame-src 'none'; img-src 'self'; manifest-src 'none'; media-src 'none'; object-src 'none'; script-src 'unsafe-inline'; style-src 'self'; worker-src 'none'; frame-ancestors 'none'; block-all-mixed-content;

On a donc bien unsafe-inline.
On peut donc check les faiblesses de ce CSP :
https://csp-evaluator.withgoogle.com/
Pasted image 20240410153714.png
On peut avoir un tuto pour exploiter ca :
https://www.cobalt.io/blog/csp-and-bypasses
et sur la premiere page on a une url :

http://challenge01.root-me.org:58008/page?user=qqqq

on peut donc utiliser ça pour faire notre bypass :

http://challenge01.root-me.org:58008/page?user=<script>alert(1);</script>

Payload initial qui n'a pas fonctonné
On veut essayer de contourner :

http://challenge01.root-me.org:58008/page?user=<img src=x onerror="alert(111);"/></p>

Cette version en semble fonctionner, on récupère bien une alerte.
On peut améliorer ca en montrant le document de l'alerte :

http://challenge01.root-me.org:58008/page?user=<img src=x onerror="alert(document.documentElement.innerHTML);"/></p>

#TODO