XSS-labs通关挑战(xss challenge)
0x00 xss-labs
最近在看xss,今天也就来做一下xss-labs通过挑战。找了好久的源码,终于被我给找到了,因为在GitHub上大家也知道那个下载速度,所以,我也就直接转接到自己的码云上去了,在这也贴出来,欢迎大家下载使用。
源码链接请点击:https://gitee.com/ruoli-s/xss-labs
安装没啥好说的,直接放进自己搭建好的www
目录下,就可以开始闯关了,xss-labs一共有level 20
,做着看吧。
(其实觉得这些图片才是我真正想做xss challenge的最大原因
)

0x01 Level 1 无过滤机制

看了半天,原来参数在URL
里放着呢,

修改参数,页面也随之变动,右键查看源代码,发现有跳转到level 2 的JS
,而我们传入的参数是几位的,下面就显示payload的长度。

OK,直接走代码:
<script>alert(/xss/)</script>

0x02 Leval 2 闭合标签

我们直接输入level 1 的 payload
,发现直接输出了,这里应该是做了实体转义。

F12
查看前端代码:

第一处就是显示在页面上的代码,第二处是我们输入的代码,这里应该是做了转义,我们构造payload,使用">
尝试闭合input
标签:
"><script>alert(/xss/)</script>

0x03 Leval 3 单引号闭合
+htmlspecialchar()
函数

来到Leval 3,我们还是先使用上两关测试的payload来验证:

发现全部被实体转义了,我们去看源代码:
<?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>";
?>
咳咳,发现对双引号“
做了限制,但是却放行了单引号'
,而且居然在value这里也加了htmlspecialchars
函数,这种情况我们可以通过事件标签
触发表单执行。这里开始构造payload:
'onmouseover='alert(/xss/)

可以看到,在提交之后,没有立刻弹出,这里我们还需要将鼠标移动到文本框,让事件触发。

补充:
htmlspecialchars函数
html事件属性
0x04 Leval 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()
对尖括号
进行了过滤,而且对单引号'
做了防御,所以,我们直接模仿上一题,使用HTML事件,构造payload:
"onmouseover="alert(/xss/)

这里也是成功过关。
0x05 Leval 5 javascript伪协议

终于来到了第五关,我们使用前面的方式都测了一遍,失败无疑,但是发现了一些其他东西:

貌似on
被做了手脚,我们继续在o
后面输入其他,发现只有on
被替换了,这也就意味着事件
是不能用了。

继续尝试发现<script>
也被进行了替换<scr_ipt>
,

到这里相信大家都想到了,我们试试大小写混用:

咳咳,在线打脸哈,输出全为小写,看来人家也是做了大小写过滤了。

继续尝试看看能否闭合,我们输入'
,"
,<
,>
,\
进行尝试,发现只有'
被实体转义。那应该就是可以使用"
来构造闭合:

好,该试的都试过了,接下来我们试试 javascript 的伪协议
:
要看javascript伪协议的请点这里
"><a href=javascript:alert(/xss/)>


最后,我们也是成功的过关了,当然,还是看一下源码比较踏实:
<?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>';
?>
也确实如我们猜的一致,分别对on
和<script>
进行了替换,也做了大小写过滤
。好了,继续下一关,欧里给。
0x06 Leval 6 大小写绕过
顺利来到第6关,我们正在徒步前行!!!

我们直接拿上一关的payload来测试,当然,也不用想,肯定是行不通的,直接来看前端代码,哎呦我去,发现了个啥,这次连href
也给过滤了,是个狠人。

我们也测试一下on
,<script>
等,发现被过滤的明明白白的,且单引号'
也被实体转义,但是我们也发现了其他的东西,貌似没有多虑大小写哈?

我们直接撸大小写,使用双引号">
构造闭合:
<ScRipt>alert(/xss/)</scRIpT>

这里也是成功过关。继续,冲冲冲!!!
0x07 Leval 7 双写绕过
来到第七关,嗯,这个图不错,很魔性有没有?

废话不多说,先来一波,有木有发现还是挺管用的?(●'?'●)。

发现像script
这种关键字被过滤了,难道是双写
?我们直接使用双引号"
闭合构造payload:
"><scrscriptipt>alert(/xss/)</scrscriptipt>

轻松搞定??,下一个。
0x08 Leval 8 编码绕过
来到第八关,啥也不是。

测试payload,可以看见前面测试过的基本都过滤了,大小写也都卡的死死的,但是我们发现前端代码中直接构造好了<a>
标签,既然这样,我们不妨试试编码,看能否绕过:

这里,笔者自己经过测试,html实体编码和hex编码都可以绕过,我就只放hex编码吧,看大多数博客上都是HTML实体编码,不熟悉的可以自己再了解了解。
我们可以看到,代码转换机制是将script
中的ri
变成了r_i
,所以我们只编码r
和i
试试:
字母 |
十进制 |
hex(十六进制) |
r |
r |
r |
i |
i |
i |
编码链接请点这里
构造payload:
javascript:alert(/xss/)

干得漂亮,下一关。
0x09 Leval 9 检测关键字
越看这些图片越喜欢??,按照惯例,我们还是先捣鼓一番。

我去,什么情况,该试的基本都试了一遍,这代码给的是个啥?我们输入的payload呢??


不行,待老衲去查看源代码:
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','"',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
牛逼了,牛逼上天了,除了以前做过的所有过滤,竟然还加了个strpos函数
,谁都不服就服你,这函数的意思是咱们输入的字符串里面必须要有http://
字符,我,吐了呀,这谁能想的到:
想要更多了解strpos函数的请点这里
看到这里并没有对编码进行过滤,所以我们还是延用上题的payload:
javascript:alert('xsshttp://')

咳咳,这题,,,挺不人道的,下一个,啥也不是。
0x10 Leval 10 隐藏信息
历经千辛万苦,终于来到了整个挑战的一半,呜呜呜。

噗噗噗,又吐了呀,所有的都试了,为毛又跑到URL链接上去了?看代码神马都没得呀,但是冒出了个表单是啥?还在页面没有显示?

没办法,去看源码吧,哎,心碎了??
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
发现没有?感情keyword
参数只是一个迷惑而已呀,真正起作用的是t_sort
参数,但是有一个问题,它的type
类型是hidden
,我们得在前端改为text
类型,让其显现出来,且后台只对<>
做了过滤,我们可以用事件来构造:
"onmouseover="alert(/xss/)


注意:一定要在前端修改2次
type类型,才能完成弹窗。
0x11 Leval 11
持续更新中·····