XSS闯关小游戏
XSS闯关小游戏
前言:
XSS的介绍:https://blog.csdn.net/weixin_45798017/article/details/105343314
准备:
在线游戏:http://test.xss.tv
自己搭建:
下载phpstudy->下载xss-lab->将xss-lab放到phpstudy目录下的WWW里面
打开phpstudy的apache,浏览器访问:127.0.0.1/xss-lab
注意:xss最好搭建在虚拟机中,因为搭建在本机中无法利用burpsuite抓包
游戏:
level 1
payload:
1 | <script>alert()</script> |
level 2
尝试level 1的方法,不行,F12查看源代码,发现方框里的被“ ”当作字符串了
想办法把value后面的“过滤掉,或者闭合
payload
1 | "><script>alert()</script> |
level 3
同样的直接输入payload执行语句会被当做value的字符串,用”闭合,然后无法执行
查看php中的源代码,显示value最后的是 ‘ 结尾的
1 | <input name=keyword value='".htmlspecialchars($str)."'> //可以从这个看到value值也被实体化,value的值执行了htmlspecialchars($str)函数,它的作用是把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体,所以不能使用尖括号 |
但是htmlspecialchars默认配置是不过滤单引号。只有设置了:quotestyle选项为ENT_QUOTES,才可以;那么可以用单引号闭合并且不能包含<>则
payload
1 | 'onclick=alert()// //是把后面的语句注释了 |
level 4
level 4和level 3原理类似
只是value后面以双引号结束,同时发生了替换函数
将输入的<和>替换过滤了
可以利用和level 3类似的方法
执行payload
1 | "onclick=alert()// |
level 5
查看源码,发现执行了两个替换函数,将script和on都替换了,所以script和onclick还有onmouseover的标签都没法使用。
尝试执行a的标签
payload
1 | "><a href=javascript:alert()>test</a> |
level 6
过滤了script,on,src,data,href,但由于是用str_replace函数来过滤的,所以可以用大小写绕过
payload
1 | "><a Href=javascript:alert()>test</a> |
level 7
很显然,过滤了script,on,src,data,href,尝试通过重叠拼写进行绕过注入
payload
1 | "><a hhrefref=javasscriptcript:alert()>test</a> |
level 8
随便输入数值,F12查看源码,可以看出下面的href友情链接显示的为输入的值,那么直接用javascript的标签
但是,
很显然过滤了script,on,src,data,href还有双引号,尝试利用html编码绕过
payload
1 | javascript:alert() |
level 9
很显然过滤了script,on,src,data,href还有双引号,同时对value的值进行了htmlspecialchars($str)函数的转换,上题相似
同时,多了一个url检测,如果发现没有带http:// 内容则会显示不合法, 那么怎么可以既有它,又不让它执行呢?只需填加个注释,(可选择多行注释和单行注释)包含http://就行了
payload
1 | javascript:alert()//http:// |
level 10
F12查看网页源代码,同时查看php中的源代码
可以看出有三个参数的属性是hidden,同时t_sort是传参的
所以构建payload
1 | ?t_sort=" onclick=alert() type="button" |
level 11
分析源码可得知t_ref字段是http referer的值,根据http_referer 参数想到了HTTP头,那么我们可以在请求头进行XSS注入,这一关很显然注入点在Referer所以可以利用burpsuite抓包修改Referer的值(hackbar没有成功)
修改前:
修改后:
level 12
根据HTTP_USER_AGENT参数还是想到了HTTP请求头中的user-agent,那么,同理可以按照第十一关的方法来做:
这里直接利用hackbar就成功了
payload
1 | " onclick=alert() type="button" |
或者burpsuite抓包修改
level 13
和上面的方法类似,只不过这里变成了cookie了,hackbar没法用,所以用burpsuite
payload和上面的一样
level 14
由于exifviewer现在不支持上传了,这个漏洞是以前该网站存在的一个漏洞,现在也已经无法复现了
level 15
查看源码
注意到了ng-include,ng-include相当于php的include函数,然后src参数被转义了,最终我们
可以include leve1然后再用img标签传xss
payload
1 | url栏最后添加 |
level 16
查看源码
输入的东西经过了大小写的转换并且通过四次的替换检查,分别对script,空格,/,进行了替换,但是有一点很重要,尖括号没有被替换,这给我们留下很大的利用空间。
另外script被替代,我们可以使用img标签,剩下我们就需要考虑如何把空格的影响给去掉,这时候就需要使用url编码来进行绕过了,可以选择%0d
%0a
(表会回车换行)进行绕过,构造出最后的payload
1 | =<img%0dsrc=1%0donclick=alert()> |
level 17
这关做了个寂寞,点击直接进入下一关了
level 18
有两个get类型的参数,可以直接构建payload
1 | %20onmouseover=alert() //%20是空格 |
level 19
查看源码
flash xss,需要对flash的反编译对源码进行分析,这里使用jpexs-decompiler来分析,首先定位getURL函数
然后追踪到sIFR的内容
得知version参数可以传入loc4变量中,即sIFR的内容中,但是getURL只在内容为link时打开,所以分析contentIsLink函数
1 | ?arg01=version&arg02=<a%20href="javascript:alert()">test</a> |
level 20
将xsf04.swf文件分析得知分析得知是zeroclipboard.swf
这一题用到了zeroclipboard xss,具体可以参考这篇文章:
https://www.freebuf.com/sectool/108568.html
国内广泛使用了zeroclipboard.swf,主要的功能是复制内容到剪切板,中间由flash进行中转保证兼容主流浏览器,具体做法就是使这个透明的flash漂浮在复制按钮之上
看一下源码:
使用jpexs反编译(swf反编译工具:https://github.com/jindrapetrik/jpexs-decompiler
)
原因显而易见,Externalinterface.call第二个参数传回来的id没有正确过滤导致xss
构建payload
1 | ?arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height |