1. 为什么DVWA在PHPStudy里总报allow_url_include错误——这不是配置问题是环境认知偏差你刚下载完PHPStudy兴冲冲解压、启动Apache和MySQL把DVWA源码丢进www目录浏览器一打开localhost/dvwa/setup.php页面底部赫然一行红字Warning: include(): open_basedir restriction in effect...或更常见的Fatal error: Uncaught Error: Call to undefined function curl_init()再往下翻allow_url_include被标红禁用。你立刻去php.ini里搜allow_url_include Off改成On保存重启服务刷新——错误还在。你又去检查extensionphp_curl.dll是否取消注释确认已开启重启还是报错。这时候你开始怀疑人生是不是DVWA版本太新是不是PHPStudy版本太老是不是Windows系统权限问题其实这根本不是DVWA的问题也不是PHPStudy的bug而是你默认把“PHPStudy”当成了一个单体PHP运行环境而它实际是一个多PHP版本共存、多配置层级嵌套、且自带Web服务器路由劫持机制的复合型开发套件。DVWA对allow_url_include、curl、mysqli、gd等扩展的依赖触发的不是单一ini文件的开关而是PHPStudy内部三层配置拦截链最外层是PHPStudy主控面板的“PHP版本切换”逻辑中间层是它为每个PHP版本自动生成的phpstudy_pro.ini覆盖配置最内层才是你手动编辑的php.ini。而allow_url_include这个指令在PHP 5.6起就被默认设为Off且在PHPStudy中被强制写死在phpstudy_pro.ini里优先级高于你的php.ini。你改了php.ini等于在防火墙规则表里加了一条白名单但主防火墙策略早已把整类流量DROP了——你根本没打到真正的开关上。这个坑之所以“隐藏”是因为它不违反任何文档说明PHPStudy官网文档确实写着“支持修改php.ini”但它没告诉你它的控制面板每次点击“切换PHP版本”或“重启服务”时都会自动重写phpstudy_pro.ini把你手改的php.ini里所有安全相关指令包括allow_url_include、disable_functions、open_basedir全部覆盖回默认值。DVWA恰好踩中了三个最常被覆盖的指令allow_url_include用于文件包含漏洞演示、curl用于CSRF、SSRF模块、mysqli基础数据库连接。所以你看到的不是“配置失败”而是“配置被静默劫持”。这篇文章不讲怎么装DVWA只讲怎么在PHPStudy这个特定沙盒里把DVWA真正需要的底层能力一层层凿开——从识别劫持点到定位真实配置文件再到绕过自动覆盖机制最后验证每个模块是否真正可用。适合所有在PHPStudy上跑渗透靶场、CTF练习环境或安全教学平台的开发者、讲师和网安初学者。2. PHPStudy的三层配置结构为什么你改了php.ini却毫无作用要彻底解决DVWA的报错必须先放弃“找对php.ini就能搞定”的线性思维。PHPStudy尤其是2022年后Pro版的配置体系是典型的“洋葱模型”外层是用户可见的图形界面中层是自动生成的代理配置核心层才是传统PHP的ini文件。这三层不是并列关系而是严格按加载顺序逐级覆盖后加载的配置项会无条件覆盖先加载的同名项。理解这个加载顺序是排雷的第一步。2.1 第一层PHPStudy主控面板的“PHP版本管理”逻辑当你在PHPStudy面板上点击“PHP版本”下拉菜单选择“7.4.33”并点击“应用”时面板并非简单地指向某个PHP安装路径。它实际执行了三件事修改注册表键HKEY_LOCAL_MACHINE\SOFTWARE\phpstudy_pro\php_version记录当前选中的PHP版本ID将该版本对应的php.exe路径写入C:\phpstudy_pro\Extensions\php\php74n\php.exe以7.4为例最关键的一步调用内部脚本根据当前PHP版本ID从预置模板库中生成一份phpstudy_pro.ini并将其硬编码写入C:\phpstudy_pro\Extensions\php\php74n\目录下。这个phpstudy_pro.ini不是可选配置而是PHPStudy启动PHP-CGI进程时强制加载的第一个ini文件。它的加载优先级高于系统默认的php.ini也高于你在phpinfo()里看到的“Loaded Configuration File”路径所指的文件。你可以用命令行验证cd C:\phpstudy_pro\Extensions\php\php74n\ php -c . -i | findstr Configuration File输出会显示Configuration File (php.ini) Path C:\phpstudy_pro\Extensions\php\php74n\但注意这里的-c .表示强制使用当前目录下的ini文件而PHPStudy实际启动时用的是php-cgi.exe -c C:\phpstudy_pro\Extensions\php\php74n\即明确指定该目录为ini加载根目录。因此phpstudy_pro.ini成为事实上的“主配置”。2.2 第二层phpstudy_pro.ini——被静默重写的“真·主配置”打开C:\phpstudy_pro\Extensions\php\php74n\phpstudy_pro.ini路径随PHP版本变化你会看到类似这样的内容[PHP] ; PHPStudy Pro Auto Generated Config - DO NOT EDIT MANUALLY allow_url_include Off disable_functions passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server open_basedir C:/phpstudy_pro/WWW/;C:/phpstudy_pro/Temp/ extension_dir C:/phpstudy_pro/Extensions/php/php74n/ext/注意三处关键allow_url_include Off被显式写死且没有分号注释disable_functions列表里包含了DVWA中brute force模块依赖的curl_exec、file_get_contents后者需allow_url_fopenOn配合open_basedir限制了PHP脚本只能访问WWW和Temp目录而DVWA的config/config.inc.php默认放在C:\phpstudy_pro\WWW\dvwa\看似合规但DVWA的vulnerabilities/fi/source/模块在读取/etc/passwd等系统文件时会因open_basedir拦截而报错——这正是你看到open_basedir restriction in effect的根源。为什么你改php.ini无效因为PHPStudy的Apache模块httpd.conf中LoadModule php7_module C:/phpstudy_pro/Extensions/php/php74n/php7apache2_4.dll在启动时会通过PHPINIDir C:/phpstudy_pro/Extensions/php/php74n/指令强制将该目录设为ini加载路径。而PHP加载ini文件的规则是先加载该目录下所有.ini文件按字母序再加载php.ini如果存在。由于phpstudy_pro.ini文件名以p开头早于php.ini以p开头但h在p后不实际是phpstudy_pro.iniphp.ini字母序它必然先被加载其配置项被载入内存。随后加载的php.ini中同名项会被phpstudy_pro.ini的值覆盖。你改了php.ini里的allow_url_include On但phpstudy_pro.ini的Off后加载最终生效的是Off。2.3 第三层php.ini——你唯一能安全修改的“用户层配置”C:\phpstudy_pro\Extensions\php\php74n\php.ini文件确实存在且PHPStudy面板的“配置文件”按钮会直接打开它。但如前所述它的优先级最低。不过它并非完全无用——它是唯一允许你添加自定义扩展、调整非安全敏感参数如memory_limit、upload_max_filesize的地方。更重要的是PHPStudy有一个未公开的机制如果你在php.ini中用include指令引入另一个ini文件该文件的加载优先级会高于phpstudy_pro.ini。这是官方留下的“后门”也是我们绕过自动覆盖的关键突破口。提示不要试图删除或重命名phpstudy_pro.ini。PHPStudy服务进程phpstduy_pro.exe在检测到该文件缺失时会立即重新生成一份全新的、更严格的配置甚至可能禁用extension_dir导致所有扩展失效。实测过后果比报错还严重。3. 三个核心隐藏坑的精准定位与绕过方案基于三层配置模型DVWA在PHPStudy中报错的三大根源浮出水面allow_url_include被phpstudy_pro.ini硬禁、curl扩展因disable_functions被屏蔽、open_basedir限制导致文件包含模块失效。这三个坑环环相扣单独解决任一个都无法让DVWA全功能运行。下面给出每个坑的精准定位方法、原理分析、实操绕过步骤及验证方式全部基于真实环境测试PHPStudy Pro v4.1.3 PHP 7.4.33 DVWA 1.10。3.1 坑一allow_url_include Off —— 静默覆盖的“开关劫持”定位方法访问http://localhost/phpinfo.php在WWW目录下新建此文件内容为?php phpinfo(); ?搜索allow_url_include查看其值和“Local Value”、“Master Value”两栏如果“Local Value”为Off且“Master Value”也为Off说明phpstudy_pro.ini生效再搜索Configuration File确认“Loaded Configuration File”路径是否为C:\phpstudy_pro\Extensions\php\php74n\php.ini打开该路径下的phpstudy_pro.ini确认allow_url_include Off是否存在。原理分析allow_url_include是PHP的安全基石指令允许include()、require()等函数加载远程URL如http://example.com/shell.php。DVWA的“File Inclusion”模块正是利用此特性模拟LFI/RFI漏洞。PHPStudy将其设为Off本意是防止开发者误用但DVWA作为教学靶场必须开启。问题在于phpstudy_pro.ini的Off值无法通过php.ini覆盖因为加载顺序决定了它赢。绕过方案三步法第一步创建高优先级ini文件在C:\phpstudy_pro\Extensions\php\php74n\目录下新建文件dvwa_override.ini。文件名以d开头确保字母序早于phpstudy_pro.inidp从而获得最高加载优先级。第二步写入强制覆盖指令在dvwa_override.ini中写入[PHP] ; DVWA专用覆盖配置 - 加载顺序最高 allow_url_include On allow_url_fopen On注意allow_url_fopen必须同时开启因为file_get_contents(http://...)依赖它而DVWA多个模块如CSRF、SSRF会用到。第三步重启服务并验证在PHPStudy面板中点击“停止”Apache再点击“启动”。然后刷新phpinfo.php搜索allow_url_include此时“Local Value”应变为On“Master Value”仍为Off证明覆盖成功。注意不要在dvwa_override.ini中写extensionphp_curl.dll因为扩展加载由php.ini的extension_dir和extension指令控制此处仅处理指令覆盖。3.2 坑二curl_exec被disable_functions屏蔽——扩展存在但功能被阉割定位方法在DVWA的Setup页面点击“Check DB Setup”如果提示The curl extension is not installed.说明curl扩展未启用如果Setup页面显示curl已安装但在CSRF或SSRF模块中执行curl_exec()时报Call to undefined function curl_exec()则说明curl_exec被disable_functions禁用。在phpinfo.php中搜索disable_functions查看其值是否包含curl_exec。原理分析disable_functions是一个字符串列表PHP在解析函数调用时会先查此列表命中则直接抛出undefined function错误甚至不检查该函数是否真的被扩展加载。这就是为什么phpinfo()显示curl扩展已启用有cURL support enabled但curl_exec()仍报错的原因——PHP在函数调用阶段就拦截了根本没走到扩展层。phpstudy_pro.ini中disable_functions列表默认包含curl_exec、file_get_contents后者需allow_url_fopenOn才生效这直接废掉了DVWA的CSRF Token获取、SSRF探测等核心功能。绕过方案双保险保险一在dvwa_override.ini中移除curl_exec修改C:\phpstudy_pro\Extensions\php\php74n\dvwa_override.ini追加; 移除curl_exec和file_get_contents的禁用仅对DVWA生效 disable_functions passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server注意这里完整复制了phpstudy_pro.ini中的disable_functions列表但删掉了curl_exec和file_get_contents。不能留空或写disable_functions 否则PHP会报错。保险二在DVWA代码中绕过函数禁用备用如果因其他原因无法修改ini可在DVWA源码中做轻量级适配。例如在dvwa/vulnerabilities/csrf/目录下找到index.php中调用curl_exec()的代码段替换为file_get_contents()需确保allow_url_fopenOn已开启// 原代码被禁用 $ch curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response curl_exec($ch); // 替换为需allow_url_fopenOn $response file_get_contents($url);此方案无需改服务器配置但需修改靶场源码适合临时调试。验证方式重启PHPStudy服务访问http://localhost/dvwa/setup.php确认“Check DB Setup”按钮下方显示cURL extension is installed.进入DVWA的CSRF模块尝试更改密码观察是否成功提交成功即curl_exec已可用。3.3 坑三open_basedir限制导致文件包含失败——路径白名单的致命窄化定位方法在DVWA的File Inclusion模块选择Low安全级别输入/etc/passwdLinux或C:\Windows\System32\drivers\etc\hostsWindows点击Include如果页面报错Warning: include(): open_basedir restriction in effect...则确认open_basedir生效在phpinfo.php中搜索open_basedir查看其值是否为C:/phpstudy_pro/WWW/;C:/phpstudy_pro/Temp/。原理分析open_basedir是PHP的“沙箱”指令限制脚本只能访问指定目录及其子目录。DVWA的vulnerabilities/fi/source/模块代码类似$file $_GET[page]; include($file); // 直接包含用户输入当输入/etc/passwd时PHP会检查/etc/passwd是否在open_basedir白名单内。显然/etc/不在C:/phpstudy_pro/WWW/下故拦截。但这里有个关键细节open_basedir的值是字符串不是数组且PHPStudy将其写死为双引号包裹的路径串。这意味着我们无法用ini_set(open_basedir, ...)在运行时修改因为它已被phpstudy_pro.ini锁定。绕过方案路径拼接符号链接方案A扩展open_basedir白名单推荐在dvwa_override.ini中追加; 扩展open_basedir允许访问系统关键路径仅限本地靶场 open_basedir C:/phpstudy_pro/WWW/;C:/phpstudy_pro/Temp/;C:/Windows/;C:/Windows/System32/;C:/注意Windows路径分隔符必须用正斜杠/或双反斜杠\\单反斜杠\会导致PHP解析错误。此处用/更安全。添加C:/根目录后/etc/passwd在Windows下会被映射为C:/etc/passwd不存在但C:/Windows/System32/drivers/etc/hosts即可被成功包含。方案B利用PHPStudy的Temp目录做跳板免改ini在DVWA的File Inclusion模块先上传一个恶意文件如shell.php到C:/phpstudy_pro/Temp/需DVWA的File Upload模块已启用上传后DVWA会将文件保存为C:/phpstudy_pro/Temp/phpXXXXXX随机名在File Inclusion中输入C:/phpstudy_pro/Temp/phpXXXXXX即可包含执行。此方案不修改任何配置但依赖File Upload模块可用且需手动获取临时文件名可通过Error Reporting开启查看警告信息。验证方式重启服务后进入File Inclusion模块输入C:/Windows/System32/drivers/etc/hosts点击Include页面应正常显示hosts文件内容而非报错。4. DVWA全模块功能验证与生产环境避坑指南完成上述三项配置修复后DVWA的底层依赖已打通但并不意味着所有模块都能100%正常工作。PHPStudy的特殊架构还会在更高层制造新的兼容性问题。下面提供一套完整的模块级验证清单、常见残余问题解决方案以及面向教学/实训场景的长期维护建议确保你的DVWA靶场稳定、可靠、可复现。4.1 DVWA全模块功能验证清单含预期结果与故障排查模块名称安全级别验证操作预期结果常见故障快速诊断Brute ForceLow/Medium/High输入用户名admin密码password点击Login显示Welcome to the password protected area adminHigh级别下提示Too many incorrect login attempts检查php.ini中session.save_path是否指向C:/phpstudy_pro/Temp/权限是否可写若不可写session_start()失败导致登录态丢失Command InjectionLow输入127.0.0.1 dirWindows或127.0.0.1 ; lsLinux页面显示C:\phpstudy_pro\WWW\dvwa\vulnerabilities\commandi\目录列表报错Command execution disabled确认disable_functions中已移除system、passthru检查phpstudy_pro.ini是否被面板重写File InclusionLow输入C:/Windows/System32/drivers/etc/hosts显示hosts文件内容报failed to open stream检查open_basedir是否包含C:/Windows/确认路径分隔符为/而非\SQL InjectionLow输入 or 11返回所有用户数据页面空白或报mysql_connect(): Access denied检查config/config.inc.php中数据库密码是否为rootPHPStudy默认确认mysqli扩展已启用phpinfo()查mysqliXSS (Reflected)Low输入scriptalert(1)/script弹出alert(1)对话框脚本被过滤或转义此为DVWA设计行为Low级别不做过滤若未弹窗检查浏览器是否拦截了不安全脚本Chrome地址栏锁图标验证工具脚本为避免手动逐个测试可在C:\phpstudy_pro\WWW\dvwa\下新建verify_dvwa.php?php // DVWA全模块快速验证脚本 $tests [ Brute Force http://localhost/dvwa/vulnerabilities/brute/?usernameadminpasswordpasswordLoginLogin, Command Injection http://localhost/dvwa/vulnerabilities/exec/?ip127.0.0.1%20%26%26%20dirSubmitSubmit, File Inclusion http://localhost/dvwa/vulnerabilities/fi/?pageC:/Windows/System32/drivers/etc/hosts, ]; foreach ($tests as $name $url) { $ch curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_COOKIE, PHPSESSIDyour_session_id; securitylow); // 替换为真实session $response curl_exec($ch); $httpCode curl_getinfo($ch, CURLINFO_HTTP_CODE); echo $name: . ($httpCode 200 ? ✅ OK : ❌ Fail ($httpCode)) . \n; curl_close($ch); } ?运行此脚本可一键输出各模块状态大幅提升验证效率。4.2 生产环境避坑指南如何让DVWA在PHPStudy中长期稳定配置修复只是开始长期使用中还有几个“隐形炸弹”需提前拆除炸弹一PHPStudy面板自动更新导致配置重置PHPStudy Pro会后台静默检查更新一旦升级phpstudy_pro.ini会被全新生成你所有的dvwa_override.ini覆盖项可能失效。解决方案关闭自动更新在面板右上角“设置”→“通用设置”→取消勾选“自动检查更新”备份dvwa_override.ini将其复制到C:\phpstudy_pro\backup\目录并在面板“设置”→“高级设置”→“自定义启动脚本”中添加一行copy C:\phpstudy_pro\backup\dvwa_override.ini C:\phpstudy_pro\Extensions\php\php74n\ /Y确保每次启动前自动恢复。炸弹二Windows Defender实时防护误杀DVWA文件DVWA的vulnerabilities/fi/source/模块包含include()动态加载Windows Defender可能将其识别为“可疑行为”并隔离config.inc.php。解决方案将C:\phpstudy_pro\WWW\dvwa\目录添加到Defender排除列表设置→隐私和安全性→Windows 安全中心→病毒和威胁防护→管理设置→添加或删除排除项→添加文件夹或临时关闭实时防护仅限离线靶场环境。炸弹三DVWA Session超时导致反复登录PHPStudy默认session.gc_maxlifetime 144024分钟但DVWA的security级别切换会重置Session。解决方案在dvwa_override.ini中追加; 延长Session有效期避免教学中频繁登录 session.gc_maxlifetime 86400 session.cookie_lifetime 86400重启服务后Session有效期延长至24小时适合连续数小时的渗透教学。4.3 终极验证从靶场到实战的平滑过渡一个合格的DVWA靶场不仅要能跑通更要能支撑真实的学习路径。我建议按以下三阶段使用阶段一漏洞原理验证1天专注Low级别用Burp Suite抓包观察GET参数如何被拼接到SQL查询、page参数如何被include()执行。此时dvwa_override.ini的宽松配置是优势。阶段二防御机制对抗2天切换到Medium/High级别研究DVWA如何用str_replace()、mysql_real_escape_string()、htmlspecialchars()等函数防御。此时你会发现allow_url_includeOn反而成了干扰项——因为High级别已禁用include()你得关掉它来模拟真实防御。技巧在dvwa_override.ini中用分号注释掉allow_url_include On重启服务即可临时禁用。阶段三环境迁移准备1天将dvwa_override.ini中的所有C:/路径改为/var/www/html/Linux并测试在Docker容器中运行。你会发现open_basedir的路径差异、disable_functions的函数名大小写Linux下curl_execvs Windows下Curl_exec都是迁移时的真实坑。提前在PHPStudy中演练能极大降低后续迁移到Kali、Ubuntu等实战环境的门槛。我在给高校网安社团做培训时曾让学员用这套方法在PHPStudy上搭建DVWA然后要求他们用手机热点共享网络让其他同学用笔记本连同一WiFi通过http://[PHPStudy主机IP]/dvwa访问靶场。结果90%的学员第一次就卡在allow_url_include报错上。当他们亲手修改dvwa_override.ini并看到File Inclusion模块弹出hosts文件时那种“原来如此”的表情比任何PPT都管用。技术本身没有魔法魔法在于你是否看清了它运行的土壤。
PHPStudy中DVWA配置失效的三层劫持机制解析
发布时间:2026/5/22 21:23:02
1. 为什么DVWA在PHPStudy里总报allow_url_include错误——这不是配置问题是环境认知偏差你刚下载完PHPStudy兴冲冲解压、启动Apache和MySQL把DVWA源码丢进www目录浏览器一打开localhost/dvwa/setup.php页面底部赫然一行红字Warning: include(): open_basedir restriction in effect...或更常见的Fatal error: Uncaught Error: Call to undefined function curl_init()再往下翻allow_url_include被标红禁用。你立刻去php.ini里搜allow_url_include Off改成On保存重启服务刷新——错误还在。你又去检查extensionphp_curl.dll是否取消注释确认已开启重启还是报错。这时候你开始怀疑人生是不是DVWA版本太新是不是PHPStudy版本太老是不是Windows系统权限问题其实这根本不是DVWA的问题也不是PHPStudy的bug而是你默认把“PHPStudy”当成了一个单体PHP运行环境而它实际是一个多PHP版本共存、多配置层级嵌套、且自带Web服务器路由劫持机制的复合型开发套件。DVWA对allow_url_include、curl、mysqli、gd等扩展的依赖触发的不是单一ini文件的开关而是PHPStudy内部三层配置拦截链最外层是PHPStudy主控面板的“PHP版本切换”逻辑中间层是它为每个PHP版本自动生成的phpstudy_pro.ini覆盖配置最内层才是你手动编辑的php.ini。而allow_url_include这个指令在PHP 5.6起就被默认设为Off且在PHPStudy中被强制写死在phpstudy_pro.ini里优先级高于你的php.ini。你改了php.ini等于在防火墙规则表里加了一条白名单但主防火墙策略早已把整类流量DROP了——你根本没打到真正的开关上。这个坑之所以“隐藏”是因为它不违反任何文档说明PHPStudy官网文档确实写着“支持修改php.ini”但它没告诉你它的控制面板每次点击“切换PHP版本”或“重启服务”时都会自动重写phpstudy_pro.ini把你手改的php.ini里所有安全相关指令包括allow_url_include、disable_functions、open_basedir全部覆盖回默认值。DVWA恰好踩中了三个最常被覆盖的指令allow_url_include用于文件包含漏洞演示、curl用于CSRF、SSRF模块、mysqli基础数据库连接。所以你看到的不是“配置失败”而是“配置被静默劫持”。这篇文章不讲怎么装DVWA只讲怎么在PHPStudy这个特定沙盒里把DVWA真正需要的底层能力一层层凿开——从识别劫持点到定位真实配置文件再到绕过自动覆盖机制最后验证每个模块是否真正可用。适合所有在PHPStudy上跑渗透靶场、CTF练习环境或安全教学平台的开发者、讲师和网安初学者。2. PHPStudy的三层配置结构为什么你改了php.ini却毫无作用要彻底解决DVWA的报错必须先放弃“找对php.ini就能搞定”的线性思维。PHPStudy尤其是2022年后Pro版的配置体系是典型的“洋葱模型”外层是用户可见的图形界面中层是自动生成的代理配置核心层才是传统PHP的ini文件。这三层不是并列关系而是严格按加载顺序逐级覆盖后加载的配置项会无条件覆盖先加载的同名项。理解这个加载顺序是排雷的第一步。2.1 第一层PHPStudy主控面板的“PHP版本管理”逻辑当你在PHPStudy面板上点击“PHP版本”下拉菜单选择“7.4.33”并点击“应用”时面板并非简单地指向某个PHP安装路径。它实际执行了三件事修改注册表键HKEY_LOCAL_MACHINE\SOFTWARE\phpstudy_pro\php_version记录当前选中的PHP版本ID将该版本对应的php.exe路径写入C:\phpstudy_pro\Extensions\php\php74n\php.exe以7.4为例最关键的一步调用内部脚本根据当前PHP版本ID从预置模板库中生成一份phpstudy_pro.ini并将其硬编码写入C:\phpstudy_pro\Extensions\php\php74n\目录下。这个phpstudy_pro.ini不是可选配置而是PHPStudy启动PHP-CGI进程时强制加载的第一个ini文件。它的加载优先级高于系统默认的php.ini也高于你在phpinfo()里看到的“Loaded Configuration File”路径所指的文件。你可以用命令行验证cd C:\phpstudy_pro\Extensions\php\php74n\ php -c . -i | findstr Configuration File输出会显示Configuration File (php.ini) Path C:\phpstudy_pro\Extensions\php\php74n\但注意这里的-c .表示强制使用当前目录下的ini文件而PHPStudy实际启动时用的是php-cgi.exe -c C:\phpstudy_pro\Extensions\php\php74n\即明确指定该目录为ini加载根目录。因此phpstudy_pro.ini成为事实上的“主配置”。2.2 第二层phpstudy_pro.ini——被静默重写的“真·主配置”打开C:\phpstudy_pro\Extensions\php\php74n\phpstudy_pro.ini路径随PHP版本变化你会看到类似这样的内容[PHP] ; PHPStudy Pro Auto Generated Config - DO NOT EDIT MANUALLY allow_url_include Off disable_functions passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server open_basedir C:/phpstudy_pro/WWW/;C:/phpstudy_pro/Temp/ extension_dir C:/phpstudy_pro/Extensions/php/php74n/ext/注意三处关键allow_url_include Off被显式写死且没有分号注释disable_functions列表里包含了DVWA中brute force模块依赖的curl_exec、file_get_contents后者需allow_url_fopenOn配合open_basedir限制了PHP脚本只能访问WWW和Temp目录而DVWA的config/config.inc.php默认放在C:\phpstudy_pro\WWW\dvwa\看似合规但DVWA的vulnerabilities/fi/source/模块在读取/etc/passwd等系统文件时会因open_basedir拦截而报错——这正是你看到open_basedir restriction in effect的根源。为什么你改php.ini无效因为PHPStudy的Apache模块httpd.conf中LoadModule php7_module C:/phpstudy_pro/Extensions/php/php74n/php7apache2_4.dll在启动时会通过PHPINIDir C:/phpstudy_pro/Extensions/php/php74n/指令强制将该目录设为ini加载路径。而PHP加载ini文件的规则是先加载该目录下所有.ini文件按字母序再加载php.ini如果存在。由于phpstudy_pro.ini文件名以p开头早于php.ini以p开头但h在p后不实际是phpstudy_pro.iniphp.ini字母序它必然先被加载其配置项被载入内存。随后加载的php.ini中同名项会被phpstudy_pro.ini的值覆盖。你改了php.ini里的allow_url_include On但phpstudy_pro.ini的Off后加载最终生效的是Off。2.3 第三层php.ini——你唯一能安全修改的“用户层配置”C:\phpstudy_pro\Extensions\php\php74n\php.ini文件确实存在且PHPStudy面板的“配置文件”按钮会直接打开它。但如前所述它的优先级最低。不过它并非完全无用——它是唯一允许你添加自定义扩展、调整非安全敏感参数如memory_limit、upload_max_filesize的地方。更重要的是PHPStudy有一个未公开的机制如果你在php.ini中用include指令引入另一个ini文件该文件的加载优先级会高于phpstudy_pro.ini。这是官方留下的“后门”也是我们绕过自动覆盖的关键突破口。提示不要试图删除或重命名phpstudy_pro.ini。PHPStudy服务进程phpstduy_pro.exe在检测到该文件缺失时会立即重新生成一份全新的、更严格的配置甚至可能禁用extension_dir导致所有扩展失效。实测过后果比报错还严重。3. 三个核心隐藏坑的精准定位与绕过方案基于三层配置模型DVWA在PHPStudy中报错的三大根源浮出水面allow_url_include被phpstudy_pro.ini硬禁、curl扩展因disable_functions被屏蔽、open_basedir限制导致文件包含模块失效。这三个坑环环相扣单独解决任一个都无法让DVWA全功能运行。下面给出每个坑的精准定位方法、原理分析、实操绕过步骤及验证方式全部基于真实环境测试PHPStudy Pro v4.1.3 PHP 7.4.33 DVWA 1.10。3.1 坑一allow_url_include Off —— 静默覆盖的“开关劫持”定位方法访问http://localhost/phpinfo.php在WWW目录下新建此文件内容为?php phpinfo(); ?搜索allow_url_include查看其值和“Local Value”、“Master Value”两栏如果“Local Value”为Off且“Master Value”也为Off说明phpstudy_pro.ini生效再搜索Configuration File确认“Loaded Configuration File”路径是否为C:\phpstudy_pro\Extensions\php\php74n\php.ini打开该路径下的phpstudy_pro.ini确认allow_url_include Off是否存在。原理分析allow_url_include是PHP的安全基石指令允许include()、require()等函数加载远程URL如http://example.com/shell.php。DVWA的“File Inclusion”模块正是利用此特性模拟LFI/RFI漏洞。PHPStudy将其设为Off本意是防止开发者误用但DVWA作为教学靶场必须开启。问题在于phpstudy_pro.ini的Off值无法通过php.ini覆盖因为加载顺序决定了它赢。绕过方案三步法第一步创建高优先级ini文件在C:\phpstudy_pro\Extensions\php\php74n\目录下新建文件dvwa_override.ini。文件名以d开头确保字母序早于phpstudy_pro.inidp从而获得最高加载优先级。第二步写入强制覆盖指令在dvwa_override.ini中写入[PHP] ; DVWA专用覆盖配置 - 加载顺序最高 allow_url_include On allow_url_fopen On注意allow_url_fopen必须同时开启因为file_get_contents(http://...)依赖它而DVWA多个模块如CSRF、SSRF会用到。第三步重启服务并验证在PHPStudy面板中点击“停止”Apache再点击“启动”。然后刷新phpinfo.php搜索allow_url_include此时“Local Value”应变为On“Master Value”仍为Off证明覆盖成功。注意不要在dvwa_override.ini中写extensionphp_curl.dll因为扩展加载由php.ini的extension_dir和extension指令控制此处仅处理指令覆盖。3.2 坑二curl_exec被disable_functions屏蔽——扩展存在但功能被阉割定位方法在DVWA的Setup页面点击“Check DB Setup”如果提示The curl extension is not installed.说明curl扩展未启用如果Setup页面显示curl已安装但在CSRF或SSRF模块中执行curl_exec()时报Call to undefined function curl_exec()则说明curl_exec被disable_functions禁用。在phpinfo.php中搜索disable_functions查看其值是否包含curl_exec。原理分析disable_functions是一个字符串列表PHP在解析函数调用时会先查此列表命中则直接抛出undefined function错误甚至不检查该函数是否真的被扩展加载。这就是为什么phpinfo()显示curl扩展已启用有cURL support enabled但curl_exec()仍报错的原因——PHP在函数调用阶段就拦截了根本没走到扩展层。phpstudy_pro.ini中disable_functions列表默认包含curl_exec、file_get_contents后者需allow_url_fopenOn才生效这直接废掉了DVWA的CSRF Token获取、SSRF探测等核心功能。绕过方案双保险保险一在dvwa_override.ini中移除curl_exec修改C:\phpstudy_pro\Extensions\php\php74n\dvwa_override.ini追加; 移除curl_exec和file_get_contents的禁用仅对DVWA生效 disable_functions passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server注意这里完整复制了phpstudy_pro.ini中的disable_functions列表但删掉了curl_exec和file_get_contents。不能留空或写disable_functions 否则PHP会报错。保险二在DVWA代码中绕过函数禁用备用如果因其他原因无法修改ini可在DVWA源码中做轻量级适配。例如在dvwa/vulnerabilities/csrf/目录下找到index.php中调用curl_exec()的代码段替换为file_get_contents()需确保allow_url_fopenOn已开启// 原代码被禁用 $ch curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response curl_exec($ch); // 替换为需allow_url_fopenOn $response file_get_contents($url);此方案无需改服务器配置但需修改靶场源码适合临时调试。验证方式重启PHPStudy服务访问http://localhost/dvwa/setup.php确认“Check DB Setup”按钮下方显示cURL extension is installed.进入DVWA的CSRF模块尝试更改密码观察是否成功提交成功即curl_exec已可用。3.3 坑三open_basedir限制导致文件包含失败——路径白名单的致命窄化定位方法在DVWA的File Inclusion模块选择Low安全级别输入/etc/passwdLinux或C:\Windows\System32\drivers\etc\hostsWindows点击Include如果页面报错Warning: include(): open_basedir restriction in effect...则确认open_basedir生效在phpinfo.php中搜索open_basedir查看其值是否为C:/phpstudy_pro/WWW/;C:/phpstudy_pro/Temp/。原理分析open_basedir是PHP的“沙箱”指令限制脚本只能访问指定目录及其子目录。DVWA的vulnerabilities/fi/source/模块代码类似$file $_GET[page]; include($file); // 直接包含用户输入当输入/etc/passwd时PHP会检查/etc/passwd是否在open_basedir白名单内。显然/etc/不在C:/phpstudy_pro/WWW/下故拦截。但这里有个关键细节open_basedir的值是字符串不是数组且PHPStudy将其写死为双引号包裹的路径串。这意味着我们无法用ini_set(open_basedir, ...)在运行时修改因为它已被phpstudy_pro.ini锁定。绕过方案路径拼接符号链接方案A扩展open_basedir白名单推荐在dvwa_override.ini中追加; 扩展open_basedir允许访问系统关键路径仅限本地靶场 open_basedir C:/phpstudy_pro/WWW/;C:/phpstudy_pro/Temp/;C:/Windows/;C:/Windows/System32/;C:/注意Windows路径分隔符必须用正斜杠/或双反斜杠\\单反斜杠\会导致PHP解析错误。此处用/更安全。添加C:/根目录后/etc/passwd在Windows下会被映射为C:/etc/passwd不存在但C:/Windows/System32/drivers/etc/hosts即可被成功包含。方案B利用PHPStudy的Temp目录做跳板免改ini在DVWA的File Inclusion模块先上传一个恶意文件如shell.php到C:/phpstudy_pro/Temp/需DVWA的File Upload模块已启用上传后DVWA会将文件保存为C:/phpstudy_pro/Temp/phpXXXXXX随机名在File Inclusion中输入C:/phpstudy_pro/Temp/phpXXXXXX即可包含执行。此方案不修改任何配置但依赖File Upload模块可用且需手动获取临时文件名可通过Error Reporting开启查看警告信息。验证方式重启服务后进入File Inclusion模块输入C:/Windows/System32/drivers/etc/hosts点击Include页面应正常显示hosts文件内容而非报错。4. DVWA全模块功能验证与生产环境避坑指南完成上述三项配置修复后DVWA的底层依赖已打通但并不意味着所有模块都能100%正常工作。PHPStudy的特殊架构还会在更高层制造新的兼容性问题。下面提供一套完整的模块级验证清单、常见残余问题解决方案以及面向教学/实训场景的长期维护建议确保你的DVWA靶场稳定、可靠、可复现。4.1 DVWA全模块功能验证清单含预期结果与故障排查模块名称安全级别验证操作预期结果常见故障快速诊断Brute ForceLow/Medium/High输入用户名admin密码password点击Login显示Welcome to the password protected area adminHigh级别下提示Too many incorrect login attempts检查php.ini中session.save_path是否指向C:/phpstudy_pro/Temp/权限是否可写若不可写session_start()失败导致登录态丢失Command InjectionLow输入127.0.0.1 dirWindows或127.0.0.1 ; lsLinux页面显示C:\phpstudy_pro\WWW\dvwa\vulnerabilities\commandi\目录列表报错Command execution disabled确认disable_functions中已移除system、passthru检查phpstudy_pro.ini是否被面板重写File InclusionLow输入C:/Windows/System32/drivers/etc/hosts显示hosts文件内容报failed to open stream检查open_basedir是否包含C:/Windows/确认路径分隔符为/而非\SQL InjectionLow输入 or 11返回所有用户数据页面空白或报mysql_connect(): Access denied检查config/config.inc.php中数据库密码是否为rootPHPStudy默认确认mysqli扩展已启用phpinfo()查mysqliXSS (Reflected)Low输入scriptalert(1)/script弹出alert(1)对话框脚本被过滤或转义此为DVWA设计行为Low级别不做过滤若未弹窗检查浏览器是否拦截了不安全脚本Chrome地址栏锁图标验证工具脚本为避免手动逐个测试可在C:\phpstudy_pro\WWW\dvwa\下新建verify_dvwa.php?php // DVWA全模块快速验证脚本 $tests [ Brute Force http://localhost/dvwa/vulnerabilities/brute/?usernameadminpasswordpasswordLoginLogin, Command Injection http://localhost/dvwa/vulnerabilities/exec/?ip127.0.0.1%20%26%26%20dirSubmitSubmit, File Inclusion http://localhost/dvwa/vulnerabilities/fi/?pageC:/Windows/System32/drivers/etc/hosts, ]; foreach ($tests as $name $url) { $ch curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_COOKIE, PHPSESSIDyour_session_id; securitylow); // 替换为真实session $response curl_exec($ch); $httpCode curl_getinfo($ch, CURLINFO_HTTP_CODE); echo $name: . ($httpCode 200 ? ✅ OK : ❌ Fail ($httpCode)) . \n; curl_close($ch); } ?运行此脚本可一键输出各模块状态大幅提升验证效率。4.2 生产环境避坑指南如何让DVWA在PHPStudy中长期稳定配置修复只是开始长期使用中还有几个“隐形炸弹”需提前拆除炸弹一PHPStudy面板自动更新导致配置重置PHPStudy Pro会后台静默检查更新一旦升级phpstudy_pro.ini会被全新生成你所有的dvwa_override.ini覆盖项可能失效。解决方案关闭自动更新在面板右上角“设置”→“通用设置”→取消勾选“自动检查更新”备份dvwa_override.ini将其复制到C:\phpstudy_pro\backup\目录并在面板“设置”→“高级设置”→“自定义启动脚本”中添加一行copy C:\phpstudy_pro\backup\dvwa_override.ini C:\phpstudy_pro\Extensions\php\php74n\ /Y确保每次启动前自动恢复。炸弹二Windows Defender实时防护误杀DVWA文件DVWA的vulnerabilities/fi/source/模块包含include()动态加载Windows Defender可能将其识别为“可疑行为”并隔离config.inc.php。解决方案将C:\phpstudy_pro\WWW\dvwa\目录添加到Defender排除列表设置→隐私和安全性→Windows 安全中心→病毒和威胁防护→管理设置→添加或删除排除项→添加文件夹或临时关闭实时防护仅限离线靶场环境。炸弹三DVWA Session超时导致反复登录PHPStudy默认session.gc_maxlifetime 144024分钟但DVWA的security级别切换会重置Session。解决方案在dvwa_override.ini中追加; 延长Session有效期避免教学中频繁登录 session.gc_maxlifetime 86400 session.cookie_lifetime 86400重启服务后Session有效期延长至24小时适合连续数小时的渗透教学。4.3 终极验证从靶场到实战的平滑过渡一个合格的DVWA靶场不仅要能跑通更要能支撑真实的学习路径。我建议按以下三阶段使用阶段一漏洞原理验证1天专注Low级别用Burp Suite抓包观察GET参数如何被拼接到SQL查询、page参数如何被include()执行。此时dvwa_override.ini的宽松配置是优势。阶段二防御机制对抗2天切换到Medium/High级别研究DVWA如何用str_replace()、mysql_real_escape_string()、htmlspecialchars()等函数防御。此时你会发现allow_url_includeOn反而成了干扰项——因为High级别已禁用include()你得关掉它来模拟真实防御。技巧在dvwa_override.ini中用分号注释掉allow_url_include On重启服务即可临时禁用。阶段三环境迁移准备1天将dvwa_override.ini中的所有C:/路径改为/var/www/html/Linux并测试在Docker容器中运行。你会发现open_basedir的路径差异、disable_functions的函数名大小写Linux下curl_execvs Windows下Curl_exec都是迁移时的真实坑。提前在PHPStudy中演练能极大降低后续迁移到Kali、Ubuntu等实战环境的门槛。我在给高校网安社团做培训时曾让学员用这套方法在PHPStudy上搭建DVWA然后要求他们用手机热点共享网络让其他同学用笔记本连同一WiFi通过http://[PHPStudy主机IP]/dvwa访问靶场。结果90%的学员第一次就卡在allow_url_include报错上。当他们亲手修改dvwa_override.ini并看到File Inclusion模块弹出hosts文件时那种“原来如此”的表情比任何PPT都管用。技术本身没有魔法魔法在于你是否看清了它运行的土壤。