最近在看xss,今天也就来作一下xss-labs经过挑战。找了很久的源码,终于被我给找到了,由于在GitHub上你们也知道那个下载速度,因此,我也就直接转接到本身的码云上去了,在这也贴出来,欢迎你们下载使用。javascript
源码连接请点击:https://gitee.com/ruoli-s/xss-labsphp
安装没啥好说的,直接放进本身搭建好的www
目录下,就能够开始闯关了,xss-labs一共有level 20
,作着看吧。html
(其实以为这些图片才是我真正想作xss challenge的最大缘由)前端
看了半天,原来参数在URL
里放着呢,java
修改参数,页面也随之变更,右键查看源代码,发现有跳转到level 2 的JS
,而咱们传入的参数是几位的,下面就显示payload的长度。git
OK,直接走代码:ssh
<script>alert(/xss/)</script>
咱们直接输入level 1 的 payload
,发现直接输出了,这里应该是作了实体转义。xss
F12
查看前端代码:函数
第一处就是显示在页面上的代码,第二处是咱们输入的代码,这里应该是作了转义,咱们构造payload,使用">
尝试闭合input
标签:测试
"><script>alert(/xss/)</script>
单引号闭合
+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/)
能够看到,在提交以后,没有马上弹出,这里咱们还须要将鼠标移动到文本框,让事件触发。
补充:
咱们仍是同样,使用前面测试过的,先一一过一遍,固然,结果必然是失败的,那么接下来咱们看全端代码:
能够发现源代码对>
和<
进行了过滤,咱们看源代码:
<?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/)
这里也是成功过关。
终于来到了第五关,咱们使用前面的方式都测了一遍,失败无疑,可是发现了一些其余东西:
貌似on
被作了手脚,咱们继续在o
后面输入其余,发现只有on
被替换了,这也就意味着事件
是不能用了。
继续尝试发现<script>
也被进行了替换<scr_ipt>
,
到这里相信你们都想到了,咱们试试大小写混用:
咳咳,在线打脸哈,输出全为小写,看来人家也是作了大小写过滤了。
继续尝试看看可否闭合,咱们输入'
,"
,<
,>
,\
进行尝试,发现只有'
被实体转义。那应该就是可使用"
来构造闭合:
好,该试的都试过了,接下来咱们试试 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>
进行了替换,也作了大小写过滤
。好了,继续下一关,欧里给。
顺利来到第6关,咱们正在徒步前行!!!
咱们直接拿上一关的payload来测试,固然,也不用想,确定是行不通的,直接来看前端代码,哎呦我去,发现了个啥,此次连href
也给过滤了,是个狠人。
咱们也测试一下on
,<script>
等,发现被过滤的明明白白的,且单引号'
也被实体转义,可是咱们也发现了其余的东西,貌似没有多虑大小写哈?
咱们直接撸大小写,使用双引号">
构造闭合:
<ScRipt>alert(/xss/)</scRIpT>
这里也是成功过关。继续,冲冲冲!!!
来到第七关,嗯,这个图不错,很魔性有没有?
废话很少说,先来一波,有木有发现仍是挺管用的?(●'◡'●)。
发现像script
这种关键字被过滤了,难道是双写
?咱们直接使用双引号"
闭合构造payload:
"><scrscriptipt>alert(/xss/)</scrscriptipt>
轻松搞定😁,下一个。
来到第八关,啥也不是。
测试payload,能够看见前面测试过的基本都过滤了,大小写也都卡的死死的,可是咱们发现前端代码中直接构造好了<a>
标签,既然这样,咱们不妨试试编码,看可否绕过:
这里,笔者本身通过测试,html实体编码和hex编码均可以绕过,我就只放hex编码吧,看大多数博客上都是HTML实体编码,不熟悉的能够本身再了解了解。
咱们能够看到,代码转换机制是将script
中的ri
变成了r_i
,因此咱们只编码r
和i
试试:
字母 | 十进制 | hex(十六进制) |
---|---|---|
r | r | r |
i | i | i |
构造payload:
javascript:alert(/xss/)
干得漂亮,下一关。
越看这些图片越喜欢🤭,按照惯例,咱们仍是先捣鼓一番。
我去,什么状况,该试的基本都试了一遍,这代码给的是个啥?咱们输入的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://')
咳咳,这题,,,挺不人道的,下一个,啥也不是。
历经千辛万苦,终于来到了整个挑战的一半,呜呜呜。
噗噗噗,又吐了呀,全部的都试了,为毛又跑到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类型,才能完成弹窗。
持续更新中·····