墨者学院 - PHP代码分析溯源(第2题)

根据题干看了好久的php隐式转换。。。

还是毫无头绪。。。

墨者学院 - PHP代码分析溯源(第2题)_第1张图片

这样的逻辑几乎是无解的。。。

md5(QNKCDZO,32) = 0e830400451993494058024219903391

 

根据PHP Hash比较存在缺陷

http://www.freebuf.com/news/67007.html

。。。在这道题中,最重要的一句话就是:

根据php的隐式转换可以知道 oe开头的md5都会转换成0
所以只要找到oe开头的字符串即可

必应搜索结果第一条:

墨者学院 - PHP代码分析溯源(第2题)_第2张图片

http://www.cnblogs.com/Primzahl/p/6018158.html

 

这就是题目啊,,,随便拿一个就OK了,,,

墨者学院 - PHP代码分析溯源(第2题)_第3张图片

 

16进制的数据中是含有e的,可以构建使得两个数字比较的,这里有一个现成的例子:

md5('240610708') 
//0e462097431906509019562988736854.
md5('QNKCDZO') 
//0e830400451993494058024219903391

可以看到,这两个字符串一个只包含数字,一个只包含字母,虽然两个的哈希不一样,但是都是一个形式:0e 纯数字这种格式的字符串在判断相等的时候会被认为是科学计数法的数字,先做字符串到数字的转换。

转换后都成为了0的好多好多次方,都是0,相等。(大家可以自己尝试一下)因此

md5('240610708')==md5('QNKCDZO'); //True
md5('240610708')===md5('QNKCDZO'); //False

用===可以避免这一漏洞。

 

你可能感兴趣的:(web)