
简介DVWADamn 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高度重合练完对主流漏洞都有直观认识。每个模块都有可切换的安全等级同一个漏洞能同时看残缺代码和修复代码。提供源码查看入口特别适合一边打补丁一边学原理的路线。如果拿它和同类工具做对比大概是这种感觉靶场语言/环境主要特点适合场景DVWAPHP MySQL经典漏洞全等级分明源码可读新手入门、Web安全基础PikachuPHP中文界面漏洞场景贴近国内开发习惯中文学习者、低年级学生WebGoatJava偏逻辑漏洞和业务安全已入门、想进阶的选手OWASP Juice ShopNode.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 ] pssw0rd; $_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 InjectionSQL注入拼接单引号、绕过登录、联合查询爆数据Reflected XSS反射型XSS构造script标签实现弹窗或窃取CookieStored XSS存储型XSS留言板处注入恶意脚本观察持久化效果File Upload文件上传伪装扩展名上传WebShell理解服务端校验缺陷Command Injection命令注入在IP输入框拼接系统命令验证命令执行CSRF跨站请求伪造构造伪造链接修改密码或资料以SQL注入模块为例Low级别下输入1页面大概率会报错因为SQL语句直接拼了一个多余的单引号出来。换成1 or 11又会把表里所有用户都查出来。这种报错-改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给你的就是那块永远能让你反复试错、反复深挖的试验田。本文还有配套的精品资源点击获取