
DVWA 这个靶场几乎是每个刚摸到 Web 安全门道的人绕不开的第一站。我在带新人的时候第一句话往往不是讲 SQL 注入原理而是先让他们把 DVWA 下载、安装、跑起来——因为只有亲眼看到那行Welcome to Damn Vulnerable Web Application出现在浏览器里后面讲的所有漏洞才有落脚点。这篇文章就把 DVWA 靶场的下载与安装这件事从头到尾讲透包含 Windows 集成环境、Linux 源码部署、容器化三条路径以及我自己踩过的一堆坑。不管你是完全没碰过虚拟机和命令行的新手还是想整理一套可复用部署脚本的老手都能在这篇里拿到能直接照做的东西。需要先说明一点DVWA 是专门设计成故意有漏洞的练习环境它只应该在你自己完全掌控的本地机器或隔离网络里运行任何把靶场暴露到公网、或者拿这些技术去测试别人系统的行为都不在讨论范围内。1. DVWA 到底是个什么靶场为什么适合第一个装1.1 它解决的核心问题把看得懂变成打得出来大部分人学 Web 安全的路径是这样的看视频、看文章讲 SQL 注入的时候点头如捣蒜合上教程之后对着一个真实网站却不知道该输入什么。问题的根源在于真实系统里有 WAF、有参数过滤、有各种业务逻辑干扰你根本没机会把注意力集中在一个漏洞本身。DVWADamn Vulnerable Web Application的价值就是把这些噪声全部剥掉它是一套用 PHP 写的、故意留下常见 Web 漏洞的 Web 应用把 SQL 注入、XSS、文件包含、文件上传、命令执行、CSRF、暴力破解这些模块拆成一个一个独立的页面每个页面还提供四个难度等级。这里有个很多新手没意识到的细节DVWA 的难度不是关卡而是同一段漏洞代码在不同防护强度下的实现方式。Low 等级是几乎零过滤的原始写法Medium 加了最浅的一层过滤High 用上了更严格的函数和白名单思路Impossible 则是官方给出的正确写法参考。也就是说同一个模块你可以横向对比四份源码去理解防护到底是怎么加上去的。这个对比视角比单纯追求通关有价值得多。我自己复习的时候最喜欢干的事就是把 Impossible 的源码和 Low 的源码并排打开一行一行看差别。另外 DVWA 还有一个隐性优点它的代码量很小目录结构扁平PHP 语法也不算复杂。一个有点编程基础的人两三天就能把它大部分核心文件翻一遍。相比之下一些体量更大的靶场虽然场景更真实但源码阅读成本高反而不适合入门时建立整体认知这个阶段。所以我一直把 DVWA 定位成地基型靶场——它不负责模拟真实业务它负责让你把漏洞的手感建立起来。1.2 选它当第一个靶场的三个理由第一个理由是部署门槛低。DVWA 本质就是一个 PHP 网站只要有 Web 服务器加数据库就能跑不需要编译、不需要复杂依赖甚至有一批现成的集成环境和容器镜像可以直接用。这意味着你可以把精力放在漏洞本身而不是耗在环境上。我带过的不少新人卡在环境搭建上耗掉一整周热情直接磨没了这是很可惜的。第二个理由是模块覆盖全面且经典。暴力破解、命令注入、CSRF、文件包含、文件上传、SQL 注入、SQL 盲注、弱会话 ID、XSS反射型、存储型、DOM 型、内容安全策略绕过、JavaScript 攻击、开放重定向……这套组合基本覆盖了 Web 漏洞教学里最核心的那部分。你把这十几个模块从 Low 打到 High再回头看真实场景里的漏洞报告会发现思路是通的。第三个理由是社区资料厚。因为用的人多任何一个报错信息扔进搜索引擎几乎都能翻到别人遇到过的相同问题。这对新手来说非常重要——一个陌生的环境如果遇到报错没人可以参照很容易就放弃了。DVWA 恰好属于你遇到的坑十年前就有人踩过的那一类。需要提前打个预防针DVWA 的版本更新不算特别频繁官方主分支这些年主要在做 PHP 新版本的兼容性适配。所以你如果从各种第三方网站下载所谓汉化版整合版绿色版很可能会遇到代码被改过、配置被写死、甚至夹带额外文件的情况。源码尽量从官方 GitHub 仓库获取这一点后面还会细说。2. 安装前的环境准备与方案选型2.1 三种部署路径的横向对比在动手之前先花五分钟想清楚自己要哪条路比装到一半推翻重来省事得多。我把常见的三种方式列在下面你可以直接对号入座。部署方式适合人群优点主要代价Windows 集成环境phpStudy、XAMPP 等完全零基础、只用 Windows图形化操作、不用敲命令行、一次装好 ApachePHPMySQL组件版本被集成包固定遇到版本兼容问题不好调Linux 源码部署Apache/Nginx PHP MySQL想搞懂每个组件在干什么、打算长期玩版本完全可控学到的配置能力可迁移需要熟悉基础命令和配置文件步骤多容器化部署镜像一键拉起只想快速拿到一个能用的靶场几分钟搞定、环境干净、删掉不留痕需要先有容器运行环境网络和卷映射要理解一下我个人的建议是如果你只是想尽快把 DVWA 跑起来做练习走容器化如果你想顺便把 Web 服务的搭建能力练出来走 Linux 源码如果你手边只有一台 Windows 机器、又完全不想碰命令行走集成环境。三条路我都会写完整流程你可以按需跳读。还有一个绕不开的前提一定要在虚拟机里做。不管你选哪条路都建议先装一个虚拟机软件在里面新建一台 Linux 或 Windows 虚拟机把 DVWA 装在这台虚拟机里。原因很简单——DVWA 本身就是个漏洞应用里面有些模块比如命令执行、文件上传会真的在你机器上执行命令或写入文件。把它关在虚拟机里出问题直接回滚快照主机毫无影响。这个习惯我从第一次搭靶场就养成了帮我省过至少两次重装系统的时间。2.2 虚拟机资源分配与目录规划虚拟机的配置不需要太高但也别给得太抠。我实测下来比较舒服的一组参数是2 核 CPU、4GB 内存、40GB 磁盘。内存给到 4GB 是因为 Web 服务器加数据库同时跑起来2GB 会比较紧张页面响应会明显变慢磁盘 40GB 是因为后面你可能还会想装别的靶场留点余量。如果你只是临时用2GB 内存也能跑就是切页面的时候会有点顿。网络模式上推荐用仅主机模式或者 NAT 模式不要用桥接模式直接暴露到局域网里。仅主机模式下只有你的宿主机能访问虚拟机的 IP隔离性最好NAT 模式下虚拟机可以主动访问外部网络、但外部不能主动连进来也够用。如果你用的是桥接记得在虚拟机里确认防火墙状态别让靶场端口对整个局域网敞开。目录规划这块我说一个容易被忽略的点。Linux 下不要直接把 DVWA 解压到/root或者用户家目录再想办法挂过去那样很容易在 Apache 的运行用户权限上出问题。标准做法是放在 Web 根目录下比如/var/www/html/dvwa或者单独建一个站点目录/var/www/dvwa再配虚拟主机。Windows 集成环境那边类似放在集成环境的WWW或wwwroot目录下就行。养成固定目录的习惯以后加站点、写备份脚本、迁移环境都会轻松很多。2.3 依赖组件与版本对照清单DVWA 官方对运行环境的要求并不苛刻但有几个版本边界必须注意否则后面会直接报错。下面这张表是我根据多次部署经验整理出来的包含能用和推荐两档。组件最低要求推荐版本备注Web 服务器Apache 2.2 / Nginx 1.xApache 2.4Nginx 也可以但需要额外处理 PHP-FPMPHP7.0 及以上7.4 或 8.18.1 之后的版本对老代码有兼容要求建议源码取新版数据库MySQL 5.5 / MariaDB 10.xMariaDB 10.5 或 MySQL 8.0MySQL 8 默认认证插件需要额外处理PHP 扩展mysqli、gdmysqli、gd、pdo_mysqlgd 用于验证码图片生成缺了会报错PHP 扩展这块我要多啰嗦两句。mysqli是数据库连接必须的缺了页面直接连不上数据库gd是图形库DVWA 里那个验证码模块要用到如果你发现验证码位置是一片空白或者报Call to undefined function imagecreate()基本就是 gd 没装。pdo_mysql严格来说不是必须但装上没坏处。另外还有两个php.ini里的开关跟后面的文件包含模块直接相关allow_url_fopen和allow_url_include这两个默认在很多发行版里是关闭的需要手动打开。这一点我在第 6 章排查部分还会再讲。接下来进入实操。为了避免读者被三种方式一起讲绕晕我按路径分成独立章节每章都能单独走通你可以只挑自己需要的那一章看。3. 路径一Windows 集成环境快速搭建3.1 集成环境的安装与站点目录设置Windows 下最省事的方式就是用集成环境包常见的几款phpStudy、XAMPP、WampServer 之类原理差不多都是把 Apache、PHP、MySQL 打成一个包用图形界面管理启动停止。我这边以通用流程来写你对照自己用的那款操作即可。安装过程没什么可说的一路下一步。有两点需要留意一是安装路径不要带中文和空格比如装在D:\web\这样的纯英文路径下带中文的路径经常会让 Apache 解析配置时出错二是安装完成后在管理面板里确认 Apache 和 MySQL 两个服务的状态都是已启动如果 MySQL 起不来多半是 3306 端口被别的程序占用了可以在面板里把端口改成 3307 再试。站点目录通常是安装目录下的WWW文件夹这个文件夹就是 Web 根目录浏览器访问http://localhost时映射到的就是这里。在放 DVWA 之前建议你先在这个目录里写一个test.php内容就一行?php phpinfo(); ?浏览器访问http://localhost/test.php如果能出来一大页 PHP 配置信息说明环境本身是好的可以往下走。这一步千万别跳过我见过太多人后面折腾半天结果是集成环境本身没启动成功。3.2 DVWA 源码获取与解压放置源码从官方仓库拿。在 GitHub 上搜索项目的官方仓库进入后找到Code按钮选择下载压缩包或者如果你本地装了 Git直接克隆下来也可以git clone https://github.com/digininja/DVWA.git下载完是一个压缩包解压之后得到一个名为DVWA的文件夹不同版本可能带分支后缀比如DVWA-master。把这个文件夹整个复制到集成环境的WWW目录下并改名为dvwa小写方便输入网址。最终路径类似D:\web\WWW\dvwa\里面应该能看到config、dvwa、hackable、vulnerabilities这些子目录。注意不要用那种一键安装包汉化整合版。这类包经常修改了源码逻辑或者把数据库密码写死在一个奇怪的值上出问题时你根本不知道是哪一层改的。用官方源码报错信息是干净的方便定位。放好之后先别急着配置打开浏览器访问http://localhost/dvwa/。这个时候大概率会看到一个红色报错页面告诉你配置文件不存在或者数据库连不上——这是正常的因为config目录下只有一个config.inc.php.dist模板文件还没生成真正生效的配置文件。接下来就处理它。3.3 配置文件的创建与参数填写进入dvwa/config目录把config.inc.php.dist复制一份重命名为config.inc.php。这两个文件的区别是.dist是模板官方升级时会被覆盖config.inc.php是你自己的实际配置升级不会动它。这是个很常见的约定理解了之后你会觉得挺合理。用文本编辑器打开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;这里的db_password建议改成一个你环境里真实存在的密码。集成环境的 MySQL 在初始安装时一般会让你设一个 root 密码把那个密码填到这里就行。要是你图省事让 MySQL 的密码是空那这里就留空字符串——但我不推荐这么干空密码的数据库一旦虚拟机网络配置出错风险会放大。下面还有两行也需要处理$_DVWA[ recaptcha_public_key ] ; $_DVWA[ recaptcha_private_key ] ;这两个是 Google reCAPTCHA 的密钥用于 DVWA 里那个不安全的验证码模块。留空就行不影响绝大多数模块使用只是那一个模块没法完整体验。很多人在这里卡壳以为必须去申请密钥其实完全不用。配置保存后回到浏览器刷新http://localhost/dvwa/。如果配置正确你应该能看到登录页或者被引导到安装页面。Windows 集成环境这条路到这里基本就通了剩下的数据库初始化步骤和 Linux 下是一样的我在第 4 章统一讲。4. 路径二Linux 下 LNMP/LAMP 源码部署4.1 系统组件安装与 PHP 扩展补齐Linux 这条路我以 Debian/Ubuntu 系为例其他发行版的包管理命令自行替换。先装齐基础组件sudo apt update sudo apt install -y apache2 mariadb-server php php-mysqli php-gd php-mbstring unzip这一步装完之后用php -v确认 PHP 版本。如果你拿到的是 PHP 8.2 以上的版本后面要留意一下兼容性DVWA 的新版源码已经做了适配但非常老的发行版自带的 DVWA 包可能还会有问题所以源码还是从官方仓库取最新版。接着处理php.ini。先找到当前生效的配置文件位置php --ini输出里会显示Loaded Configuration File比如/etc/php/8.1/apache2/php.ini。打开它把下面几项改成对应值allow_url_fopen On allow_url_include On display_errors Onallow_url_include这一项是给文件包含模块用的不打开的话那个模块的部分利用方式会直接被 PHP 拦掉你会以为是靶场坏了。display_errors打开是为了出错时页面上能直接看到报错信息省得你去翻日志——毕竟这是练习环境不需要藏报错。改完之后重启一下 Web 服务sudo systemctl restart apache2顺便确认 MariaDB 也起来了sudo systemctl status mariadb状态是active (running)才算正常。4.2 虚拟主机配置与目录权限处理源码下载和解压跟 Windows 那边一样最终放到/var/www/html/dvwa。放好之后我更推荐给它配一个独立的虚拟主机而不是挤在默认站点下。原因是用虚拟主机可以把AllowOverride单独打开后面如果要用.htaccess做实验会更方便。配置文件放在/etc/apache2/sites-available/dvwa.conf内容大致如下VirtualHost *:80 ServerName dvwa.local DocumentRoot /var/www/html/dvwa Directory /var/www/html/dvwa Options FollowSymLinks AllowOverride All Require all granted /Directory ErrorLog ${APACHE_LOG_DIR}/dvwa_error.log CustomLog ${APACHE_LOG_DIR}/dvwa_access.log combined /VirtualHost启用它并重载sudo a2ensite dvwa.conf sudo a2enmod rewrite sudo systemctl reload apache2然后在宿主机或者虚拟机本机的 hosts 文件里加一行127.0.0.1 dvwa.local就可以用域名访问了。当然直接用 IP 访问也没问题看你习惯。接下来是权限这是 Linux 部署里最容易出问题的一环。Apache 的运行用户通常是www-data而你把源码解压进去的时候文件的属主大概率是当前登录用户。这会导致 DVWA 在初始化阶段需要写配置文件、写上传目录时失败。一条命令解决sudo chown -R www-data:www-data /var/www/html/dvwa sudo find /var/www/html/dvwa -type d -exec chmod 755 {} \; sudo find /var/www/html/dvwa -type f -exec chmod 644 {} \;注意hackable/uploads这个目录是要接收上传文件的文件上传模块会往这里写东西所以它必须对 Web 用户可写。上面的 755 已经能保证目录可写、文件不可执行脚本以外的东西实际上够用了。如果你后面发现上传模块报权限错误单独给这个目录放宽到 775 试试。4.3 数据库初始化与页面安装向导现在开始初始化数据库。DVWA 需要一个名为dvwa的数据库以及一个能访问它的账号。登录数据库sudo mysql -u root然后执行CREATE DATABASE IF NOT EXISTS dvwa DEFAULT CHARACTER SET utf8mb4; CREATE USER dvwa_userlocalhost IDENTIFIED BY pssw0rd; GRANT ALL PRIVILEGES ON dvwa.* TO dvwa_userlocalhost; FLUSH PRIVILEGES; EXIT;这里我特意建了一个专用账号而不是直接用 root因为把数据库超级用户填进 Web 应用的配置文件然后这个应用还是故意有漏洞的逻辑上不太对。虽然是在本地练习但养成应用用独立低权限账号的习惯没坏处。如果你用的是 MySQL 8.0创建用户后如果连接报Authentication plugin caching_sha2_password cannot be loaded之类的错误需要把认证方式改成传统方式ALTER USER dvwa_userlocalhost IDENTIFIED WITH mysql_native_password BY pssw0rd;然后FLUSH PRIVILEGES;。这是 MySQL 8 一个非常经典的坑容器化部署时也常遇到。接着按第 3.3 节的说明生成config.inc.php把db_user和db_password换成刚才创建的账号密码。保存后浏览器访问http://dvwa.local/setup.php你会看到一个安装界面底部有两个按钮Create / Reset Database创建表结构并写入初始数据首次安装就点这个。注意它同时也会清空已有数据所以后续不要随便点。Setup只检查环境配置是否满足要求。点完Create / Reset Database如果一切正常页面会提示数据库创建成功并跳转到登录页。默认账号是admin密码是password。用这个登录进去能看到左侧那一列漏洞模块菜单就说明整个环境通了。第一次登录后建议立刻做两件事一是把密码改成别的避免以后自己都记混二是在DVWA Security页面把安全等级先设成Low从最基础的开始。5. 路径三容器化部署五分钟拉起一套5.1 官方镜像的运行与端口映射如果你的机器上已经有容器运行环境这条路径是最快的。DVWA 有维护良好的公开镜像一条命令就能跑起来docker pull vulnerables/web-dvwa docker run -d --name dvwa -p 8080:80 vulnerables/web-dvwa这两行命令干了什么值得说清楚因为理解了之后你排查问题会快很多。第一行是拉取镜像这个镜像里已经把 Apache、PHP、MariaDB 以及 DVWA 源码全部打包好了。第二行是启动容器-d表示后台运行--name dvwa给容器起了个名字方便后续管理-p 8080:80是把宿主机的 8080 端口映射到容器内部的 80 端口。关于端口映射有个新手常见的误解以为改了前面的数字容器里的服务端口也变了。实际上容器的服务仍然监听 80只是外面通过 8080 来访。所以浏览器要访问的是http://localhost:8080而不是 80。如果你的 8080 也被占用了换成 8081、8888 都可以前面的数字随便挑后面的 80 不要乱改。容器起来之后访问http://localhost:8080/setup.php点Create / Reset Database然后登录流程和前面完全一致动弹。默认账号密码依然是admin/password。5.2 Compose 编排与数据持久化命令行docker run适合临时用但如果每次都敲一长串参数会很烦而且容器删掉之后里面的数据也就没了。用 Compose 把配置写成文件管理起来清爽得多services: dvwa: image: vulnerables/web-dvwa container_name: dvwa ports: - 8080:80 restart: unless-stopped保存为docker-compose.yml在同一个目录下执行docker compose up -d就起来了。restart: unless-stopped的意思是容器会跟随宿主机自动启动除非你手动停掉它——这样你重启机器之后不用再手动把靶场拉起来。那数据持久化怎么做DVWA 的数据主要分两块数据库和上传的文件。严格来说练习环境的数据丢了也无所谓重置一下重新开始就行反而更干净。但如果你做了很长的练习记录想保留的话可以把容器内的数据库目录和上传目录挂出来。需要提醒的是镜像内部的路径在不同版本可能不同挂载前最好先用docker exec -it dvwa ls /var/lib/mysql之类的命令确认一下目录存在别盲目照抄网上的路径。5.3 容器环境的初始化与验证容器这条路虽然快但也有几个特有的坑这里提前说。第一个是首次启动需要一点时间。镜像启动时内部要拉起数据库服务通常十秒到半分钟不等。如果你刚run完就刷新浏览器可能会看到连接被拒绝稍等一下就好。用docker logs dvwa可以看到启动日志。第二个是数据库初始化只做一次。容器第一次运行会自动初始化数据库之后就保持状态。如果你在页面上手动点了Create / Reset Database数据会被清空重来。这一点在做练习时要有心理准备。第三个是容器删除后数据全丢。docker rm dvwa之后里面的东西就没了重新run会得到一套全新的环境。这既是缺点也是优点——练习环境我更喜欢这种随时能回到初始状态的感觉。验证环境是否正常最快的办法是登录后随便点开一个模块比如SQL Injection在输入框里输入1然后提交能看到返回一条用户记录就说明整条链路通了。6. 启动失败与常见报错排查实录环境搭建这个事报错几乎是必经环节。我把这些年遇到过的高频问题整理出来按类型分组你可以对着报错信息直接找。6.1 数据库类报错的定位思路数据库相关报错的表现形式页面上通常是一句醒目的红字比如Could not connect to the database - please check the config file或者Access denied for user。看到这类提示排查顺序建议固定下来先确认数据库服务本身在跑再确认配置文件里的账号密码最后确认账号有没有对应库的权限。判断数据库是否在跑Linux 下用systemctl status mariadb容器里用docker exec -it dvwa service mariadb status。如果服务没起来先解决服务问题别去改配置文件那是白费功夫。服务正常的话就用你在config.inc.php里填的那组账号密码在命令行手动连一次mysql -u dvwa_user -p -h 127.0.0.1 dvwa能连上说明账号密码没问题问题就出在 Web 服务器那侧的配置上连不上就说明账号密码或者权限错了回头改数据库。这个手动连接的技巧特别省时间比反复刷新网页试快得多。还有一种情况是 PHP 里 mysqli 扩展没装报错信息会变成Call to undefined function mysqli_connect()。这种一眼就能认出是扩展缺失按第 4.1 节装好php-mysqli再重启服务即可。6.2 PHP 版本与函数缺失类报错PHP 版本带来的问题主要有两类。一类是语法或函数废弃PHP 8 之后一些老写法被移除如果你用的是很旧的 DVWA 源码配新 PHP很容易在页面顶部直接抛一段Fatal error。解决办法很简单换官方仓库最新的源码官方一直在跟进兼容性。另一类是异常处理机制变化PHP 8.1 起 mysqli 默认以异常形式报错老代码没有捕获于是页面直接崩。表现是点提交按钮之后跳出一大段异常堆栈。函数缺失类的报错最常见的就是验证码模块的imagecreate()未定义前面说过是 gd 扩展没装。还有一个容易被忽略的是allow_url_include相关的提示DVWA 的安装检查页面会明确告诉你PHP 函数 allow_url_include 未开启。注意这个开关在有些发行版里被标记为废弃可能需要在php.ini里显式写出来改完记得重启 Web 服务光保存文件不重启是不生效的。6.3 端口占用、403 与白屏这三类问题端口占用Apache 起不来日志里会写Address already in use。八成是 80 端口被占了。Linux 下排查的命令是sudo ss -tlnp | grep :80能看到占用进程的 PID。要么把占用进程停掉要么把 Apache 换个端口。换端口的操作分两步改/etc/apache2/ports.conf里的Listen再改虚拟主机配置里的VirtualHost *:80两处都改完再重启。这个两处都要改的细节很多人只改了一处然后发现配置文件明明变了、端口还是没换。403 Forbidden页面直接拒绝访问。常见原因有三个——目录权限不对Apache 用户没有读权限、虚拟主机里没写Require all grantedApache 2.4 之后默认拒绝、或者DirectoryIndex没配好导致访问目录时找不到默认文件。按顺序检查这三项基本能定位。白屏页面一片空白什么都不显示。这种最烦因为什么信息都没有。处理办法是把display_errors和error_reporting都打开刷新看具体报错如果还是没有就去翻 Apache 的错误日志Linux 下是/var/log/apache2/error.log。白屏最常见的原因是 PHP 致命错误被屏蔽了显示只要把错误显示打开真相立刻出来。6.4 报错速查表我把上面这些整理成一张对照表方便你在浏览器和终端之间来回切换时快速定位。现象大概率原因处理动作红字提示无法连接数据库服务未启动 / 账号密码错 / 权限不足先用命令行手动连一次数据库验证Call to undefined function mysqli_connect()php-mysqli 扩展缺失安装扩展并重启 Web 服务imagecreate()未定义gd 扩展缺失安装 php-gdallow_url_include is not enabledphp.ini 未开启该开关修改 php.ini 后重启服务PHP 异常堆栈PHP 新版本对老代码不兼容更新 DVWA 源码到最新版页面 403权限或Require all granted缺失检查目录属主与虚拟主机配置页面白屏致命错误被隐藏打开 display_errors 并查看错误日志端口被占用80/3306 已被其他进程监听ss -tlnp查进程换端口或停进程容器启动后连不上启动未完成 / 端口映射写反等十几秒并检查docker logs7. 装完之后的使用经验与安全边界7.1 快照、隔离与恢复策略环境装好的第一件事我建议是拍一张虚拟机快照。原因很实在DVWA 里有几个模块是真的会改动系统状态的。命令执行模块会以 Web 用户身份在你机器上跑命令文件上传模块会往 web 目录写文件你要是哪天顺手试了个反向连接之类的操作系统里可能就多出一些莫名其妙的进程和文件。有快照在点一下就能回到干净状态比手动清理省事一百倍。隔离这件事我再说一遍因为它真的重要。靶场只应该在你本机或者专属的隔离网络里跑。不要为了方便远程访问把端口映射到公网也不要把靶场虚拟机接进你日常使用的局域网里。DVWA 的设计目标就是易受攻击暴露出去的后果不用我多解释。很多新手觉得我就用一会儿但网络上的扫描是持续不断的从开放端口到被扫出来有时候就是几个小时的事。还有个小习惯值得养成每次开始练习前先看一眼DVWA Security页面的难度设置。我踩过好几次坑想练 Low 级别的手感结果因为上次停在 High怎么试都打不通白白怀疑了自己半天。后来我干脆把开始练习前检查难度写进了自己的清单里。7.2 从 Low 到 Impossible 的练习节奏装好之后怎么练这里分享一点我自己的节奏仅供参考。第一阶段只打 Low目标是理解每个漏洞的最基本形态。这个阶段不用追求花样能成功利用一次就行。关键是点开页面对应的源码看一下理解为什么会存在这个漏洞——比如 SQL 注入那一行是不是直接把用户输入拼进了查询字符串。第二阶段回到 Low 的源码自己尝试在纸上写出修法然后再对照 Medium 的源码看官方是怎么改的。这一步是分水岭很多人跳过它直接去打 Medium结果只是记住了 payload没理解防护逻辑。第三阶段打 Medium 和 High。这个阶段你会遇到各种过滤绕过是最能锻炼思维的部分。我的经验是遇到打不通的情况先别急着搜 payload先把源码读一遍看看它到底过滤了什么、用什么函数过滤的很多时候答案就在代码里。第四阶段看 Impossible 的实现。对比着看你会发现真正的安全编码往往不是再加一层过滤而是换一种根本性的写法比如用参数化查询替代拼接。这个认知是 DVWA 能给你的最有价值的东西之一。最后再分享一个小技巧如果你的环境在某次练习之后变得行为诡异别花时间排查直接Create / Reset Database或者回滚快照。靶场存在的意义是让你专心学漏洞把时间花在环境修复上不值当。当然前提是你已经拍过快照——所以回到上一节快照这一步真的别省。