veilletech.fr
13 nov. Feed du jour
#04 SÉCURITÉ Faille

CSP : form-action 'self' laisse voler les mots de passe

Une CSP stricte n'excuse pas une injection HTML.

Gareth Heyes (PortSwigger) montre qu'une CSP qui bloque tout script laisse quand même une injection HTML voler des identifiants : la directive form-action n'hérite pas de default-src, et même form-action 'self' autorise un formulaire qui se renvoie à la page. Le mot de passe sort dans l'en-tête Referer d'une redirection, que la CSP ne contrôle pas.

3 min de lectureintermédiairevidéo 1:21
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Le mécanisme
  3. Le tester
  4. Ce que ça change
  5. À retenir

Ce qui se passe

Gareth Heyes, chercheur chez PortSwigger, décrit comment une injection HTML vole des identifiants malgré une Content Security Policy qui interdit tout JavaScript. Rafał Wójcicki (AFINE) a publié la même technique de son côté. PortSwigger l'a intégrée à un skill de Burp AT, qui vérifie aussi un second point : si un domaine autorisé pour les scripts héberge un « gadget » connu — un point JSONP à callback contrôlable, une vieille copie d'AngularJS. La base en compte plus de 350, fournis par cspbypass.com.

Le mécanisme

Deux faits suffisent :

Sur une page qui reflète un paramètre sans l'échapper, l'attaquant injecte un faux formulaire de connexion sans attribut action. Il y ajoute une <textarea> qui porte le nom du paramètre vulnérable et contient la seconde charge : une balise meta qui fixe la politique de referrer à unsafe-url, et une meta http-equiv="refresh" vers son serveur.

ServeurattaquantPage vulnérableVictimeServeurattaquantPage vulnérableVictimeLien piégé1Faux formulaire2Identifiants + charge3Charge reflétée en HTML4Referer avec identifiants5
Le mot de passe sort par le Referer, sans qu'aucun script ne tourne

À l'étape 3, le formulaire vise une origine autorisée par 'self'. À l'étape 4, la charge reflétée devient du HTML actif. À l'étape 5, la redirection est une navigation, que la CSP ne filtre pas, et le navigateur envoie l'URL complète — mot de passe compris — dans l'en-tête Referer. Aucune directive n'a été violée.

Le tester

PortSwigger maintient une page vulnérable exprès. Elle renvoie la politique default-src 'none'; form-action 'self'; style-src 'nonce-…' et reflète le paramètre x sans échappement :

TEXT
https://portswigger-labs.net/csp-form-action-test/?x=123

Le délai de la redirection y est fixé à cinq secondes pour qu'on voie l'enchaînement.

Ce que ça change

Source : PortSwigger Research, en anglais. Voir aussi l'article d'AFINE.