1. PHP文件包含漏洞的本质与危害
文件包含漏洞(File Inclusion Vulnerability)是PHP开发中最危险的安全问题之一,它允许攻击者通过构造特殊参数读取或执行服务器上的任意文件。我在审计企业级PHP应用时发现,超过60%的历史漏洞报告都与此相关。
这个漏洞的根源在于PHP的文件包含函数(include/require)在加载文件时,如果未对用户输入的参数进行严格过滤,攻击者就能通过路径遍历(如../../../etc/passwd)或远程文件包含(http://attacker.com/shell.php)获取敏感信息甚至执行系统命令。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 漏洞产生的核心场景分析
2.1 动态文件包含的典型模式
php复制// 危险示例:直接使用未过滤的GET参数
$page = $_GET['page'];
include('/templates/' . $page . '.php');
当用户访问?page=../../config/db时,可能泄露数据库配置。我在实际渗透测试中,曾通过这种方式获取过AWS密钥。
2.2 开发者的常见误区
- 认为"只包含.php文件就安全"(可通过截断攻击绕过)
- 依赖黑名单过滤(如禁止../)但未考虑编码绕过
- 在框架中错误配置了包含路径
3. 漏洞利用的高级技巧
3.1 日志文件注入攻击
通过包含Apache/Nginx日志文件(需可读权限),在User-Agent中植入PHP代码:
http复制GET / HTTP/1.1
User-Agent: <?php system($_GET['cmd']);?>
然后包含日志文件即可获得RCE(远程代码执行)。
3.2 PHP伪协议利用
php复制// 读取PHP文件源码
include('php://filter/convert.base64-encode/resource=index.php');
// 执行远程代码
include('data://text/plain,<?php phpinfo();?>');
去年某CMS的0day就利用了这种手法。
4. 企业级防护方案
4.1 输入验证最佳实践
php复制// 白名单验证示例
$allowed = ['home','about','contact'];
if(!in_array($_GET['page'], $allowed)) {
die('Invalid page request');
}
4.2 服务器加固措施
- 设置
open_basedir限制文件访问范围 - 禁用危险函数:
allow_url_include=Off - 定期更新PHP版本(老版本更容易出现截断漏洞)
5. 漏洞挖掘实战记录
5.1 自动化扫描技巧
使用Burp Suite的Intruder模块检测包含漏洞:
- 收集所有包含文件参数的请求
- 使用
../../../../etc/passwd等payload进行fuzz - 检查响应中的"root:x:"等特征字符串
5.2 代码审计关键点
重点关注以下函数调用:
- include/require(无后缀更危险)
- include_once/require_once
- file_get_contents(结合伪协议)
- 所有动态构建文件路径的代码
6. 应急响应方案
当发现文件包含漏洞被利用时:
- 立即备份服务器日志和访问文件
- 检查/tmp目录是否有可疑的session文件
- 使用rkhunter检查rootkit
- 更新所有包含用户输入的代码
重要提示:永远不要在生产环境使用
include($_GET['file'])这种写法,我在2018年就因此导致客户服务器被植入挖矿程序。
