我的 DVWA 靶场搭建与第一次实战记录
作为一名刚入门的网安学习者,我决定搭建一个自己的练习靶场来学习 Web 漏洞。经过一番摸索,我成功搭建了 DVWA(Damn Vulnerable Web Application)靶场,并完成了第一次漏洞实战。这篇文章记录了我的完整过程,包括遇到的问题和解决方法。
⚠️ 重要提醒:DVWA 是一个故意设计存在漏洞的 Web 应用,仅供学习和测试使用。所有操作只能在本地环境进行,严禁用于攻击他人系统。
一、准备工作
我的环境
- 操作系统:Windows 10
- 集成环境:PhpStudy Pro
- 浏览器:Microsoft Edge
- 访问地址:
http://dvwa:8898/
二、搭建过程
第一步:安装 PhpStudy
PhpStudy 是一个集成了 Apache、MySQL、PHP 的软件,不用单独配置这些组件,特别适合新手。
- 从官网下载:https://www.xp.cn/
- 双击安装包,选择安装路径 (尽量选择全英文)
- 安装完成后打开软件
- 点击主界面的「 启动」按钮
- 确认 Apache 和 MySQL 都显示绿色(表示运行中)
第二步:下载 DVWA 并放到指定位置
从百度网盘下载 DVWA 压缩包
- 链接:https://pan.baidu.com/s/19o7MKIY45znqCstHl-RUNg
- 提取码:
6666
解压后,把文件夹重命名为
dvwa(去掉-master后缀)把
dvwa文件夹复制到 PhpStudy 的WWW目录- 我的路径是:
D:\phpStudy\WWW\dvwa
- 我的路径是:
第三步:配置 DVWA 的数据库信息
这一步容易出错,要仔细操作。
- 进入
dvwa/config文件夹 - 找到
config.inc.php.dist文件,复制一份 - 用记事本打开复制的文件
- 找到数据库配置部分,修改密码:
$_DVWA['db_user']='dvwa';$_DVWA['db_password']='dvwa123';// 至少6位!$_DVWA['db_database']='dvwa';- 保存后,把文件名改为
config.inc.php(删掉.dist)
为什么密码要至少 6 位?因为 PhpStudy 有安全检查,少于 6 位会报错。
第四步:在 PhpStudy 中创建数据库
打开 PhpStudy,点左侧的「数据库」
点「创建数据库」
填写信息(要和配置文件一致):
- 数据库名:
dvwa - 用户名:
dvwa - 密码:
dvwa123
- 数据库名:
点确认
密码长度不能少于6位
第五步:创建网站(关键步骤)
在 PhpStudy 点左侧的「网站」
点「创建网站」
填写:
- 域名:
dvwa - 端口:
8898 - 根目录:
D:/phpstudy_pro/WWW
- 域名:
点确认
注意:根目录填WWW,不是WWW/dvwa。这样配置后,通过http://dvwa:8898/就能访问了。
第六步:修改 PHP 配置
DVWA 的某些功能需要开启特定的 PHP 设置。
- 在 PhpStudy 中找到
php.ini文件(可以通过软件界面直接打开) - 按
Ctrl+F搜索allow_url_include - 把这两项改为
On:
allow_url_include = On allow_url_fopen = On- 保存后,重启 Apache 服务
第七步:访问 DVWA(我遇到了 403 错误)
第一次尝试失败
我按照网上教程,输入http://localhost:8898/dvwa/dvwa/,结果显示403 Forbidden。
解决方法
后来发现,要用在 PhpStudy 中设置的域名访问:
http://dvwa:8898/这样就成功了!页面显示出 DVWA 的设置界面。
原因分析:PhpStudy 创建网站时配置了虚拟主机,使用域名dvwa才能正确匹配。
第八步:配置验证码密钥
- 打开
dvwa/config/config.inc.php - 找到
recaptcha相关的两行 - 替换为:
$_DVWA['recaptcha_public_key']='6LdK7xITAAzzAAJQTfL7fu6I-0aPl8KHHieAT_yJg';$_DVWA['recaptcha_private_key']='6LdK7xITAzzAAL_uw9YXVUOPoIHPZLfw2K1n5NVQ';- 保存并刷新浏览器
第九步:初始化数据库
- 访问
http://dvwa:8898/ - 滚动到页面底部
- 检查所有配置项是否都是绿色的 ✓
- 点击**「Create / Reset Database」**按钮
- 等待创建完成,会自动跳转到登录页
如果按钮是灰色:说明 PHP 配置没生效,回到第六步重新检查。
第十步:登录并设置安全等级
使用默认账号登录:
- 用户名:
admin - 密码:
password
- 用户名:
登录后点击左侧菜单的「DVWA Security」
选择「Low」(最低安全级别,适合新手练习)
点击「Submit」
到这里,DVWA 靶场就搭建好了!
三、我遇到的问题总结
问题 1:403 错误
- 原因:用
localhost访问无法匹配虚拟主机配置 - 解决:改用
http://dvwa:8898/访问
问题 2:数据库密码报错
- 原因:PhpStudy 要求密码至少 6 位
- 解决:把密码改成
dvwa123,配置文件和数据库都要改
问题 3:初始化按钮是灰色
- 原因:PHP 的
allow_url_include没开启 - 解决:修改
php.ini,重启 Apache
四、第一次实战:命令注入漏洞
搭建好靶场后,我迫不及待地想试试。我选择了命令注入(Command Injection)作为第一个漏洞,因为它最直观、最容易理解。
准备工作
确认以下几点:
- ✅ 已登录 DVWA(admin / password)
- ✅ 安全等级设为 Low
- ✅ 浏览器打开 DVWA 主页
实战步骤
步骤1:进入命令注入模块
点击左侧菜单的「Command Injection」,看到一个输入框,提示输入 IP 地址。
这是一个 ping 工具,用来测试 IP 地址能否 ping 通。
步骤2:测试正常功能
先看看正常情况是什么样的。
操作:输入127.0.0.1,点击提交
结果:显示了 ping 的结果,类似这样:
正在 Ping 127.0.0.1... 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128 ... 数据包: 已发送 = 5,已接收 = 5,丢失 = 0思考:后台应该执行了ping 127.0.0.1这个命令。
步骤3:尝试注入命令
现在来试试能不能执行其他命令。
关键知识:在 Windows 中,&符号可以连接两个命令:
命令1 & 命令2系统会先执行命令1,然后执行命令2。
操作:输入127.0.0.1 & whoami,点击提交
结果:
- 第一部分:ping 的结果
- 第二部分:显示了当前用户名,比如
desktop-a8qj354\31161
成功了!我成功让系统执行了whoami命令。
步骤4:尝试更多命令
既然可以注入命令,我试了几个常用的:
查看系统信息:127.0.0.1 & systeminfo
- 显示了操作系统版本、内存、补丁等信息
- 有些中文显示乱码,但关键信息能看清
查看网络配置:127.0.0.1 & ipconfig
- 显示了 IP 地址、网关、DNS 等
列出当前目录文件:127.0.0.1 & dir
- 显示了当前目录的所有文件
这些都是 Windows 系统命令,通过命令注入漏洞,我可以执行任意系统命令!
Ps:有乱码的原因是:
编码不匹配
Windows cmd 默认编码:GBK(cp936),中文系统输出中文是 GBK 编码
DVWA 网页默认编码:UTF-8
服务器命令执行返回 GBK 字节流,浏览器直接以 UTF-8 解析中文汉字 → 全部变成问号 / 方块乱码,英文参数不受影响可正常显示
不是 Payload 写错、不是漏洞本身问题,只是字符编码解析冲突
步骤5:查看源代码,理解原理
为了理解为什么会有这个漏洞,我点击了页面右下角的「View Source」按钮,看到了后台代码:
<?php// 获取用户输入$target=$_REQUEST['ip'];// 直接拼接到 ping 命令中$cmd=shell_exec('ping '.$target);// 输出结果echo"<pre>{$cmd}</pre>";?>问题在哪?
- 没有验证输入:程序没有检查用户输入是否是合法的 IP 地址
- 直接拼接字符串:用户输入被直接拼到命令里
- 使用危险函数:
shell_exec()会执行任何命令
当我输入127.0.0.1 & whoami时:
$target="127.0.0.1 & whoami";$cmd=shell_exec('ping 127.0.0.1 & whoami');系统把这当成一个完整命令执行:
- 先执行
ping 127.0.0.1 &分隔符让系统接着执行whoami
步骤6:对比不同安全级别
我还查看了其他安全级别的代码,学习如何防护这个漏洞。
High 级别(黑名单过滤)
// 定义危险字符黑名单$substitutions=array('&'=>'',';'=>'','|'=>'',...);// 把危险字符替换成空$target=str_replace(array_keys($substitutions),$substitutions,$target);问题:黑名单可能不全,容易被绕过。
Impossible 级别(白名单验证)
// 把输入按 . 分割$octet=explode(".",$target);// 检查是否是 4 个数字if(is_numeric($octet[0])&&is_numeric($octet[1])&&is_numeric($octet[2])&&is_numeric($octet[3])&&sizeof($octet)==4){// 只有合法 IP 才执行$cmd=shell_exec('ping '.$target);}else{echo'错误:无效的 IP 地址';}优点:只允许合法的 IP 格式,任何包含特殊字符的输入都会被拒绝。这才是安全的做法!
我学到了什么
通过这次实战,我明白了:
命令注入的本质:
用户输入被直接拼接到系统命令中,没有验证和过滤。
如何利用:
- 找到执行系统命令的输入点
- 用
&、&&、|等分隔符注入额外命令 - 执行任意系统命令
如何防护:
- ❌ 不防护 → 完全不安全
- ⚠️ 黑名单过滤 → 容易被绕过
- ✅ 白名单验证 → 只允许合法格式(最安全)
核心原则:
永远不要信任用户输入!
常用 Windows 命令表
| 命令 | 功能 | 示例 |
|---|---|---|
whoami | 查看当前用户 | 127.0.0.1 & whoami |
hostname | 查看主机名 | 127.0.0.1 & hostname |
ipconfig | 查看网络配置 | 127.0.0.1 & ipconfig |
systeminfo | 查看系统信息 | 127.0.0.1 & systeminfo |
dir | 列出文件 | 127.0.0.1 & dir |
type 文件名 | 查看文件内容 | 127.0.0.1 & type config.php |
net user | 查看用户列表 | 127.0.0.1 & net user |
补充:其他搭建方式
除了 PhpStudy,还有两种方式可以搭建 DVWA:
方式二:XAMPP
- 跨平台(Windows/Mac/Linux)
- 下载地址:https://www.apachefriends.org/
- 与 PhpStudy 类似,但是英文界面
- MySQL 默认密码为空
方式三:Docker(最简单)
如果你会用命令行,一条命令就能启动:
dockerrun--rm-it-p80:80 vulnerables/web-dvwa访问http://localhost即可,无需配置。
结语
这次从搭建到实战的完整经历,让我对 Web 安全有了更具体的认识。以前只是看书看视频,总觉得抽象,现在亲手操作了一遍,感觉踏实多了。
虽然过程中遇到了一些问题,但每次解决问题都是一次学习。特别是看源码理解漏洞原理的环节,让我明白了"为什么会有漏洞"比"怎么利用漏洞"更重要。
最后再次强调:所有学到的技术只能用于合法的学习和测试环境,绝不能用于攻击他人系统。网络安全学习的目的是保护,而不是破坏。
我的配置信息:
系统:Windows 10
工具:PhpStudy Pro
访问地址:
http://dvwa:8898/数据库:dvwa / dvwa / dvwa123
默认账号:admin / password