XSS靶场过关
靶场网址 http://xss.tesla-space.com/
第一关
get传参name值为test,回显有test,直接在URL栏将参数值修改为<script>alert(12345);</script>(在URL栏输入还是在输入框输入都一样,但有细微差别)


过关
第二关
感觉和第一关一样

直接在URL栏输入<script>alert(123);</script>,发现行不通

查看网页源码,发现虽然没要找到xxx的结果那里尖括号在服务器端被转义了,但是输入框那里的尖括号没有被转义。那么我们可以在输入框那里闭合input标签,直接在浏览器URL栏输入"><script>alert(123)</script>


成功过关
第三关
直接查看网页源码,可以看到参数名还是keyword

在URL栏输入<script>alert(123)</script>测试下

没成功
查看源码发现这关两个地方的尖括号都被转义了

那就不用尖括号,输入' autofocus onblur=alert(); aaa='
只要点击页面非输入框的部分,就会调用alert函数

成功过关
但我还有一个未找到原因的问题,为什么输入' autofocus onfocus=alert(); aaa='会一直循环调用alert
第四关
查看源码

输入" autofocus onblur=alert(); aaa="测试下

成功过关,当然也要先点击下非输入框的部分
第五关
查看源码

又变成了双引号
测试下" autofocus onfocus=alert(); aaa="

发现不行,后端把input标签位置的on给替换为了o_n
那再测试下<script>alert();</script>看下过滤了尖括号没有

h2标签处过滤了,但input标签处没过滤,但过滤了script
那直接基于input标签输入"> <a href=javascript:alert();>111</a>,并点击链接

成功过关
第六关
查看源码

先测试下"><script>alert(123);</script><img src=",没能成功,查看下源码

可以看到,h2标签处后端将"、<、>转义为了HTML实体,input标签处没有转义"、<、>,但是将script替换为了scr_ipt,将src转换为了sr_c
但为什么</script>中的script没有替换为scr_ipt呢?说明后端的替换规则为下面两种之一
<script替换为<scr_ipt<script>替换为<scr_ipt>
最终测试发现为第一种

这里利用浏览器的一个特性,DOM树生成过程中对HTML文件中的标签和属性名的大小写不敏感,但后端语言肯定对大小写是敏感的
我们测试下后端在替换时会不会大小写敏感

看来是大小写敏感的
直接"><sCRipt>alert();<script><img src="

成功过关
第七关
查看源码

测试下"><script>alert(123);</script><img src="

看来后端这次是将input标签处的script替换为空字符,那可以通过双写绕过
URL栏输入"><scrscriptipt>alert();</scrscriptipt><img src="

过关
第八关
老样子,查看源码

老样子,测试下"><script>alert(123);</script><img src="

过不了
查看源码,这次后端在input标签将"、<、>转换为HTML实体,而在a标签处只将"转换为HTML实体,把script替换为scr_ipt
基于a标签,用Javascript伪协议和大小写绕过试试,javascrIpt:alert();

看来对大小写做了防范
那试试将script替换为对应的HTML实体

script
如果在输入框输入,payload为javascript:alert();,因为此时浏览器会对payload自动进行URL编码
如果直接在URL栏输入,要在HTML实体编码后再进行一次URL编码

此时payload为
1 | |

过关
第九关
用上一关的payload试试

过不了,显示链接不合法,难道是会检查参数值里有没有javascript?最终查看网站源码,原来是检查有没有http://

那直接在第八关的payload后面加上var a = %26%2334%3Bhttp://%26%2334%3B;
最终的payload如下
1 | |

过关
第十关
查看源码

三个隐藏的输入框,三个参数,那都添加在URL里
在URL栏输入
1 | |

看来t_sort参数会有回显,但是后端将<、>替换为了空字符
那输入" type="text" autofocus oublur=alert(); ccc="

不知为啥这里调用不了alert