xss游戏通关笔记

最近在练习xss,感觉这个游戏挺适合新手的,从代码层角度分析更加深刻认识xss的形成,写了一下通关攻略,并附上了xss漏洞使用工具如何去fuzz。代码分享:链接: https://pan.baidu.com/s/12b_E1PtgUH0b93qupJ7IvQ 提取码: 2333

level-1

这个题目发现url中有一个参数name可控,立刻用<script>alert(1);</script>测试测试一下,弹窗成功,在xss中拥有同样弹窗效果的函数不止alert,还有confirm以及prompt

kXHE8A.png

从代码角度去看,可以发现就是直接用GET方式获取参数然后输出到浏览器上面,这是典型的没做过滤。怎么防御?可以加一个转义函数htmlspecialchars把一些html格式的东西编码就可以有效防止了。

kXHmKP.png

level-2

同样的发现url中keyword参数可控,尝试探测一波,但是发现被转义了

kXXbE6.png

猜测应该是使用了我上面所讲的函数,查看一下代码

kXOvmq.png

我们发现只有一处是使用了这个转义函数的,还有一处没有进行过滤,在input标签里面,我们可以尝试去闭合input标签,构造payload:

1
"><script>alert(123);</script>

弹窗成功

kXX6H0.png

level-3

同样先测试一下看看哪里是输入点,哪里是输出点

kXjqLn.png

然后再用最简单的语句<script>alert(123);</script>尝试一下,发现尖括号被转义了,而且刚才利用的点也被转义了

kXvpz4.png

观察一下源码是怎样过滤的,很明显两处都存在过滤函数

kXvKQH.png

但是这个函数有一点就是,默认配置是不过滤单引号的。只有设置了: ENT_QUOTES,才可以转义单引号,所以这关的value值是刚好给了这样的一个机会去闭合。

kXvBmn.png

所以可以构建payload,这次由于弹窗内容在尖括号内,可以使用事件去弹窗,这里介绍几个常用的事件函数,比如onchange, onclick, oninput等等,这里我使用onchange去实现

1
'onchange=alert`123` '

弹窗成功

kXxKhT.png

level-4

同样的方法,先用<script>alert(123);</script>尝试一下,发现标题处是经过了转义,但是在input标签内只是过滤了尖括号,可以怀疑此处是否出现使用黑名单的过滤。

kXxa4K.png

看一下代码,证实一下思路,发现确实如此,但是这里我们仍然可以使用事件去触发弹窗,这样就避免使用了尖括号了。

kXxh8S.png

这里注意一下,跟上一题明显不同,这里需要使用双引号闭合,构造对应的payload,然后使用对应的注释符把后面的双引号给注释掉:

1
" onclick=alert `123` //

level-5

还是原来的测试手段,标题处的输出经过转义没啥利用,但是在input标签内你会发现测试的script标签被变成其他的东西,这就很有可能又是一个替换,再用上一关的payload去试试,你会发现on变成了o_n,相当于加了一个下划线,这就限制了我们使用事件以及标签了。

kjSz7R.png

查看一下源码,果然源码对<script以及on做了过滤。

kjpXPP.png

这里可以使用<a>标签去实现弹窗的调用,这不存在on或者script等关键字,还使用了javascript:alert('xss')去调用了JavaScript的函数。

1
"> <a href="javascript:alert('123')">dian</a> //

后面点击就会产生弹窗了

kjiprD.png

实际上这题还可以大写绕过的。

level-6

同样的,输入<script和on都会被加上下划线,再尝试上面的payload会发现连href都被替换了,这样有可能是黑名单增加了。

kjiAPI.png

观察一下代码可以发现,对于黑名单里面的数量确实增多了,但也不影响,我们可以使用大 小写去实现绕过,可以构造下面的 payload:

1
2
"> <Script>alert('123')</script> //
"><a Href="javascript:alert(123)">dian</a>//

level-7

输入的测试代码会发现里面的关键字被置换为空,这很明显就是直接将某些关键字变成空字符

kjA0oQ.png

看一下代码,可以发现确实是把关键字变成了空字符。

kjAsWn.png

这里就用到一个SQL注入里面经常用到的技巧,双写绕过,构造payload

1
"><scrscriptipt>alert(123);</scrscriptipt>

同样的对on,src,data,href双写也可以实现同样的而效果

level-8

分析一下代码,可以发现,这次的过滤比前面的好几关都要严格,不仅做了过滤,而且还对input标签里面的内容使用htmlspecialchars函数转义了。但是可以发现还有一处调用的字符串里面没有使用这样的函数去进行防护,可以利用这一点下功夫

kxcjsg.png

那么该如何利用呢?这里只是过滤了关键字。但是可以使用HTML编码进行绕过,HTML编码的存在就是让他在代码中和显示中分开, 避免错误。推荐一个编码网站:https://www.qqxiuzi.cn/bianma/zifushiti.php

值得注意的是浏览器如果要把HTML编码解析并且渲染前提必须要这种编码一定要在标签内某个属性里面才行。如:

1
<a href="&#104;&#101;&#108;&#108;&#111;" >click</a>

但是里如果你把href也编码的话,这就无法正常渲染了

1
<a &#104;&#114;&#101;&#102;="&#104;&#101;&#108;&#108;&#111;" >click</a>

所以这里可以参考上一关的payload,利用协议去绕过,利用a标签,修改里面的属性值即可,只是script这个关键字得转义一部分才行,如下

1
javasc&#x72;ipt:alert(123)

kx24UA.png

level-9

从代码角度上看,只是增加了对于url的判断,其实对这一关没有太大影响

kxRVa9.png

为什么这样说?在代码里面没啥影响的部分就是注释了,在某些挖掘漏洞的过程中使用注释往往可以起到意想不到的效果,这里可以在注释里面插入关键字

1
javascri&#x0070;t:alert(1)/*http://x.x.x.x*/

当然如果单单为了弹窗,这样也行

1
javascri&#x0070;t:alert("http://")

level-10

随手测试了弹窗语句,发现被转义了,但是发现了3个隐藏参数,有点蹊跷

kxRIZ4.png

来分析一下源代码,发现keyword参数经过了htmlspecialchars函数的防护而且是以双引号拼接的,所以这里的利用价值很低,但发现另外一个t_sort参数,但是这个参数经过了过了尖括号的过滤,最后输出到其中一个隐藏的input标签内

kxWSdH.png

虽然过滤了尖括号,但可以闭合双引号,使用onclick事件,然后把隐藏的标签用text方式回显出来即可,最后的payload

1
t_sort=" onclick="alert(123)" type="text" ""

level-11

同样的情况明显的输出点被转义,但是存在几个隐藏的input标签,同样的观察一下代码,发现刚才利用的地方全都加上了防护,但是多出的一个标签内直接输出$str33,往回找这个变量来自哪里,发现来自http头,所以思路很明确,伪造http头部信息即可。

kxWwf1.png

抓个包修改里面的HTTP_REFERER参数,payload也是原来的payload,因为这里的输出点的过滤跟上一关一样,也是过滤了尖括号,但无所谓用双引号闭合即可

kz6bOe.png

level-12

同样的,观察代码,发现这题跟上面的题目类似,利用的输出点在$str33这个变量上,只是这一次修改的头部信息不一样了,可以发现这次的头部信息是HTTP_USER_AGENT

kzgbad.png

类似的payload,抓包发包即可

kzRPOO.png

level-13

分析一下源码,发现这一次不是从http头下功夫了,而是从cookie这一点入手了,可以看到代码里面首先对cookie进行一个初始值的设置,然后经过了两次的过滤,最后通过$str33这个变量输出。

kzfmsf.png

因为过滤和输出点没有任何变化,所以利用方式还是上一关的方式,只是输入点变了而已,这次从cookie中的user变量进行输入,同样的payload:" onclick="alert(123)" type="text" ",抓包改包即可

kzhC60.png

level-14

这一关利用了图片exif的属性,经过上传之后可以利用里面的属性去触发xss漏洞,可惜没环境。直接跳到下一关吧

level-15

观察源码,可以发现输出点用函数做了防护,而且比起前面几关多了很多不同点。

kz4u5Q.png

这里包含了angular js的脚本,并且使用了它的相关类:ng-include,百度可知这是一个有文件包含功能的类。

kz4jRs.png

这样的话,思路就出来了,这个页面没利用点,但是利用另外一个存在漏洞的页面不就可以了吗?因为这里使用了函数防护,出现尖括号的东西很有可能会被转义,这里我们选择通过闭合产生xss漏洞的文件进行包含,选择level-2。

1
src='level2.php?keyword=" onclick="alert(123)" "'

弹窗成功

kzomVK.png

level-16

查看第16关的代码,发现输入的东西经过了大小写的转换并且通过四次的替换检查,分别对script,空格,/,进行了替换,但是有一点很重要,尖括号没有被替换,这给我们留下很大的利用空间。

kzoGrt.png

另外script被替代,我们可以使用img标签,剩下我们就需要考虑如何把空格的影响给去掉,这时候就需要使用编码来进行绕过了,可以选择%0d %0a 进行绕过,构造出最后的payload

1
<img%0dsrc=1%0donerror="alert(123)">

成功弹窗

kzoOiD.png

level-17

分析一下代码,发现输出点都进行了防护,对尖括号以及双引号进行了转义,但是不影响我们利用。

kzbrfU.png

<embed>标签定义嵌入的内容,比如插件,所以这里我们可以使用on事件去进行触发,但是首先得用b去闭合前面的等号,构造payload

1
arg02=b onclick=alert(1)

成功弹窗

kzq64f.png

查看输出验证一下思路

kzqBDA.png

level-18

跟上面那一个题目没有啥区别,一样的操作。。

payload:

1
http://127.0.0.1/xss/level18.php?arg01=a&arg02=b%20onmouseout=alert(1)

直接弹窗

kzLZqA.png

看看输出,跟上一关差不多

kzLGrj.png

上面的游戏都是直接看源代码才发觉到哪里有漏洞,那么肯定问题来了,如果不给源码的情况下该怎样去测试呢?因为在现实渗透中我们需要一个个payload测试是很麻烦的

这里我提供一种比较大众一点的fuzz技巧。利用burpsuit自动化xss

首先我们得在burpsuit的Extender模块中下载对应的XSS Validator插件

kzjkxU.png

安装成功后可以发现菜单栏上会多一栏你插件的名字

kzORmj.png

这里我们还需要另外一个东西叫PhantomJs,这是下载地址:http://phantomjs.org/download.html,另外我们需要在xssValidator的github上下载一个小脚本

kzXKgS.png

然后把它放在跟Phantomjs同一级目录下即可,然后利用Phantomjs打开即可,此时开始监听

kzXjKg.png

这里我以小游戏第一关为例,现在就可以使用bp抓包发送至爆破模块,然后选择插件模式,选择我们的插件

kzjQG6.png

然后去到该插件的页面复制它的特征码,加载进去字典中

kzjUII.png

kzjxSK.png

点击attack,攻击成功的话会显示,同时监听也会出现报文的回显

kzvkFI.png

kzvZSf.png

这样去测试就比平常手工测试要便捷多了。


听说,打赏我的人最后都成了大佬。



文章目录
  1. 1. level-1
  2. 2. level-2
  3. 3. level-3
  4. 4. level-4
  5. 5. level-5
  6. 6. level-6
  7. 7. level-7
  8. 8. level-8
  9. 9. level-9
  10. 10. level-10
  11. 11. level-11
  12. 12. level-12
  13. 13. level-13
  14. 14. level-14
  15. 15. level-15
  16. 16. level-16
  17. 17. level-17
  18. 18. level-18