☰
Web安全入门实战:用XAMPP搭建DVWA靶场完整指南
2026/10/19 10:24:09 网站建设 项目流程

很多想入门Web安全的朋友,一开始都会遇到同一个问题:理论知识看了不少,但一到实战就不知道从哪儿下手,总不能在公网找个真实站点练手,那既不道德也容易惹上法律问题。我的建议一直是先搭一个本地靶场,而在所有靶场里,DVWA(Damn Vulnerable Web Application)是最适合新手的那个。

DVWA是一个用PHP写的开源Web漏洞靶场,内置了SQL注入、XSS、CSRF、文件上传、命令注入等常见漏洞。它的设计很巧妙,每种漏洞都有多级难度,从最基础的LOW一直升级到几乎无法攻破的IMPOSSIBLE。整套环境可以跑在Windows、Linux或Docker里,搭建成本低,对硬件基本没有要求。这篇文章我会把DVWA在Windows下用XAMPP搭建的完整流程拆开讲,同时也会提一下Docker方式的路线。

不管你是刚接触安全测试的学生、想转行做安全的开发者,还是单纯搞不懂什么叫“任意文件上传漏洞”的程序员,这套靶场搭建下来,配合动手练习,能帮你把很多抽象的概念变成真正能感受到的东西。

1. 为什么说DVWA是渗透入门绕不开的靶场

1.1 这个靶场到底能练什么

DVWA全称是Damn Vulnerable Web Application,直译过来就是“该死的脆弱Web应用”。它故意把自己做得漏洞百出,目的就是让安全学习者有一个合法的、可以随便折腾的实验环境。里面内置了十几个常见漏洞模块,覆盖了Web渗透测试中最核心的攻击面。

实际操作之后你会发现,这些漏洞不是随便摆着好看的,而是每一种都对应真实世界里发生过无数次的攻击手法。比如SQL注入模块,你可以往输入框里输入特殊构造的数据,直接拼接到后台SQL查询语句里,从而绕过登录或者拖出整个数据库的数据。又比如XSS模块,它会把用户输入的“脚本”直接输出到页面,你可以在里面弹窗、窃取Cookie,甚至模拟一次完整的存储型XSS攻击链。

除了这些,DVWA里还有暴力破解、命令注入、CSRF、文件包含、文件上传、不安全的验证码、弱会话ID等模块。这些漏洞类型相互独立,适合按模块一个个刷过去。对新手来说,最难得的是它把“攻击”和“防御”摆在同一个页面上,练完LOW难度再切到HIGH难度,你能直观看到同一段代码加上过滤和防护之后,攻击手法就彻底失效了。

1.2 四种安全等级设计的精妙之处

DVWA最值得夸的设计就是它的安全等级系统。每个漏洞页面右上角都有一个等级选择器,分别对应LOW、MEDIUM、HIGH和IMPOSSIBLE四档。切换等级之后,后端处理代码会完全不同,LOW等级几乎不做任何防护,代码裸奔;MEDIUM会加入简单的过滤,比如对输入做转义;HIGH会引入更严谨的防护机制,比如使用预处理语句、校验Token;到了IMPOSSIBLE,代码会用最安全的写法,比如参数化查询。

这四个等级其实就是在模拟一个Web应用从“完全不设防”到“接近安全”的演进过程。新手第一次练SQL注入时,用LOW等级可以直观看到闭合单引号、拼接语句的原理;练会了以后切到MEDIUM,你会发现原来的 payload 被过滤了,需要想办法绕过;再到HIGH,又得换思路。这种递进关系能帮你形成正确的安全思维:真正的渗透测试不是靠一个万能工具,而是根据目标代码的不同防御级别不断调整思路。

我建议你从LOW开始,把每个漏洞都过一遍,然后再回头切到MEDIUM和HIGH重新打一遍。这个过程比看十本安全入门书都更有效。你很快就能明白什么叫“过滤不充分”“错误处理不当”“逻辑漏洞”,而这些东西光靠背概念是记不牢的。

1.3 三条搭建路线怎么选

DVWA的运行环境其实就是一个标准的Web环境:Apache + MySQL + PHP,也就是常见的LAMP或WAMP。所以搭建方式可以分成三条路线。

第一条是Windows下用XAMPP这类集成环境,下载安装、解压源码、改配置就搞定。这是对新手最友好的方式,也是我这篇文章要重点讲的。XAMPP把Apache、MySQL、PHP打包在一起,装完就能跑,省去了自己配置环境的痛苦。

第二条是用Docker跑现成的镜像,一条命令就能拉起来。这种方式干净、不污染本机环境,而且用完可以直接删掉重来,非常符合靶场的使用习惯。Docker对初学者来说需要先理解镜像、容器、端口映射这些概念,但它以后搭其他靶场也很有用。

第三条是在Linux里手动编译安装PHP、Nginx、MySQL,自己一步一步搭环境。这条路线最折腾,但能让你对Web环境有更深刻的理解。不到万不得已我不太推荐入门阶段直接走这条,因为环境问题很容易劝退新手,而且折腾完环境和漏洞本身没啥关系。

综合来看,如果你只是想尽快开始练漏洞,选XAMPP;如果你以后想系统搭建其他靶场或者做复现实验,直接用Docker更划算。这篇文章我会重点展开XAMPP路线,因为它是容错率最高的一种。

2. 搭建前的准备与环境选择

2.1 Windows下XAMPP装好后要调整的三个点

XAMPP的安装没什么难度,去官网下载对应Windows版本的安装包,一路Next就行。但有几个细节我建议你装完以后立刻处理,不然后面会踩坑。

第一,安装路径不要带中文和空格,也别一股脑装到C盘默认目录。我见过有人装在“D:\开发工具\xampp”这种目录下,结果Apache启动时报错,日志里全是路径乱码。最好就用纯英文路径,比如“D:\xampp”,省心很多。

第二,默认端口冲突。很多人的电脑上80端口已经被占用了,比如装了IIS、Nginx或者某些IDE的内置服务。XAMPP启动Apache时会提示端口被占用,解决办法是修改配置文件里的监听端口。具体操作是打开xampp\apache\conf\httpd.conf,找到“Listen 80”改成“Listen 8080”,然后把ServerName改成“localhost:8080”。后面访问DVWA时就用“http://localhost:8080/dvwa/”了。

第三,PHP版本尽量用8.x。DVWA的官方新版已经适配了PHP 8,但如果你用的是老版本源码配PHP 8,页面顶部会有很多deprecated警告,看着心烦,偶尔还会直接白屏。安装XAMPP 8.2以上版本,配合最新版DVWA源码,是当前最稳的组合。

装完XAMPP以后,打开控制面板,把Apache和MySQL两个服务都启动,确认端口正常监听,这就算环境基础到位了。

2.2 用Docker跑DVWA的路线

Docker这条路线也非常成熟,如果你本机已经装了Docker Desktop,搭建DVWA只是几分钟的事。有一个官方维护的镜像叫vulnerables/web-dvwa,配合一个简单的docker-compose文件就能把完整的Web环境和数据库都跑起来。

这里贴一份我常用的docker-compose配置,保存为docker-compose.yml文件,然后在该目录下执行docker-compose up -d就能完成部署:

version: '3' services: web: image: vulnerables/web-dvwa ports: - "8080:80" environment: - SECURE=0 depends_on: - db db: image: mariadb:10.3 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: dvwa MYSQL_USER: dvwa MYSQL_PASSWORD: p@ssw0rd volumes: - dvwa-data:/var/lib/mysql volumes: dvwa-data:

启动完成后,浏览器访问“http://localhost:8080”,容器里的DVWA会自动初始化数据库。这个方式的优势是:用完以后执行docker-compose down就能清理干净,想要重新练一遍随时可以拉起来,不会给你的系统留一堆服务。

不过要提醒一句,Docker Desktop在Windows上的性能依赖WSL2,如果你的机器配置比较老,可能跑起来会比原生XAMPP慢一些。这也正常,Docker本来就不是追求极致性能的方案,胜在环境隔离和可重复性。

2.3 源码获取与版本选择

DVWA的源码托管在GitHub上,官方仓库地址是dvwa/dvwa。选择源码时有几个细节值得留意。

最省事的方式是直接下载仓库里的ZIP压缩包并解压到Web根目录。如果你装了Git,也可以把仓库clone到本机,以后想更新版本直接git pull就行。这个方式更适合喜欢折腾的人。

版本选择上,我建议直接用官方master分支的最新源码,不要用网上那些几年前的“绿色版”或者“集成版”。DVWA对PHP 8的兼容性一直在修复,旧版源码在PHP 8环境会频繁报错,你会误以为是自己的问题,实际上是版本太老导致的。官方最新版里还包含了更完善的配置向导和部分高难度练习的提示,体验会好很多。

源码解压成功后,把整个目录放到Web根目录下。以XAMPP为例,就是解压到“D:\xampp\htdocs”下,然后把文件夹重命名为dvwa,确保路径看起来像“D:\xampp\htdocs\dvwa”。注意目录名要一致,否则后面复制配置文件时又要重新改。

3. 一步一步把DVWA跑起来

3.1 目录结构和第一步启动

DVWA的源码解压之后,里面有几个比较关键的目录和文件。config目录存放配置文件,含有一个叫config.inc.php.dist的示例文件;hackable目录里是上传文件目录和一些工具脚本;external目录存放一些依赖的第三方库。新手不用关心所有文件是干嘛的,只需要重点搞清楚config、hackable这两个路径的作用。

在XAMPP里启动Apache和MySQL,然后在浏览器里访问“http://localhost:8080/dvwa/”。正常情况下你会看到DVWA的首页,上面有提示缺少配置文件。第一次访问时DVWA会自动检测配置文件是否存在,如果不存在,页面会给你一个“Setup”按钮,点击进入安装引导页。到这里说明基础环境没问题了。

如果你看到的不是这个页面,而是Apache默认的欢迎页或者404,那就说明路径有问题。检查一下你是否把源码放到了htdocs目录下面,以及目录名是否匹配你输入的URL路径。

安装引导页上有两项检查很重要:一是PHP扩展项里的allow_url_fopen和allow_url_include是否开启;二是GD库和MySQL扩展是否正常加载。这些检查项通常在XAMPP默认配置下都是OK的,只有allow_url_include可能需要手动打开。

3.2 修改config.inc.php是第一个关键点

进入安装向导页之后,DVWA会提示你把config文件复制到指定位置。这一步看起来不起眼,但很多人就卡在了这里。

DVWA源码里的config目录下默认只有一个config.inc.php.dist示例文件,你要把它复制一份并重命名为config.inc.php。最简单的办法是用文件管理器复制,然后在文件里修改几个参数。我习惯用VSCode或者Notepad++打开,Windows自带的记事本也行,但注意不要用记事本保存成带BOM的格式。

打开Config文件以后,你需要确认下面这几项内容:

$_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'dvwa'; $_DVWA[ 'db_password' ] = 'p@ssw0rd'; $_DVWA[ 'db_port' ] = '3306';

默认配置连的就是本机MySQL的3306端口,数据库名、用户名、密码都是dvwa,这些值不是随便写的,DVWA数据库初始化脚本会按这个用户名创建账户。如果你的XAMPP MySQL端口改过,比如改成了3307,那这里也要同步改。另外文件里还有一项base_url,如果你用8080端口访问DVWA,要把默认的“http://localhost/”改成“http://localhost:8080/dvwa/”,否则某些页面的跳转链接会出错。

改完保存后,点击引导页上的“Create / Reset Database”按钮。这时候DVWA会尝试连接MySQL,自动创建数据库和表,并插入初始数据。正常情况下会提示“Database has been created”,然后自动跳转到登录页。

3.3 数据库初始化失败怎么办

DVWA的自动初始化成功率不高,尤其是新手最容易在这一步看到报错。常见报错有两种:一种是数据库连接失败,提示“Access denied for user 'dvwa'@'localhost'”;另一种是创建成功了一部分表,但后续步骤卡住不动。

先说连接失败。原因通常是你的MySQL里还没有dvwa这个用户,或者是MySQL只允许本地socket连接,不允许TCP 3306端口连接。解决办法有两个方向,一个是打开XAMPP的phpMyAdmin,用root账户登录,手动创建一个名为dvwa的数据库,并建立一个用户名dvwa、密码p@ssw0rd的MySQL用户,全部权限授予给它;另一个更简单的方式是把config.inc.php里的db_user改成root,db_password改成你自己本地MySQL的root密码。

再说创建表卡住。这种情况多半是之前已经跑过一遍初始化,但中途失败,留下了半套表。解决办法是先把dvwa数据库整个删掉,再让初始化脚本重建。对了,不要直接在config文件里关闭数据库重装模式,最后你会发现反而不容易排查问题。

手动创建数据库的方式虽然多几步,但能让你对Web应用和数据库之间的关系有更直观的理解。比如你可以用phpMyAdmin直接看一下DVWA建表之后的数据内容,很多漏洞模块运行原理在数据表里能一眼看出来。

3.4 目录权限和PHP配置:最容易被忽略的环节

DVWA跑起来之后,有部分模块还需要特殊配置才能完整使用。一个是hackable/uploads目录,DVWA在文件上传漏洞模块中需要往这个目录写入文件。在Windows下,XAMPP运行时一般以当前用户身份写文件,这个目录默认是可写的,但如果你的系统权限设置严格,就可能出现上传后文件无法保存的情况。

更常见的是PHP配置问题。DVWA的“命令注入”模块在HIGH等级下要求PHP开启allow_url_include,否则命令里包含URL时会被PHP直接拒绝。你可以在XAMPP控制面板里点Apache的Config按钮,选择PHP配置文件php.ini,搜索allow_url_include,把Off改成On,然后重启Apache。

需要提醒的是,allow_url_include这种配置本身就是不安全配置,真在生产环境里极少有人打开。DVWA故意要在这种环境下练习,确保你理解漏洞成因的同时,也要清楚什么配置在真实环境里不能乱开。练完DVWA以后,建议把这个配置改回去,养成好习惯。

如果你用的是Docker版本,这些PHP配置大多已经在镜像里预置好了,倒是省了不少事。

3.5 登录并切换练习等级

数据库初始化成功后,浏览器会自动跳转到登录页。DVWA的初始登录账号和密码都是admin和password。登录成功后,你可以在页面的“DVWA Security”菜单里调整安全等级。

建议初学者从LOW开始,但也可以顺便看一眼四个不同等级对应的代码差异。DVWA每个漏洞模块页面里都有一个“View Source”按钮,点开能看到当前安全等级下后端PHP核心代码。一边操作攻击一边对照代码,是这套靶场学习效率最高的使用方式,千万别只把它当攻击练习工具。因为切换等级之后,同一个输入框的过滤逻辑、数据库查询写法完全不一样,不对比代码就体会不到防御手段的演进。

此外,DVWA还提供了“Logout”功能,切换等级后你需要重新登录,每次登录系统会重新生成随机的Session ID。这个细节本身就是一个关于会话管理的教学点。

4. DVWA搭建高频报错与排查实录

4.1 打不开或404:路径和端口的问题

搭建DVWA过程中,我被问得最多的就是“为什么我访问http://localhost/dvwa/ 出404”。这类问题大概率是路径没对上。

从报错现象区分:如果页面显示的是Apache欢迎页或者目录列表,说明源码没被正确识别。最常见原因是你把源码目录解压成了dvwa-master或者里面还套了一层目录。如果主机根目录有多个子目录,Apache会把它们列出来,你需要确认访问的路径和源码所在目录名完全一致。

如果显示的是404 Not Found,说明Web服务器已经运行,但没找到对应资源。这时检查Apache的错误日志,日志位置在“xampp\apache\logs\error.log”,里面会告诉你具体是哪个文件找不到。八成的情况是路径大小写不对,或者源码压根不在htdocs下面。

还有一种是端口问题。如果你改了Apache监听端口,却还在用80端口访问,那必然是连接被拒绝。记住你改了Listen端口后,所有访问URL都要带上端口号。

4.2 页面能开但白屏:瞪一眼php.ini就能搞定

白屏是DVWA搭建里最让人头大的问题,因为没有报错信息。仔细看浏览器地址栏,URL没变化但页面一片空白,实际就是PHP解析出错但错误被屏蔽了。

第一步,打开php.ini,找到display_errors参数,把Off临时改成On,保存后重启Apache。这样再刷新页面就能看到PHP抛出的具体错误信息。绝大多数白屏是因为PHP版本太高导致的代码弃用警告,或者某个扩展没有安装。如果你按提示把missing extension对应的扩展打开,问题就解决了。

最常见的缺失扩展是php_openssl、php_mysqli、php_gd。在php.ini里搜索extension=mysqli,去掉前面的分号注释就行。你要是用XAMPP 8.x,默认这些扩展大多已经启用,不过还是有少数版本需要手动确认。

另外一个解决白屏的思路是查看Apache的错误日志,白屏时错误日志里一定有信息,比你在浏览器里猜更高效。

4.3 数据库一直初始化失败:手动SQL建库兜底

数据库初始化是DVWA搭建翻车率最高的环节之一。如果你按我前面说的改了config文件,还是提示连接失败,或者按钮点了没反应,我建议干脆直接手动建库。

打开phpMyAdmin,以root身份登录,新建一个名为dvwa的数据库,字符集选择utf8mb4_general_ci。然后切换到SQL标签页,执行DVWA源码根目录下的database.sql文件。这个文件里有创建数据表的所有SQL语句,包括users表等核心表。执行成功后,再手动创建一个叫dvwa的数据库用户,密码设为p@ssw0rd,给它赋上对dvwa数据库的完全权限。

之后再把config.inc.php里的数据库用户名和密码改回默认,刷新DVWA安装引导页,点击创建数据库按钮,这次会提示数据库已经存在,并正常完成后续初始化流程。

手动建库这一步虽然绕了一下,但特别适合新手理解什么叫“Web应用初始化数据库”——其实本质就是连接MySQL、执行建表SQL、插入数据,跟你手动在phpMyAdmin里做的事是一样的。

4.4 DVWA搭建问题速查表

现象可能原因快速解决方案
Apache启动失败80端口被占用修改httpd.conf监听端口为8080
访问页面404源码目录名或路径不对确认htdocs下目录名为dvwa
页面白屏无内容PHP扩展缺失或错误被屏蔽开启display_errors,按报错启用扩展
数据库连接失败用户不存在或密码不对手动在phpMyAdmin创建用户或改用root
初始化按钮无响应数据库已有半套残留表删除dvwa数据库重新初始化
文件上传不成功hackable/uploads目录不可写检查目录权限,开启写入权限
命令注入模块不工作allow_url_include未开启修改php.ini并重启Apache
登录后无法跳转base_url配置未改修改config.inc.php里的base_url

这张表基本覆盖了我自己搭建过程中遇到的所有问题,很多报错在网上搜也就一句话的事,但真正动手操作时,还是要有清晰的排查顺序。我的习惯是先看Apache错误日志,再看PHP错误信息,最后才去改数据库。现在我也建议你按这个顺序来。

5. 练完之后的一点真实体会

5.1 我建议的DVWA练习顺序

DVWA搭建好之后,真正的价值才刚刚开始。很多新手一上来就直奔SQL注入,其实我建议你可以先按这个顺序刷:先是暴力破解、XSS、SQL注入这种基础的、对代码理解要求低的模块;练到能独立写payload了,再去碰CSRF、命令注入和文件包含;最后才挑战文件上传和那些依赖复杂逻辑的漏洞。

原因是暴力破解和XSS能让你最快建立起“输入点—攻击载荷—执行效果”的直觉。SQL注入则需要你对SQL语法和数据库结构有一定了解,上手会慢一点。而文件上传、CSRF这些漏洞,往往还牵扯到前后端配合、服务端配置,初学容易一头雾水。按这个顺序打下来,你的挫败感会低很多。

每过完一个模块,我强烈建议你点开View Source,把当前等级的后端代码完整读一遍。在很多情况下你会发现,攻击之所以能成功,是因为服务端缺少了某个本来很简单的检查;切换到HIGH等级后,代码里多了几个函数,攻击就被拦住了。这种“攻击—防御”对照着看的学习方式,比单纯刷题更能训练你的代码审计能力。

5.2 新手期最容易犯的三个习惯错误

第一是盲目复制网上payload,复制过来发现打不成功就怀疑环境坏了。其实大部分devWA里的练习模块不存在“环境坏了”这种问题,打不成功更多是payload写错了。DVWA每个模块的难度等级不一样,同一个注入点在LOW和MEDIUM下需要的payload写法完全不同,复制之前先看当前等级。

第二是想跳过基础直接学“内网渗透”“横向移动”这些概念。DVWA覆盖的是OWASP Top 10里最核心的Web漏洞,这些是地基。地基没打牢,去学那些花活纯粹是浪费时间。

第三是练完之后不在本地复盘。DVWA自带“Reset Database”的能力,练完一个模块以后,可以把数据库恢复初始状态,隔几天重新打一遍,看自己还记得多少。第一次打通和第二次独立打通的体验差距非常大,第二次才是真正掌握了。

我个人在实际操作中的体会是,DVWA这套靶场的最大价值不在于它有多强的攻击效果,而在于它把所有典型的漏洞都剥开了放在你面前,让你在合法、受控的环境里反复练习和试错。搭建它用不了多少时间,但把这个环境用好吃透,能给你的Web安全学习省下大量盲目摸索的时间。如果你在搭建过程中遇到文章里没写到的报错,不妨先按流程检查错误日志,理清服务、数据库、代码之间是谁的问题再动手。祝你能把每个漏洞都练熟,形成自己的安全判断力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询