news 2026/7/12 2:52:38

CTF Web 入门:从[HCTF 2018]WarmUp看PHP白名单绕过2种核心技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CTF Web 入门:从[HCTF 2018]WarmUp看PHP白名单绕过2种核心技巧

CTF Web 入门:从[HCTF 2018]WarmUp看PHP白名单绕过的2种核心技巧

在CTF Web安全竞赛中,PHP代码审计是常见的挑战类型。本文将以经典题目[HCTF 2018]WarmUp为例,深入剖析两种关键的PHP白名单绕过技巧,帮助初学者建立系统化的解题思路。

1. 题目背景与代码分析

首先我们查看题目提供的核心代码片段:

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; } $_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; } }

这段代码实现了一个白名单校验机制,主要功能点包括:

  1. 定义白名单$whitelist,仅允许访问source.phphint.php
  2. 通过in_array()检查输入是否在白名单中
  3. 使用mb_substr()mb_strpos()处理带参数的URL
  4. 对输入进行URL解码后再次检查

2. 关键PHP函数解析

2.1 mb_substr与mb_strpos组合

这两个函数在处理多字节字符时特别重要:

函数描述危险用法示例
mb_substr()安全的多字节字符串截取mb_substr($input, 0, mb_strpos($input.'?', '?'))
mb_strpos()返回字符串在另一字符串中首次出现的位置可能被用于构造特殊路径

典型利用场景

// 当输入为"source.php?../../../../flag"时 $_page = mb_substr($page, 0, mb_strpos($page.'?', '?')); // $_page = "source.php"

2.2 in_array函数特性

in_array()函数用于检查值是否存在于数组中:

// 严格模式关闭时存在类型转换问题 in_array("1", ["a", 1, "b"]); // 返回true

2.3 urldecode的双重解析

PHP会对GET参数自动进行一次URL解码,手动调用urldecode()可能导致双重解码:

原始输入: source.php%253f../../flag 第一次解码: source.php%3f../../flag 第二次解码: source.php?../../flag

3. 第一种绕过技巧:字符串截断

利用mb_substrmb_strpos的组合特性,我们可以构造特殊路径绕过检查:

  1. 构造原理

    • 在文件名后添加?字符
    • 利用截断获取白名单通过的前缀
    • 附加实际要访问的路径
  2. Payload示例

    /source.php?../../../../ffffllllaaaagggg
  3. 操作步骤

    • 检查source.php?的前缀source.php在白名单中
    • include实际加载的是source.php?../../../../ffffllllaaaagggg
    • 服务器解析时会忽略?后的路径参数

注意:这种技巧依赖于服务器对包含路径的特殊处理方式,不同环境可能有差异。

4. 第二种绕过技巧:双重URL编码

利用URL解码特性构造特殊输入:

  1. 构造原理

    • 对关键字符?进行双重编码(%253f)
    • 第一次自动解码为%3f
    • 第二次urldecode()解码为?
  2. Payload示例

    /source.php%253f../../../../ffffllllaaaagggg
  3. 代码执行流程

    $_page = urldecode("source.php%253f../../flag"); // 变为"source.php%3f../../flag" $_page = mb_substr($_page, 0, mb_strpos($_page.'?', '?')); // 截取后变为"source.php"

5. 防御方案对比

针对这类白名单绕过,开发者可以采取以下防护措施:

防护措施有效性实现复杂度
使用realpath()解析路径★★★★★中等
严格模式in_array(..., true)★★★☆☆简单
禁用危险函数如include★★★★★
白名单完整路径校验★★★★☆中等

6. 实战思维导图

以下是面对类似白名单校验时的通用解题思路:

  1. 确定白名单内容

    • 查找in_array或白名单数组定义
    • 确认允许访问的基础文件
  2. 分析校验逻辑

    • 检查字符串处理流程
    • 识别可能的截断点
  3. 尝试绕过方法

    • 参数附加法(添加?#
    • 路径遍历(../
    • 编码混淆(双重URL编码)
  4. 验证包含结果

    • 测试文件包含是否成功
    • 检查错误信息获取线索

7. 扩展训练建议

为了巩固这些技巧,建议尝试以下练习:

  1. 修改题目代码,使两种绕过方法都失效
  2. 在Docker环境中搭建类似题目
  3. 研究其他CTF题目中的白名单绕过案例
  4. 编写自动化检测脚本识别这类漏洞

掌握这些核心技巧后,面对大多数PHP白名单校验场景都能快速找到突破点。在实际CTF比赛中,灵活组合多种技巧往往能解决更复杂的挑战。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/12 2:52:28

Hadoop YARN 3.3.6 资源调度器对比:FIFO、容量与公平调度器 3 大场景实测

Hadoop YARN 3.3.6 资源调度器深度实战:FIFO、容量与公平调度器的性能对决与选型指南在大规模数据处理场景中,资源调度效率直接决定了集群的整体吞吐量和任务响应时间。作为Hadoop生态系统的核心资源管理平台,YARN 3.3.6版本对三种主流调度器…

作者头像 李华
网站建设 2026/7/12 2:50:48

Word 交叉引用 vs 尾注:2种参考文献方案对比与5个实操要点

Word参考文献管理终极指南:交叉引用与尾注深度对比学术写作中,参考文献管理是每个研究者必须掌握的技能。面对Word提供的多种解决方案,如何选择最适合自己工作流程的方法?本文将深入剖析两种主流技术方案——交叉引用与尾注&#…

作者头像 李华
网站建设 2026/7/12 2:50:30

VS Code 1.90 系统级安装配置:3步解决多用户共享与右键菜单集成

VS Code 1.90 系统级安装配置:3步解决多用户共享与右键菜单集成 在企业级开发环境中,如何让VS Code成为团队协作的高效工具?System Installer版本正是为多用户环境设计的专业解决方案。与常见的User Installer不同,系统级安装能实…

作者头像 李华
网站建设 2026/7/12 2:50:10

AD原理图库与PCB库关联指南:解决Footprint Not Found的5种方法

AD原理图库与PCB库关联指南:解决Footprint Not Found的5种方法当你在Altium Designer中完成原理图设计,准备将设计导入PCB时,最令人沮丧的莫过于遇到"Footprint Not Found"错误。这个看似简单的提示背后,往往隐藏着复杂…

作者头像 李华
网站建设 2026/7/12 2:49:22

3种NDVI时序滤波方法对比:HANTS vs SG vs Whittaker 在GEE中的实现与效果

NDVI时序滤波三剑客:HANTS、SG与Whittaker在GEE中的实战对比当遥感分析师面对被云层污染、大气扰动扭曲的NDVI时间序列数据时,如何选择最合适的滤波算法?本文将带您深入探索三种主流方法——HANTS谐波分析、Savitzky-Golay滤波和Whittaker平滑…

作者头像 李华