PHP伪协议深度攻防从文件包含到压缩包渗透的艺术当安全工程师面对一个看似无害的文件上传功能时往往能通过PHP伪协议这座桥梁发现意想不到的攻击面。2022年NISACTF赛事中的bingdundun题目正是利用了phar协议的特性但这仅仅是冰山一角。PHP内置的12种伪协议构成了一个复杂的武器库每种协议都像瑞士军刀的不同部件在特定场景下能发挥独特作用。1. PHP伪协议家族全景解析PHP伪协议远不止于常见的phar和zip它们像一套精心设计的钥匙能打开服务器文件系统的各种锁。理解这些协议的工作原理是攻防双方都必须掌握的基本功。1.1 主流伪协议特性对比协议类型支持版本典型用途特殊限制绕过潜力phar://≥5.3.0读取压缩包内文件需有效stub头★★★★☆zip://≥5.2.0访问ZIP压缩文件需绝对路径#号分隔★★★☆☆data://≥5.2.0直接执行内联代码需allow_url_include开启★★★★★expect://需扩展执行系统命令需安装expect扩展★★☆☆☆glob://≥5.3.0文件模式匹配仅查找功能★☆☆☆☆注意实际利用时需结合allow_url_fopen和allow_url_include配置状态选择协议phar://的独特之处在于它能解析被重命名的压缩包。我曾在一个实战项目中遇到仅允许上传.jpg文件的系统通过以下步骤成功利用创建包含恶意代码的phar文件重命名为profile.jpg上传通过include(phar://./uploads/profile.jpg/internal.php)触发执行1.2 非常规协议的特殊价值compress.zlib://和compress.bzip2://这类协议常被忽视但它们能绕过某些特殊过滤// 传统zip协议利用 include(zip:///var/www/uploads/attack.zip%23payload.php); // 使用zlib的替代方案 file_get_contents(compress.zlib:///tmp/malicious.gz);在Windows系统上ogg://协议有时能替代被过滤的协议这种冷门特性在CTF比赛中尤其有用。2. 绕过上传限制的六种高阶技巧当系统采用黑名单过滤伪协议时攻击者需要更精巧的绕过方式。以下是经过实战验证的有效方法2.1 协议嵌套与编码技巧双重编码绕过include(phar://./uploads/attack.jpg/); // 被过滤时 include(p%68ar://./uploads/attack.jpg/); // URL解码后生效协议链组合file_get_contents(compress.zlib://phar:///tmp/fake.png/internal.php);2.2 文件魔术字节操控制作能同时被识别为图片和phar的文件# 生成混合文件示例 with open(evil.phar, rb) as f: phar f.read() with open(fake.jpg, wb) as f: f.write(b\xFF\xD8\xFF\xE0 phar) # 添加JPEG文件头这种文件在上传时通过图片检测被包含时又作为有效phar执行。3. 防御体系的构建策略对抗伪协议攻击需要纵深防御我在企业安全评估中推荐采用以下组合方案3.1 输入验证的黄金法则扩展名白名单配合内容检测$finfo new finfo(FILEINFO_MIME_TYPE); if (!in_array($finfo-file($_FILES[file][tmp_name]), [image/jpeg, image/png])) { die(Invalid file type); }禁用危险函数; php.ini配置 disable_functions highlight_file,include,include_once,fopen3.2 服务器配置加固安全措施推荐配置防护效果open_basedir限制为web目录防止目录穿越allow_url_includeOff阻断远程文件包含session.upload_progressclean_enabledOn防止上传进度攻击user_ini.disabledOn阻止.user.ini文件篡改4. 实战案例分析从理论到突破回顾NISACTF 2022的bingdundun题目其核心考点是通过phar协议绕过上传限制。但在真实环境中攻击者往往会尝试更多可能性4.1 多协议组合攻击链上传伪装成PNG的ZIP压缩包利用zip://协议定位内部文件通过filter/convert.base64-encode/resource读取源码找到反序列化入口点触发phar反序列化// 典型攻击代码示例 $file zip:///var/www/uploads/fake.png%23payload.php; include($file);4.2 新型防御绕过技术最近出现的php://temp协议滥用案例表明攻击者开始利用临时文件流file_put_contents(php://temp/evil, ?php system($_GET[cmd]);?); include(php://temp/evil);这种技术完全绕过物理文件上传对防御体系提出新挑战。在一次红队评估中我们发现即使最严格的上传限制也无法阻止这种内存级攻击。
PHP文件包含漏洞新姿势:除了zip://和phar://,你还能用哪些伪协议绕过上传限制?
发布时间:2026/5/31 4:41:02
PHP伪协议深度攻防从文件包含到压缩包渗透的艺术当安全工程师面对一个看似无害的文件上传功能时往往能通过PHP伪协议这座桥梁发现意想不到的攻击面。2022年NISACTF赛事中的bingdundun题目正是利用了phar协议的特性但这仅仅是冰山一角。PHP内置的12种伪协议构成了一个复杂的武器库每种协议都像瑞士军刀的不同部件在特定场景下能发挥独特作用。1. PHP伪协议家族全景解析PHP伪协议远不止于常见的phar和zip它们像一套精心设计的钥匙能打开服务器文件系统的各种锁。理解这些协议的工作原理是攻防双方都必须掌握的基本功。1.1 主流伪协议特性对比协议类型支持版本典型用途特殊限制绕过潜力phar://≥5.3.0读取压缩包内文件需有效stub头★★★★☆zip://≥5.2.0访问ZIP压缩文件需绝对路径#号分隔★★★☆☆data://≥5.2.0直接执行内联代码需allow_url_include开启★★★★★expect://需扩展执行系统命令需安装expect扩展★★☆☆☆glob://≥5.3.0文件模式匹配仅查找功能★☆☆☆☆注意实际利用时需结合allow_url_fopen和allow_url_include配置状态选择协议phar://的独特之处在于它能解析被重命名的压缩包。我曾在一个实战项目中遇到仅允许上传.jpg文件的系统通过以下步骤成功利用创建包含恶意代码的phar文件重命名为profile.jpg上传通过include(phar://./uploads/profile.jpg/internal.php)触发执行1.2 非常规协议的特殊价值compress.zlib://和compress.bzip2://这类协议常被忽视但它们能绕过某些特殊过滤// 传统zip协议利用 include(zip:///var/www/uploads/attack.zip%23payload.php); // 使用zlib的替代方案 file_get_contents(compress.zlib:///tmp/malicious.gz);在Windows系统上ogg://协议有时能替代被过滤的协议这种冷门特性在CTF比赛中尤其有用。2. 绕过上传限制的六种高阶技巧当系统采用黑名单过滤伪协议时攻击者需要更精巧的绕过方式。以下是经过实战验证的有效方法2.1 协议嵌套与编码技巧双重编码绕过include(phar://./uploads/attack.jpg/); // 被过滤时 include(p%68ar://./uploads/attack.jpg/); // URL解码后生效协议链组合file_get_contents(compress.zlib://phar:///tmp/fake.png/internal.php);2.2 文件魔术字节操控制作能同时被识别为图片和phar的文件# 生成混合文件示例 with open(evil.phar, rb) as f: phar f.read() with open(fake.jpg, wb) as f: f.write(b\xFF\xD8\xFF\xE0 phar) # 添加JPEG文件头这种文件在上传时通过图片检测被包含时又作为有效phar执行。3. 防御体系的构建策略对抗伪协议攻击需要纵深防御我在企业安全评估中推荐采用以下组合方案3.1 输入验证的黄金法则扩展名白名单配合内容检测$finfo new finfo(FILEINFO_MIME_TYPE); if (!in_array($finfo-file($_FILES[file][tmp_name]), [image/jpeg, image/png])) { die(Invalid file type); }禁用危险函数; php.ini配置 disable_functions highlight_file,include,include_once,fopen3.2 服务器配置加固安全措施推荐配置防护效果open_basedir限制为web目录防止目录穿越allow_url_includeOff阻断远程文件包含session.upload_progressclean_enabledOn防止上传进度攻击user_ini.disabledOn阻止.user.ini文件篡改4. 实战案例分析从理论到突破回顾NISACTF 2022的bingdundun题目其核心考点是通过phar协议绕过上传限制。但在真实环境中攻击者往往会尝试更多可能性4.1 多协议组合攻击链上传伪装成PNG的ZIP压缩包利用zip://协议定位内部文件通过filter/convert.base64-encode/resource读取源码找到反序列化入口点触发phar反序列化// 典型攻击代码示例 $file zip:///var/www/uploads/fake.png%23payload.php; include($file);4.2 新型防御绕过技术最近出现的php://temp协议滥用案例表明攻击者开始利用临时文件流file_put_contents(php://temp/evil, ?php system($_GET[cmd]);?); include(php://temp/evil);这种技术完全绕过物理文件上传对防御体系提出新挑战。在一次红队评估中我们发现即使最严格的上传限制也无法阻止这种内存级攻击。