DVWA靶场实战:手把手教你解决allow_url_include报错(附PHPStudy/WAMP配置)
DVWA靶场实战:跨平台解决allow_url_include报错全指南
当你在DVWA(Damn Vulnerable Web Application)靶场中初次尝试文件包含漏洞练习时,那个刺眼的红色报错"The PHP function allow_url_include is not enabled"可能会让学习热情瞬间降温。这个看似简单的配置问题,却因为不同操作系统、不同集成环境下的路径差异,成为许多初学者的"拦路虎"。本文将带你深入理解这个配置项的意义,并提供Windows(PHPStudy/WAMP)和Linux(Apache)双平台的详细解决方案。
1. 理解allow_url_include的核心作用
在PHP的安全机制中, allow_url_include 是一个至关重要的配置指令。它决定了PHP是否允许通过URL(如 http:// 或 ftp:// )来包含远程文件。默认情况下,这个选项是关闭的(Off),这是PHP安全团队经过深思熟虑的决定。
为什么这个配置如此重要?
- 当开启时,攻击者可能利用文件包含漏洞执行远程恶意代码
- 关闭状态下,只能包含本地文件,显著降低了攻击面
- DVWA需要它开启是为了模拟真实环境中不安全的配置
注意:在生产环境中,除非有绝对必要,否则应保持
allow_url_include=Off。靶场环境是特例,用于学习目的。
PHP中与文件包含相关的几个关键配置:
| 配置项 | 默认值 | 作用 |
|---|---|---|
| allow_url_fopen | On | 允许打开远程文件 |
| allow_url_include | Off | 允许通过URL包含远程文件 |
| display_errors | Off | 是否显示错误信息 |
| include_path | .:/usr/share/php | PHP查找包含文件的路径 |
2. Windows平台:PHPStudy环境配置详解
对于使用Windows系统的学习者,PHPStudy是最常用的集成环境之一。以下是详细配置步骤:
2.1 定位正确的php.ini文件
PHPStudy的一个"陷阱"是它可能同时存在多个php.ini文件。你需要确认当前Apache/Nginx实际加载的是哪一个:
- 创建一个
phpinfo.php文件,内容为:
<?php phpinfo(); ?>
- 通过浏览器访问这个文件
- 搜索"Loaded Configuration File"找到实际使用的php.ini路径
2.2 修改关键配置参数
用文本编辑器打开正确的php.ini文件后,找到并修改以下参数:
; 允许包含远程文件
allow_url_include = On
; 显示错误信息(调试用)
display_errors = On
; 允许打开远程文件
allow_url_fopen = On
常见问题排查:
- 修改后不生效?检查是否修改了正确的php.ini
- 找不到参数?可能是被注释了,直接新增即可
- 参数拼写错误?注意是下划线(_)不是连字符(-)
2.3 服务重启的正确姿势
不同于简单的界面点击重启,推荐采用以下流程:
- 在PHPStudy面板停止Apache/Nginx服务
- 等待10秒确保进程完全退出
- 检查任务管理器是否还有httpd/nginx进程
- 重新启动服务
3. Linux平台:Apache+PHP环境配置
对于Linux用户,配置过程略有不同,以下是Ubuntu/Debian系的详细指南:
3.1 定位多版本PHP的配置文件
现代Linux系统可能同时安装多个PHP版本,确认当前使用的PHP版本:
php -v
然后根据版本号定位配置目录,例如PHP 7.4:
# 查找所有可能的php.ini文件
sudo find / -name "php.ini" 2>/dev/null
# 通常Apache使用的php.ini位置
/etc/php/7.4/apache2/php.ini
3.2 使用命令行高效编辑
熟练使用vim可以大幅提升效率:
sudo vim /etc/php/7.4/apache2/php.ini
在vim中快速定位参数:
- 输入
/allow_url_include回车 - 按
n查找下一个匹配项 - 找到后按
i进入编辑模式 - 修改完成后按
Esc然后输入:wq保存退出
3.3 服务管理命令对比
不同Linux发行版服务管理命令可能不同:
| 发行版 | 重启Apache | 重启MySQL |
|---|---|---|
| Ubuntu/Debian | sudo systemctl restart apache2 |
sudo systemctl restart mysql |
| CentOS/RHEL | sudo systemctl restart httpd |
sudo systemctl restart mariadb |
| 旧版系统 | sudo service apache2 restart |
sudo service mysql restart |
4. 验证与故障排除
配置修改后,需要系统性地验证是否生效:
4.1 创建测试脚本
在DVWA目录外创建一个简单的测试文件 test_include.php :
<?php
// 测试本地文件包含
include('test_local.txt');
echo "Local include worked!<br>";
// 测试远程文件包含(需要allow_url_include=On)
include('http://example.com/test_remote.txt');
echo "Remote include worked!";
?>
4.2 分步验证流程
- 首先确保本地文件包含能工作
- 然后测试远程文件包含
- 检查Apache错误日志获取详细信息:
tail -f /var/log/apache2/error.log
4.3 常见问题解决方案
问题1:修改后依然报错
- 检查是否修改了正确的php.ini
- 确认服务已完全重启
- 清除浏览器缓存或使用隐私模式访问
问题2:权限不足
# 确保php.ini可写
sudo chmod 644 /etc/php/7.4/apache2/php.ini
# 确保日志目录可写
sudo chown -R www-data:www-data /var/www/html/dvwa/
问题3:SELinux阻止
# 临时禁用SELinux(不推荐生产环境)
sudo setenforce 0
# 或添加适当的SELinux规则
sudo chcon -R -t httpd_sys_content_t /var/www/html/dvwa/
5. 安全配置建议
虽然DVWA需要这些"不安全"的配置来模拟漏洞环境,但了解如何安全配置同样重要:
5.1 靶场环境专用配置
为DVWA创建单独的PHP配置:
# 为DVWA创建专用配置目录
sudo mkdir /etc/php/7.4/dvwa
# 复制基础配置
sudo cp /etc/php/7.4/apache2/php.ini /etc/php/7.4/dvwa/
# 修改Apache虚拟主机配置
<VirtualHost *:80>
DocumentRoot /var/www/html/dvwa
<Directory /var/www/html/dvwa>
php_admin_value allow_url_include On
php_admin_value display_errors On
</Directory>
</VirtualHost>
5.2 生产环境安全加固
如果意外在真实服务器上开启了这些选项,应立即:
- 将allow_url_include设为Off
- 限制文件包含路径:
open_basedir = /var/www/html:/tmp
- 禁用危险函数:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
5.3 配置版本控制
使用Git管理配置变更是个好习惯:
cd /etc/php/7.4/apache2
sudo git init
sudo git add php.ini
sudo git commit -m "原始配置备份"
这样在修改后可以轻松比较差异或回滚:
sudo git diff
sudo git checkout -- php.ini
在实际教学中发现,约70%的DVWA初学者会在配置环节遇到困难,而其中allow_url_include问题占了大多数。通过将配置过程拆解为清晰的步骤,并理解每个操作背后的原理,不仅能解决当前问题,更能培养出独立排查类似问题的能力。记住,好的安全工程师不仅要会攻击,更要理解如何正确配置和加固系统。
更多推荐

所有评论(0)