简介:DVWA(Damn Vulnerable Web Application)是一套基于PHP/MySQL的Web安全靶场应用,专为安全爱好者、渗透测试初学者以及安全专业人员设计,可用于在合法环境中测试漏洞利用技巧、练习渗透工具并验证安全防护策略。压缩包内含DVWA完整部署代码,共583个文件,以357个PHP核心文件为主,涵盖漏洞模块与后台逻辑;辅以HTML操作页面、CSS/JS前端样式、TXT安装说明及配置文件等,整体包体约1.29MB,非常适合快速下载并在本地搭建实验环境。目前已有914人学习下载,是Web安全入门广受欢迎的实验资源。通过config.inc.php.dist等配置文件的调整,可完成数据库连接与站点初始化,随后在浏览器中访问即可使用不同安全等级的漏洞靶场,覆盖SQL注入、XSS、命令注入、文件上传等常见Web漏洞,为系统学习和实战演练攻防技术提供了完整的操作载体。 做Web安全这行,DVWA这个名字基本绕不开。不管是刚入门的小白,还是在SRC、CTF里练过几轮的老手,第一套本地漏洞练习环境,大概率都是这个Damn Vulnerable Web Application。拿到的项目是"web网络安全系统搭建代码DVWA.zip",说白了一句话:把一套故意留着各种Web后门和漏洞点位的PHP网站跑起来,然后通过攻击它来理解漏洞原理、练习渗透手法。这篇文章我就围绕DVWA靶场搭建和基础通关来做一次完整复盘,环境选用最常见的Windows + PHPStudy,顺便把Docker方案也放出来备选。适合谁看?网络安全方向的学生、想往Web安全/渗透测试方向转的开发,以及每次挖漏洞之前想先热热手的兄弟们。
1. DVWA 到底是个什么东西
1.1 你搭建的不是一套系统,而是一个"故意漏风"的训练场
DVWA全称是Damn Vulnerable Web Application,中文经常叫"靶场"。它本质上是一个用PHP + MySQL写出来的普通网站,界面长得也像十年前的旧网页,但重点在源码里埋了一大堆当前最常见的Web安全漏洞:SQL注入、XSS跨站脚本、文件上传漏洞、命令注入、CSRF、文件包含等等。每个漏洞页面都配了不同难度的等级,你可以从最基础的Low级别开始,一路看到源码、尝试攻击、搞清楚漏洞是怎么产生的,再对比High和Impossible级别的修复代码,知道防御方到底堵住了哪个环节。
很多人第一次拿到这套代码,会犯一个很常见的错误:以为把它塞到Web目录里能正常打开就算"搭建完成"。其实DVWA的价值不是在"跑起来",而是"跑起来以后你打算怎么炸它"。一个完整的搭建过程,应该包括环境配置、数据库初始化、漏洞等级切换、源码审计,以及至少把SQL注入和反射型XSS这两个经典模块完整打一遍。等这套流程走完了,你才算是真正把DVWA用起来。
1.2 为什么选 DVWA 而不是其他靶场
Web安全学习圈子里不缺靶场,我见过有人在WebGoat和Mutillidae之间反复横跳,最后花了一晚上装环境。DVWA能成为经典,主要还是因为它踩中了几个关键点:
- 部署门槛极低:PHP程序,配个集成环境就能跑,不像Java系靶场还要折腾JDK版本。
- 漏洞模块覆盖经典,和OWASP Top 10高度重合,练完对主流漏洞都有直观认识。
- 每个模块都有可切换的安全等级,同一个漏洞能同时看"残缺代码"和"修复代码"。
- 提供源码查看入口,特别适合一边打补丁一边学原理的路线。
如果拿它和同类工具做对比,大概是这种感觉:
| 靶场 | 语言/环境 | 主要特点 | 适合场景 |
|---|---|---|---|
| DVWA | PHP + MySQL | 经典漏洞全,等级分明,源码可读 | 新手入门、Web安全基础 |
| Pikachu | PHP | 中文界面,漏洞场景贴近国内开发习惯 | 中文学习者、低年级学生 |
| WebGoat | Java | 偏逻辑漏洞和业务安全 | 已入门、想进阶的选手 |
| OWASP Juice Shop | Node.js | 现代Web API漏洞,体量大 | 前端/API安全专项练习 |
我个人给新手的建议很简单:别东挑西选,先把DVWA这套吃透。它足够覆盖第一年的安全学习需求。
2. 搭建前的环境选型与思路拆解
2.1 三种常见部署方式,选哪个最合适
部署DVWA的路径非常多,本质上就是怎么把PHP和MySQL跑起来。我自己常用三种:
第一种是Windows下面的PHPStudy集成环境。下载安装、启动Apache和MySQL、把代码放到网站根目录就行。这种方式最省心,适合纯小白,也是这篇文章的主线。
第二种是Docker容器化部署。如果你电脑里已经装了Docker,一条命令就能把靶场拉起来,环境完全隔离,玩坏了也无所谓。缺点是有时候镜像版本太老,PHP版本还是5.x,或者数据库连接方式跟新版的DVWA对不上,反而要额外修配置。
第三种是手动搭LAMP或LNMP环境。这适合本来就熟悉Linux和Web服务的人,也适合想借搭建过程顺带学一遍服务器配置的进阶玩家。
我建议的学习路线是:先用PHPStudy快速跑起来,别把热情消耗在环境上。等你对DVWA每个漏洞都啃过一遍了,再尝试用Docker去复现一次,经历一下"哦原来换环境还有这么多坑"的过程,这对理解Web服务架构非常有帮助。
2.2 环境版本匹配为什么容易翻车
DVWA这套代码本身不挑食,但它的老版本在PHP 8以上的环境里会冒出各种Notice和Deprecated警告,有些页面甚至会因为函数废弃而白屏。所以这里先给个环境建议:
- PHP版本尽量用7.4,兼容性和稳定性都比较稳。
- MySQL用5.7或者8.0都行,关键是账号密码要记得改。
- Web服务用的是Apache,不要省略这一步直接跑PHP的内置服务器,因为DVWA部分模块依赖Apache的某些特性。
注意:如果下载的DVWA.zip特别老,安装到新版PHP环境下出现"PHP Deprecated"一类的报错,别慌,通常不影响核心功能。但如果你追求页面零告警,推荐直接用GitHub上最新release版本,而不是某个很久没更新的中文压缩包。
3. 基于 DVWA.zip 的完整搭建过程(实操记录)
3.1 解压和放置,这一步决定后面省不省心
拿到"web网络安全系统搭建代码DVWA.zip"后,先把它解压到一个没有中文路径的目录,然后整个文件夹复制到Web根目录。以PHPStudy为例,默认网站根目录是在安装目录下的WWW文件夹,把解压出来的DVWA文件夹完整放进去,同时把文件夹权限检查一遍,保证PHP进程能正常读取。
此时在浏览器地址栏里访问http://127.0.0.1/DVWA,按道理应该能跳到DVWA的首页。但我遇到过好几次,页面能打开,可样式是乱的,点按钮没反应。这种情况基本都是路径配置问题,比如文件夹名字带空格、或者解压多套了一层目录。解决方式很简单:确保你访问的URL路径和实际文件夹名完全一致,大小写也别忽略。
3.2 config.inc.php 配置文件修改,看起来小但全是坑
DVWA的配置修改是整个搭建过程中最容易被卡住的地方。下载包里通常会有一个config/config.inc.php.dist文件,你要做的第一件事是把它复制一份,改成config.inc.php,然后打开编辑。如果没有这个.dist文件,也可以直接看源码里是否已经存在config.inc.php,有的版本默认把示例文件一起打包了。
核心要改的就是数据库连接信息:
$_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = 'p@ssw0rd'; $_DVWA[ 'db_port' ] = '3306';这里的数据库账号密码必须和你本机MySQL里面真实存在的账号一致,尤其注意端口号。PHPStudy里的MySQL如果没有特殊设置,默认端口是3306,这没什么问题。但如果你本地装了多个MySQL,或者3306被占用改成了3307,这里就要同步修改。
另外还有一处容易被忽略,就是$_DVWA[ 'recaptcha_public_key' ]和$_DVWA[ 'recaptcha_private_key' ],这两个是Google验证码的配置,本地学习留空字符串就行,不用去申请,否则在跑"不安全的验证码"这个模块时反而会多一堆麻烦。
3.3 初始化数据库,登录进去才算第一步搞定
配置文件保存好后,访问http://127.0.0.1/DVWA/setup.php,页面会列出所有环境检查项,比如allow_url_include是否开启、display_errors是否开启等。如果全部显示绿色勾,直接点击页面下方的"Create / Reset Database"按钮。这时候DVWA会自动创建数据库、写入预置的漏洞数据。
等看到一条创建成功的提示后,回到首页用默认账号admin和密码password登录。登录后左侧会显示所有漏洞模块,比如SQL Injection、XSS stored、File Upload等等。能点进任何一个模块并且正常显示,说明搭建这一步算是正式完成了。
我在这一步踩过最狠的坑是数据库初始化到最后一步直接报错,页面停留在"数据库已存在"的提示上。后来发现是我之前手动建过dvwa这个库,表结构不完整,进去全是残废状态。解决方式很简单,进MySQL管理工具把dvwa库删掉,再回到setup.php重新创建一次。
3.4 Docker方式,一行命令的另一条路
如果你的机器上已经装好了Docker,又不想被PHPStudy拖累,可以试一下官方镜像。在命令行里执行:
docker run --rm -it -p 80:80 vulnerables/web-dvwa然后浏览器访问http://localhost,就能看到DVWA的登录页。这种方式最干净,用完直接关掉容器就行,不留垃圾环境。这个镜像是外网维护的老镜像,PHP版本比较低,但DVWA本来就是老代码,反而兼容得很好。
注意:Docker方式跑起来之后,如果登录时提示数据库连不上,多半是因为容器内部的MySQL服务启动比Apache慢。等个十几秒再刷新页面,问题通常会自动消失。
4. 走进DVWA:漏洞模块与使用逻辑
4.1 安全等级的四挡开关,别一上来就挑战地狱难度
登录DVWA后,右上角有一个"DVWA Security"选项,里面有四个等级:Low、Medium、High、Impossible。这四个等级不是用来调游戏难度的,而是对应同一个漏洞在不同安全策略下的代码实现。
Low级别基本是不设防的,参数直接拼接进SQL语句,任何过滤都没做。Medium级别会加一点简单的过滤或转义,比如对输入字符串去掉某些关键字。High级别开始引入一些比较规范的防御手段,比如使用预处理语句或严格的输入校验。Impossible级别才是真正安全的写法,它已经彻底改写了代码逻辑,不再接受不安全的数据结构。
我的建议非常明确:从Low开始,每个模块都要做三件事。第一,按页面提示正常提交数据,观察正常效果。第二,尝试构造恶意payload,理解漏洞触发点。第三,查看源代码,对比正常请求和攻击请求在代码层面的区别。三个做完再切到下一级别。
4.2 六大核心漏洞模块逐个拆解
DVWA里至少有十几个模块,最常用的六个,我整理成一个表方便对照:
| 模块 | 漏洞类型 | 经典练习点 |
|---|---|---|
| SQL Injection | SQL注入 | 拼接单引号、绕过登录、联合查询爆数据 |
| Reflected XSS | 反射型XSS | 构造script标签,实现弹窗或窃取Cookie |
| Stored XSS | 存储型XSS | 留言板处注入恶意脚本,观察持久化效果 |
| File Upload | 文件上传 | 伪装扩展名上传WebShell,理解服务端校验缺陷 |
| Command Injection | 命令注入 | 在IP输入框拼接系统命令,验证命令执行 |
| CSRF | 跨站请求伪造 | 构造伪造链接,修改密码或资料 |
以SQL注入模块为例,Low级别下输入1',页面大概率会报错,因为SQL语句直接拼了一个多余的单引号出来。换成1' or '1'='1,又会把表里所有用户都查出来。这种"报错-改payload-出结果"的过程,比读十篇原理文章都管用。
4.3 通关路线建议,按什么顺序打效率最高
很多人登录DVWA之后就开始瞎点,今天试一下SQL注入,明天试一下XSS,结果每个都是半吊子。我走过一遍弯路之后总结出一个顺序:先打SQL注入,因为它能最快建立起"参数与数据库交互"的感觉。然后打反射型XSS,理解前后端数据流。接着是存储型XSS和CSRF,这两个可以连着看,因为它们都需要站在受害者视角去理解攻击链。最后再动手碰文件上传和命令注入,这两个模块涉及系统层面,放在有基础以后再啃。
每一关打完都要直接翻源码。DVWA右下角有个"View Source"按钮,点开就是当前安全等级对应的PHP代码。拿Low级别和High级别的代码并排比对,你会很直观地看到过滤函数、参数绑定、白名单校验这些防御手段是怎么一点点加进来的。这是DVWA最值钱的地方。
5. 常见问题与排查实录
5.1 页面严重报错或者白屏,先别急着重装
如果你访问DVWA首页时看到一堆PHP红色告警,不要把时间浪费在手动改代码上。先检查PHP版本是不是偏高,再检查config.inc.php里数据库参数对不对。新版DVWA官方文档里明确支持到PHP 7.x,如果你装的是PHP 8.0以上,常见的preg_replace()/each()兼容问题就可能冒出来。
我的处理习惯是分三步走:第一步,把php.ini中的display_errors临时打开,看清楚具体报错在哪个文件哪一行。第二步,根据报错的函数名去搜索这个函数是哪个PHP版本废弃的,如果是通知级别直接忽略。第三步,如果页面真的白屏,优先看错误日志,不要凭感觉改代码。
5.2 数据库创建失败,多半是这三个原因
setup.php页面上点"Create / Reset Database"后如果报错,九成是下面三种情况。第一,config.inc.php里的数据库密码和MySQL真实密码不一致。PHPStudy默认MySQL口令是root,但有些人后来改过就忘了。第二,dvwa数据库已经存在,而且结构不完整。这种需要先删库再重建。第三,MySQL服务没启动,或者端口被占用,导致PHP连不上数据库。检查顺序可以固定成:看服务状态、核密码、删库重建,三步走完基本都能解决。
5.3 登录一直进不去,页面反复跳回登录框
这个问题也很经典。DVWA登录成功了,但页面又跳回登录页,几乎都是Session问题。常见原因是php.ini里session.save_path指向了一个无权限的目录,或者浏览器禁用了本地Cookie。还有一种情况是你在访问时用了IP地址,配置里某些Cookie参数绑定到了域名,换成本机回环地址就好。
5.4 靶场对外访问的安全边界,这个必须单独说
本地学习怎么折腾都行,但你要是把DVWA放到公网服务器上,那基本等于把自己家大门焊死又敞开了。DVWA是一套公开的漏洞集合,任何能被扫描到的人都能用现成payload攻进来,而且它还自带WebShell上传功能,后果自行脑补。
再三提醒:DVWA只能在隔离的、本地的、无敏感数据的环境里使用。不要拿它做服务器渗透测试,更不要尝试搭建对外提供访问的"练习平台",这是安全从业者最基本的底线。
6. 刷完DVWA之后的一些个人坚持
DVWA通关以后,我个人建议再回头做一次"红蓝博弈":别切到Impossible级别就结束,而是把每个模块的Impossible源码当成一份最佳实践文档去精读。比如命令注入的Impossible级别,用了白名单校验+参数化调用,这套写法同样可以迁移到你自己的业务代码里。再比如文件上传的High级别,已经做了文件签名校验和重命名,这些逻辑放在真实开发中一样值得抄。
另外还有一个细节很多人没做,就是对比不同安全等级之间,攻击payload的变化。同一个注入点,Medium级别可能只是过滤了某些关键字,但你会发现大写绕过、注释符绕过、编码绕过这些思路全都练出来了。这才是DVWA真正给到你的东西:不是哪条指令能用,而是面对一道过滤规则,你知道该往哪个方向去试。
我到现在还会偶尔把这个靶场翻出来,不是去打漏洞,而是去翻它的源码,看看有没有什么防御写法能借鉴到实际项目里。安全这东西,说到底就是攻防双方在同一个细节上比谁想得更深。DVWA给你的,就是那块永远能让你反复试错、反复深挖的试验田。
本文还有配套的精品资源,点击获取