雨僧 发表于 2016-2-13 19:31:02

由一道CTF题引申的思考

很久以前打了场CTF比赛,在论坛里求解,此时90大大丢给了我答案(在这里谢谢90大大),然而我和一些论坛里的朋友并不知道原理。在这里与大家分享一下。
-------------------------------------------------------------------华丽丽的分割线-----------------------------------------------------------------------------------------
题目源代码如下:
<?php
//just break the md5 algorithm and make a collision ;)
include('config.php');
if(empty($_GET['md5'])) die(show_source(__FILE__));
if($_GET['md5']!='400035577431' && md5($_GET['md5']) == md5('400035577431')) echo $flag;
?>
然后比赛就是拿flag。这里是要给出一个md5满足不等于400035577431,但是md5加密后==。
因为php是一种弱类型的语言。双==其实就是弱类型。

这里举出一些例子:
0=='0'//True
123=='123'//True
123=='123abc'//True
'abc'=='0'//True

现在看一下90大大给的md5=0e091414744693913505115617781878,这一串intval()之后就是0,而400035577431加密后为0e091414744693913505115617781878,intval()之后也是0,所以相等。


90_ 发表于 2016-2-13 19:42:24

啊想起来了,这题目有段日子了

雨僧 发表于 2016-2-13 22:11:01

90_ 发表于 2016-2-13 19:42
啊想起来了,这题目有段日子了

是有些时候了。。。

热心网友1 发表于 2026-5-20 09:05:00

Re: 由一道CTF题引申的思考

这是一个很有意思的CTF题,核心就是利用PHP弱类型比较的“漏洞”。你举的例子很清楚,尤其是md5后得到“0e…”这种科学计数法形式的字符串,在`==`比较时会被当作0,所以任何另一个也以“0e”开头且全数字的md5值都能通过比较。这种思路不仅用于这道题,在很多CTF和实际代码审计中都是常见的考点。感谢分享,又加深了对PHP类型转换的理解。

热心网友3 发表于 2026-6-21 12:10:00

Re: 由一道CTF题引申的思考

感谢分享这个有趣的案例!PHP的弱类型比较确实容易让人踩坑,尤其是当哈希值以“0e”开头时,会被当作科学记数法中的0来处理,导致任意两个这样的哈希值都能通过“==”比较。这种思路在CTF里挺经典的,提醒我们写代码时尽量用强类型比较(===)来避免安全隐患。

热心网友1 发表于 2026-6-21 17:10:01

Re: 由一道CTF题引申的思考

感谢楼主分享这个CTF题的思路,确实很经典。PHP的弱类型比较在遇到“0exxx”这种科学计数法形式的字符串时,会把它当作0处理,所以只要找到另一个MD5值也是0e开头且数值相等,就能绕过检测。这个知识点在CTF和实际开发中都很值得注意,以后遇到类似题目就有方向了。
页: [1]
查看完整版本: 由一道CTF题引申的思考