靶场地址
一句话漏洞点
.git 目录泄露源码,PHP 源码中 md5($user) == md5($pass) && $user != $pass 可用数组绕过。
先常规试访问 /.git/,被拒绝
说明目录存在但被拦,改用工具拉取源码。

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 值却要相等。

传数组,两个 md5() 都返回 null,比较成立
http://challenge-6aa607a533448e86.sandbox.ctfhub.com:10800/index.php?user[]=1&pass[]=2md5() 只接受字符串,收到数组会报错并返回 null;null == null 为真,[1] != [2] 也为真,两个条件同时满足。

拿到 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)