当前位置: 首页 > news >正文

PHP 文件包含漏洞实战:HCTF 2018 WarmUp 代码审计与3种Payload构造解析

PHP文件包含漏洞深度解析:从HCTF 2018 WarmUp看白名单绕过艺术

漏洞背景与场景还原

2018年HCTF竞赛中的WarmUp题目成为了PHP文件包含漏洞的经典教学案例。这道题看似简单的笑脸页面背后,隐藏着对PHP文件包含机制和安全校验逻辑的深度考验。题目通过一个精心设计的checkFile函数,要求攻击者在严格的白名单限制下实现任意文件读取。

文件包含漏洞在Web安全领域始终占据重要地位。根据近年来的安全报告,由于错误配置或逻辑缺陷导致的文件包含问题,约占所有Web漏洞的15%。这类漏洞的危害不仅在于敏感信息泄露,更可能成为服务器沦陷的突破口。

代码审计:三层防御机制拆解

让我们深入分析题目中的核心校验逻辑。emmm类的checkFile方法构建了三道防御关卡:

class emmm { public static function checkFile(&$page) { $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; // 第一层:基础校验 if (!isset($page) || !is_string($page)) { echo "you can't see it"; return false; } // 第二层:直接匹配 if (in_array($page, $whitelist)) { return true; } // 第三层:问号截断检查 $_page = mb_substr($page, 0, mb_strpos($page.'?', '?')); if (in_array($_page, $whitelist)) { return true; } // 第四层:URL解码后检查 $_page = urldecode($page); $_page = mb_substr($_page, 0, mb_strpos($_page.'?', '?')); if (in_array($_page, $whitelist)) { return true; } echo "you can't see it"; return false; } }

这个校验机制看似严密,实则存在多个突破点。我们需要特别关注几个关键函数:

函数名称作用描述安全影响
mb_substr多字节安全的字符串截取可能被用于路径截断
mb_strpos多字节安全的字符串位置查找配合截取实现逻辑绕过
urldecodeURL解码双重编码绕过可能性

突破路径:三种有效Payload构造

方法一:基础路径穿越

最直接的思路是利用白名单文件作为跳板进行目录穿越:

source.php?../../../../../../../../ffffllllaaaagggg

工作原理

  1. mb_strpos检测到问号,截取前10个字符"source.php"
  2. 截取后的结果匹配白名单,校验通过
  3. 实际包含时,问号后的路径被解释为相对路径

注意:这种方法的成功率取决于服务器配置,某些环境会严格解析问号前的路径

方法二:单次URL编码绕过

当基础方法失效时,可以尝试对关键字符进行编码:

source.php%3f../../../../../../../../ffffllllaaaagggg

技术细节

  • %3f是问号的URL编码
  • 校验时urldecode会解码为原始问号
  • 包含阶段仍保持编码状态,可能绕过某些安全限制

方法三:双重URL编码终极绕过

对于更严格的过滤环境,可以采用二次编码策略:

source.php%253f../../../../../../../../ffffllllaaaagggg

执行流程

  1. 第一层urldecode%253f转换为%3f
  2. 第二层处理时%3f再解码为问号
  3. 最终实现与基础方法相同的效果,但能绕过更多防御

漏洞复现环境搭建

为了深入理解漏洞原理,建议搭建本地测试环境。以下是使用Docker快速搭建的指南:

FROM php:7.2-apache COPY src/ /var/www/html/ RUN chmod -R 755 /var/www/html

配套的PHP测试代码(保存为source.php):

<?php $file = $_GET['file']; if (emmm::checkFile($file)) { include($file); } else { echo "Access denied!"; }

启动命令:

docker build -t warmup . docker run -d -p 8080:80 warmup

防御方案与最佳实践

针对此类漏洞,我们推荐多层防御策略:

  1. 输入验证层

    • 使用绝对路径白名单而非相对路径
    • 禁止包含用户可控变量中的路径穿越符
  2. 服务器配置层

    <Directory "/var/www"> Options -Indexes -Includes AllowOverride None </Directory>
  3. 代码实现层

    function safeInclude($file) { $base = '/var/www/safe_dir/'; $real = realpath($base . $file); if (strpos($real, $base) === 0 && file_exists($real)) { include $real; } }

漏洞利用的进阶思考

在实际渗透测试中,文件包含漏洞往往与其他漏洞形成组合拳。例如:

  1. 结合日志注入实现代码执行
  2. 利用PHP伪协议(如php://filter)读取源码
  3. 配合文件上传实现webshell部署

一个有趣的技巧是使用zip://协议:

include('zip:///path/to/archive.zip%23malicious.php')

这种技术可以绕过某些基础的文件扩展名检查。

http://www.jsqmd.com/news/1143125/

相关文章:

  • Ciminion加密算法:专为ZK与MPC优化的密码学分析
  • 如何快速解锁Adobe脚本?3步掌握JSXBIN解码工具核心技巧
  • 如何在3分钟内用Real-ESRGAN-ncnn-vulkan让模糊图片变高清?终极实战指南
  • OpenEuler Enclave-Device-Plugins安全最佳实践:保护机密计算环境的关键策略
  • 论客观真理的绝对刚性与形式主义学术构建的寄生异化——基于“1+1=2”宇宙底层铁律对哥德尔定理、皮亚诺公理及波普尔范式的降维审视
  • 如何快速上手openEuler OpenDesign:10个图标资源使用技巧
  • euler-copilot-vectorize-agent开发者指南:从代码到贡献
  • openEuler安全加固工具实战:系统访问控制与权限管理完整指南
  • 为什么求导的图像跟原函数图像看起来“差不多”?这可以用来描述股票的 K 线吗?
  • 5个kmpi高效编程技巧,让你的HPC应用性能翻倍 [特殊字符]
  • CaseViewer 2.4安装教程(附安装包)数字病理切片查看图文教程
  • 为什么Barlow字体是现代设计的终极排版解决方案?
  • FlipIt翻页时钟:告别Flash时代的Windows屏保新选择
  • 大模型学习笔记 · 第八篇 · 进阶:偏好对齐与多卡训练
  • OpenFace实战指南:开源面部行为分析解决方案深度解析
  • 终极视频下载解决方案:yt-dlp-gui让YouTube视频下载变得前所未有的简单
  • RePKG:解锁Wallpaper Engine壁纸资源的专业工具
  • OpenDesign资源库完全指南:openEuler社区的终极设计资源宝库
  • perlporter命令行完全指南:10个实用参数助你高效构建RPM
  • 基于YOLOv5的行车记录仪道路病害智能检测系统开发指南
  • 【Bug已解决】Error: Cannot find module / MODULE_NOT_FOUND — Claude Code 模块缺失解决方案
  • 如何在5分钟内掌握英雄联盟智能战绩查询与BP辅助工具
  • 高精度ADC与MCU在振动监测系统中的应用
  • abichecker 高级配置:优化 ABI 检查性能的 7 个方法 [特殊字符]
  • UE4SS完全指南:掌握虚幻引擎游戏脚本与逆向工程的终极工具
  • 如何加入openEuler G11N社区?简单3步成为全球化贡献者
  • 2024年openEuler热门技术趋势:从AI大模型到云原生安全
  • kucg开发者入门:从零开始构建通信组件
  • warpdrive社区贡献指南:如何参与开源硬件加速项目开发
  • 口腔诊所如何做裂变引流?