资讯动态

WarmUp 题学习笔记:一次 PHP 代码审计的记录

发布时间:2026/10/26 18:23:16 来源:尧图企业网站定制
记录一下我做 HCTF 2018 WarmUp 这道题时的理解过程主要是搞懂几个一开始卡住我的问题。题目背景打开靶机只有一个滑稽图。查看源码发现注释提示source.php。访问后拿到源码访问hint.php得到提示flag 在ffffllllaaaagggg文件里。核心代码简化classemmm{publicstaticfunctioncheckFile($page){$whitelist[sourcesource.php,hinthint.php];// ... 若干检查 ...// 每次检查通过就 return true全部失败 return false}}if(!empty($_REQUEST[file])is_string($_REQUEST[file])emmm::checkFile($_REQUEST[file])){include$_REQUEST[file];// ← 真正读文件的地方}else{echoimg src滑稽图/;// ← 检查不过就显示图片}我的几个疑问与解答疑问 1checkFile 只是返回 trueflag 是怎么拿到的一开始我卡在这里函数只是返回一个 true那 flag 到底怎么出来搞懂后发现是三者配合缺一不可checkFile 的 true唯一作用是骗过安检让程序走到include那一行否则只显示滑稽图。它自己不读任何东西。include才是真正读文件的动作。它把参数当文件路径读出内容显示。../不是被执行的代码是文件路径里的上一级目录记号操作系统靠它一层层往上找文件。传入: ?filehint.php?/../../../../ffffllllaaaagggg ↓ checkFile 用 ? 截取出 hint.php → 在白名单 → 返回 true拿到门票 ↓ include 拿到的却是完整原路径 hint.php?/../../../../ffffllllaaaagggg ↓ 操作系统解析 ../ 一层层往上 → 定位到根目录的 ffffllllaaaagggg → 输出 flag关键漏洞点checkFile 检查的是截取后的值hint.php而 include 用的是截取前的原值。而且函数内部只把结果赋给$_page从没改过$page所以外面的$_REQUEST[file]一直保持原样。疑问 2../是怎么执行的../从不被执行。它是路径的一部分给操作系统看的导航include hint.php?/../../../../ffffllllaaaagggg 起点 /var/www/html hint.php? → 进入这个目录 ../ → 退回 html ../ → www ../ → var ../ → 根目录 / ffffllllaaaagggg → 目标文件说明hint.php?目录并不存在但操作系统会把某目录/../成对抵消掉路径归一化所以不用等它真实存在。这也解释了为什么要 4 个../1 个抵消hint.php?/3 个从 html 爬到根目录。疑问 3为什么 payload 前面要加file因为代码用$_REQUEST[file]取值。file是收件人名字必须和代码里的file对上?filehint.php?/../.. → $_REQUEST[file] hint.php?/../.. ↑名字 代码里的 [file] 取这个名字名字写错如写成pagePHP 就放进别的抽屉代码取不到等于白传。疑问 4file前面那个?是因为 checkFile 检查两次吗不是。payload 里其实有两个?作用完全不同http://目标/source.php ? file hint.php ? /../../../../ffffllllaaaagggg ↑ ↑ ①号 ? ②号 ?①号?URL 语法的固定标点分隔路径和参数所有网址都这样写和 checkFile 无关。去掉它服务器就不认file...是参数。②号?漏洞利用自己构造的给 checkFile 当截断点截出hint.php骗白名单。这个才和检查有关。疑问 5为什么我加的%23#不对我曾经写hint.php?%23/../../../想用#当分隔符。错在两点#在 URL 里是锚点标记浏览器会把#后面的内容截掉不发给服务器。服务器只收到hint.php?../全丢include 找不到文件。根本不需要#?本身就是分隔符后面直接接/../就行。正确写法hint.php?/../../../../ffffllllaaaagggg完整 Payload 与结果http://靶机/source.php?filehint.php?/../../../../ffffllllaaaaggggCTF2{6cf95f90-479b-4844-83dc-f388f6e9c43a}../层数看靶机目录深度本环境 4 层刚好实际可多试几层。一句话总结用?骗 checkFile 说我要访问 hint.php拿到 true 的门票但 include 真正读的还是那串带../的完整路径操作系统顺着../一层层往上爬把根目录的 flag 读了出来。学习记录欢迎指正。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑