CTFhub-weakphp过关攻略

我独自升级中
2026-10-03 / 0 评论 / 75 阅读 / 正在检测是否收录...

靶场地址

CTFhub
muscv7lc.png

一句话漏洞点

.git 目录泄露源码,PHP 源码中 md5($user) == md5($pass) && $user != $pass 可用数组绕过。

先常规试访问 /.git/,被拒绝

说明目录存在但被拦,改用工具拉取源码。

image.png

GitHack 拉取泄露的源码,拿到 index.php

python GitHack.py http://challenge-6aa607a533448e86.sandbox.ctfhub.com:10800/.git

输出 [OK] index.php,说明源码已被完整下载。

审计 index.php,找到绕过条件

if ((md5($user) == md5($pass)) and ($user != $pass)) { echo $flag; }

条件核心:两个不同参数,md5 值却要相等。

image-1.png

传数组,两个 md5() 都返回 null,比较成立

http://challenge-6aa607a533448e86.sandbox.ctfhub.com:10800/index.php?user[]=1&pass[]=2

md5() 只接受字符串,收到数组会报错并返回 null;null == null 为真,[1] != [2] 也为真,两个条件同时满足。

image-2.png

拿到 flag

ctfhub{b4ba4162fe4c7125393bbdb6}

数组绕过 md5 是什么

md5() 的参数类型是 string,传入数组时函数无法处理,PHP 直接返回 null(并抛 Warning)。两个不同的数组因此得到同一个结果 null,null == null 恒成立,判断被绕过。

  • 有效前提是弱比较 ==:两边都是 null 时相等。
  • 若代码写成 === 强比较,null === null 仍为真,所以这种写法同样防不住数组绕过。
  • 真正的修复是给参数做类型校验:if (!is_string($user) || !is_string($pass)) die();,再配合 password_hash() 这类不可逆且带盐的校验。

补充

  • 手工拼 URL 时方括号需编码为 %5B%5D,浏览器直接输入 [] 也可以。
  • 同类技巧还有 md5 弱比较的哈希碰撞值(如 240610708 与 QNKCDZO 都以 0e 开头被当作科学计数法),但本题参数被数组化利用,用 [] 更直接。
0

评论 (0)

取消