根据题干看了好久的php隐式转换。。。
还是毫无头绪。。。
这样的逻辑几乎是无解的。。。
md5(QNKCDZO,32) = 0e830400451993494058024219903391
根据PHP Hash比较存在缺陷
http://www.freebuf.com/news/67007.html
。。。在这道题中,最重要的一句话就是:
根据php的隐式转换可以知道 oe开头的md5都会转换成0
所以只要找到oe开头的字符串即可
必应搜索结果第一条:
http://www.cnblogs.com/Primzahl/p/6018158.html
这就是题目啊,,,随便拿一个就OK了,,,
16进制的数据中是含有e的,可以构建使得两个数字比较的,这里有一个现成的例子:
md5('240610708')
//0e462097431906509019562988736854.
md5('QNKCDZO')
//0e830400451993494058024219903391
可以看到,这两个字符串一个只包含数字,一个只包含字母,虽然两个的哈希不一样,但是都是一个形式:0e 纯数字这种格式的字符串在判断相等的时候会被认为是科学计数法的数字,先做字符串到数字的转换。
转换后都成为了0的好多好多次方,都是0,相等。(大家可以自己尝试一下)因此
md5('240610708')==md5('QNKCDZO'); //True
md5('240610708')===md5('QNKCDZO'); //False
用===可以避免这一漏洞。