很久以前打了场CTF比赛,在论坛里求解,此时90大大丢给了我答案(在这里谢谢90大大),然而我和一些论坛里的朋友并不知道原理。在这里与大家分享一下。
-------------------------------------------------------------------华丽丽的分割线-----------------------------------------------------------------------------------------
题目源代码如下:
[PHP] 纯文本查看 复制代码 <?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是一种弱类型的语言。双==其实就是弱类型。
这里举出一些例子:
[PHP] 纯文本查看 复制代码 0=='0'//True
123=='123'//True
123=='123abc'//True
'abc'=='0'//True
现在看一下90大大给的md5=0e091414744693913505115617781878,这一串intval()之后就是0,而400035577431加密后为0e091414744693913505115617781878,intval()之后也是0,所以相等。
|