DVWA靶场隐藏玩法:用Docker一键部署+自定义漏洞模块(2024最新版)
还在用老旧的PHPStudy手动配置DVWA靶场吗?每次换台机器都得重新折腾一遍PHP版本、MySQL连接和文件权限,宝贵的练习时间都浪费在了环境搭建上。对于已经有一定基础的安全工程师来说,这种重复劳动不仅低效,更限制了我们对靶场本身的深度探索。今天,我们就来彻底告别传统部署,拥抱一种更现代、更强大也更“好玩”的DVWA打开方式。
我们将基于Docker容器技术,实现DVWA靶场的跨平台一键部署,真正做到“一次构建,处处运行”。但这仅仅是开始,本文的核心在于“隐藏玩法”:我们将深入DVWA的源码结构,教你如何像搭积木一样,为其添加自定义的漏洞场景,比如模拟一个2024年新出现的XXE攻击变种。此外,我们还会探讨如何利用Docker的数据卷实现靶场数据的持久化,让你精心配置的漏洞环境和练习记录不会随着容器的销毁而消失。这套组合拳,不仅能极大提升你的工作效率,更能将DVWA从一个静态的练习工具,转变为你个人专属的、可动态扩展的漏洞研究平台。
1. 告别传统:基于Docker的DVWA现代化部署
传统的DVWA部署严重依赖于本地的Web服务器(如Apache/Nginx)、特定版本的PHP解释器以及MySQL数据库。版本兼容性问题、扩展配置、文件路径设置,每一步都可能成为拦路虎。Docker的出现,完美解决了“在我机器上能跑”的困境。它通过容器化技术,将应用及其所有依赖(包括代码、运行时、系统工具、库)打包在一个标准化的单元中,确保环境的一致性。
1.1 为什么选择Docker化部署?
对于安全研究和练习而言,环境隔离与快速重建是刚需。Docker容器提供了完美的沙箱环境:
- 环境纯净且一致:每个容器都是独立的,避免了与本机其他服务(如已有的MySQL)产生端口或配置冲突。
- 秒级启动与销毁:练习完毕或环境被“玩坏”后,一键删除容器即可获得一个全新的、干净的靶场,无需重装系统或手动清理数据库。
- 跨平台无差异:无论是在Windows、macOS还是Linux上,只要安装了Docker Engine,部署体验和运行结果完全一致。
- 版本管理便捷:可以轻松切换不同版本的DVWA,或者同时运行多个独立的DVWA实例进行对比测试。
提示:使用Docker部署,本质上我们是在运行一个包含了预配置好的Apache、PHP、MySQL和DVWA代码的完整系统镜像,省去了所有手动安装和配置的步骤。
1.2 一键部署实战:从拉取镜像到访问靶场
市面上已有维护良好的DVWA Docker镜像,例如 vulnerables/web-dvwa。我们直接使用Docker命令即可完成部署。
首先,打开你的终端(命令行工具),执行以下命令拉取并运行镜像:
docker run --rm -d -p 80:80 --name dvwa_container vulnerables/web-dvwa
这条命令做了以下几件事:
docker run:创建并运行一个新容器。--rm:指定容器停止后自动删除其文件系统,这对于临时测试非常方便。如果希望持久化,后续我们会介绍其他方法。-d:在后台运行容器(守护进程模式)。-p 80:80:将宿主机的80端口映射到容器的80端口。如果你的80端口已被占用,可以改为-p 8080:80,然后通过http://localhost:8080访问。--name dvwa_container:给容器起一个名字,便于后续管理。vulnerables/web-dvwa:指定使用的镜像名称。
执行成功后,打开浏览器,访问 http://localhost(或你指定的端口)。你应该能看到DVWA的安装引导页面。按照页面提示,点击“Create / Reset Database”按钮,DVWA会自动完成数据库的初始化。
至此,一个功能完整的DVWA靶场已经在你的机器上运行起来了。默认的登录凭证依然是:
- 用户名:
admin - 密码:
password
你可以用此凭证登录,并将安全等级(Security Level)设置为“Low”,开始漏洞练习。整个过程可能只需要一两分钟,相比传统方式,效率提升是颠覆性的。
2. 深入腹地:理解DVWA的Docker镜像内部结构
仅仅会运行容器还不够。要想实现自定义漏洞模块这样的高级玩法,我们必须对容器内部的结构了如指掌。这能帮助我们知道在哪里修改代码,以及如何将我们的修改持久化。
我们可以使用 docker exec 命令进入正在运行的容器内部一探究竟:
docker exec -it dvwa_container /bin/bash
进入容器后,你便处于一个精简的Linux系统(通常是Debian或Alpine)中。DVWA的相关文件通常被放置在 /var/www/html 目录下,这是Apache Web服务器的默认根目录。
让我们查看一下关键目录结构:
root@容器ID:/var/www/html# ls -la
你会看到类似以下的文件和文件夹:
config/:存放配置文件,包括数据库连接的config.inc.php。hackable/:存放可被漏洞利用的文件,如上传点。dvwa/:核心代码目录,包含不同漏洞模块的PHP文件。external/:存放第三方资源。instructions/:漏洞说明文档。phpids/:PHP-IDS相关文件。
注意:在容器内直接修改文件是临时性的。一旦容器被删除,所有修改都会丢失。这就是为什么我们需要在第三步学习如何将本地目录“挂载”到容器中,实现源码的持久化编辑。
理解这个结构至关重要。例如,所有的漏洞挑战页面都位于 dvwa/vulnerabilities/ 目录下,每个子目录(如 sqli/, xss_r/, upload/)对应一种漏洞类型。我们要添加自定义漏洞,就需要在这个目录下创建新的子目录和对应的PHP文件。
3. 核心技巧:实现源码与数据的持久化
默认的 docker run 命令创建的容器,其内部文件系统是临时的。我们需要通过Docker的“数据卷(Volume)”或“绑定挂载(Bind Mount)”功能,将宿主机的目录与容器内的目录关联起来。这样,容器内的文件变更会实时同步到宿主机,即使容器销毁,文件也依然保留。
3.1 使用绑定挂载自定义DVWA源码
假设我们在宿主机上有一个项目目录 ~/my_dvwa,我们希望将本地的 src 子目录挂载到容器的Web根目录,以便随时用我们喜欢的IDE(如VSCode、PyCharm)编辑源码。
首先,在宿主机创建目录并复制原始DVWA文件(可以从GitHub克隆或从运行的容器中复制出来):
# 在宿主机操作
mkdir -p ~/my_dvwa/src
# 从临时容器中复制文件到本地(先运行一个临时容器并复制)
docker run --rm --name dvwa_temp vulnerables/web-dvwa tar -czf - -C /var/www/html . | tar -xzf - -C ~/my_dvwa/src
然后,使用绑定挂载的方式重新运行容器:
docker run --rm -d -p 80:80 \
-v ~/my_dvwa/src:/var/www/html \
--name dvwa_persistent \
vulnerables/web-dvwa
现在,你对 ~/my_dvwa/src 目录下任何文件的修改,都会立刻反映在运行的DVWA靶场中。你可以尽情地修改漏洞代码、添加新页面,而无需每次都要重建镜像。
3.2 数据库数据的持久化存储
除了源码,数据库(MySQL)的数据同样需要持久化。默认情况下,MySQL的数据存储在容器内的 /var/lib/mysql 路径。我们可以为它单独创建一个数据卷。
首先,创建一个命名的Docker数据卷,它由Docker管理,与容器生命周期解耦:
docker volume create dvwa_mysql_data
然后,运行一个包含MySQL数据卷的DVWA容器。由于官方 vulnerables/web-dvwa 镜像使用了集成的服务(可能用了supervisord同时管理Apache和MySQL),直接挂载可能复杂。更常见的做法是使用 docker-compose 来编排多容器应用。下面是一个 docker-compose.yml 文件的示例:
version: '3'
services:
web:
image: vulnerables/web-dvwa
ports:
- "80:80"
volumes:
- ./src:/var/www/html # 挂载源码
depends_on:
- mysql
environment:
- MYSQL_HOST=mysql
- MYSQL_USER=dvwa
- MYSQL_PASSWORD=p@ssw0rd
- MYSQL_DATABASE=dvwa
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dvwa
MYSQL_USER: dvwa
MYSQL_PASSWORD: p@ssw0rd
volumes:
- dvwa_mysql_data:/var/lib/mysql # 使用命名卷持久化MySQL数据
volumes:
dvwa_mysql_data:
external: true # 使用之前创建的卷,或者改为 false 让 compose 自动创建
在这个配置中,MySQL服务的数据被持久化到了 dvwa_mysql_data 卷中。即使删除并重建 mysql 容器,数据也不会丢失。Web容器通过环境变量连接到独立的MySQL容器,并将源码目录挂载到本地 ./src。
在包含 docker-compose.yml 的目录下,运行 docker-compose up -d 即可启动整个栈。这种方式结构清晰,更适合生产级或长期使用的练习环境。
4. 高阶玩法:为DVWA注入自定义漏洞模块
这是本文最精彩的部分。DVWA自带的漏洞类型虽然经典,但可能无法覆盖一些新型或特定场景的漏洞。我们可以通过修改源码,添加自己的漏洞挑战。这里以添加一个“自定义XXE漏洞”模块为例。
目标:在DVWA的漏洞菜单中新增一项“Custom XXE”,实现一个存在XXE(XML External Entity)注入漏洞的简单功能。
4.1 创建漏洞模块文件结构
首先,在你的持久化源码目录(~/my_dvwa/src)中操作:
-
创建漏洞主文件:在
dvwa/vulnerabilities/目录下新建一个文件夹custom_xxe/,并在其中创建index.php。mkdir -p ~/my_dvwa/src/dvwa/vulnerabilities/custom_xxe touch ~/my_dvwa/src/dvwa/vulnerabilities/custom_xxe/index.php -
创建漏洞源码文件:在同一个目录下创建
source.php,这里放置存在漏洞的代码。 -
创建帮助文件:创建
help.php,用于解释漏洞原理和利用方式。
4.2 编写漏洞源代码(source.php)
以下是一个简化的、存在XXE漏洞的PHP代码示例。它接收用户提交的XML数据,并直接使用 simplexml_load_string 解析,未禁用外部实体加载。
<?php
// dvwa/vulnerabilities/custom_xxe/source.php
if( isset( $_POST[ 'xml_data' ] ) ) {
$xml = $_POST[ 'xml_data' ];
// 危险:未禁用外部实体(XXE漏洞所在)
libxml_disable_entity_loader (false);
$data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT);
if ($data) {
$html .= "<pre>解析成功!</pre>";
// 尝试提取‘user’节点内容,用于演示数据提取
if (isset($data->user)) {
$html .= "<p>欢迎用户: <strong>" . htmlspecialchars($data->user) . "</strong></p>";
}
// 尝试提取‘file’实体内容,用于演示文件读取(如果系统允许)
if (isset($data->content)) {
$html .= "<p>文件内容预览: <br/><textarea rows='10' cols='80'>" . htmlspecialchars($data->content) . "</textarea></p>";
}
} else {
$html .= "<pre>XML解析失败。</pre>";
}
}
?>
<h2>自定义XXE测试</h2>
<form name="XXE" action="#" method="POST">
<p>请输入XML数据:</p>
<textarea name="xml_data" cols="80" rows="15"></textarea>
<br />
<input type="submit" value="提交解析" />
</form>
<?php
if( isset( $html ) ) {
echo $html;
}
?>
4.3 编写主页面与帮助页面
index.php 主要负责引入DVWA的页面框架和对应的源码文件。你需要参考其他漏洞模块(如 sqli/index.php)的写法,确保菜单、安全等级控制等功能正常集成。
help.php 则可以详细解释XXE漏洞的原理,并给出利用Payload示例,例如:
<!-- 用于读取系统文件 /etc/passwd 的Payload -->
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY exploit SYSTEM "file:///etc/passwd">
]>
<root>
<user>attacker</user>
<content>&exploit;</content>
</root>
4.4 修改菜单与权限文件
要让新模块出现在DVWA的侧边栏菜单中,需要修改菜单定义文件。通常这个文件位于 dvwa/includes/dvwaPage.inc.php。找到 $menuBlocks 数组,在合适的位置添加你的新模块:
// 在 $menuBlocks 数组中添加,例如放在‘XSS’之后
'custom_xxe' => array(
'title' => 'Custom XXE',
'file' => 'custom_xxe',
),
此外,还需要在 dvwa/includes/dvwaPage.inc.php 的安全等级检查逻辑中,为你的新模块 custom_xxe 添加相应的权限映射,确保其在不同安全等级下可访问(通常模仿其他模块的设置即可)。
完成以上步骤后,重启你的Docker容器(或等待文件同步),刷新DVWA页面。你应该能在左侧漏洞菜单中看到新添加的“Custom XXE”选项。点击进入,就可以开始测试你自己编写的这个XXE漏洞场景了。
通过这种方式,你可以无限扩展DVWA的能力,模拟任何你感兴趣或正在研究的漏洞类型,如新型的SSTI(服务器端模板注入)、反序列化链、JWT篡改等,使其真正成为你个人网络安全攻防演练的“乐高积木”。
1010



被折叠的 条评论
为什么被折叠?



