PHP Hash比较存在缺陷,影响大量Web网站登录认证、忘记密码等关键业务


发布人:admin分类:网络安全浏览量:22发布时间:2017-12-12

  

最近一个被称为“Magic Hash”的PHP漏洞可以使得攻击者非法获取用户的账号信息。漏洞原因是PHP以一种特定的方式处理被哈希的字符串,攻击者可以利用其从中尝试并可能获取密码,绕过登录认证系统和其它运行在PHP哈希比较之上的函数。

漏洞描述

PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

攻击者可以利用这一漏洞,通过输入一个经过哈希后以”0E”开头的字符串,即会被PHP解释为0,如果数据库中存在这种哈希值以”0E”开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。

攻击案例: 

4月8日,wordpress发布了一个重要更新,在该次更新中,修复了一系列安全漏洞。其中最显眼的就是cookie伪造漏洞(CVE -2014- 0166)。

我们来看修补的代码:

    $key = wp_hash($username . $pass_frag . '|' . $expiration, $scheme);
    $hash = hash_hmac('md5', $username . '|' . $expiration, $key);
 
 -  if ( $hmac != $hash ) {
 +  if ( hash_hmac( 'md5', $hmac, $key ) !== hash_hmac( 'md5', $hash, $key ) ) {

前日尝试分析该漏洞,奈何知识匮乏,对php特性不够了解,一连用了几个小时都想不出。想不通为何加了一次hash_hmac就可以修复漏洞。当时的我以为是涉及到了加密算法上的一些问题,就放弃了。

今日突然看到一篇文章,顿悟是comparision operator的问题。其实之前也有注意到 “!=” 与 “!==” 这两个符号的不同,不过大致想了一下没想到利用的可能,就把重点放在了hash_hmac上。也许这是wordpress的障眼法?呵呵,说笑。

我们把全部的关注点放到 “!=” 与 “!==” 上来:

我们知道php比较相等性的运算符有两种,一种是strict,一种是non-strict。php manual中是这样定义的:

"==="和"!=="即strict比较符,只有在类型相同时才相等。"=="和"!="即non-strict比较符,会在类型转换后进行比较。

再看php manual中给出的例子:

<?php
var_dump(0 == "a"); // 0 == 0 -> 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"相等。

让我们回到wordpress的验证代码上来。先生成根据用户名($username)、密码($pass_frag)、cookie有效期($expiration)、wp-config.php中的key($key)四个信息计算出对应的$hash (算法很简单,不细说), 然后用cookie中取得的$hmac值与之进行比较($hmac != $hash ?),从而验证cookie有效性。

另外提下,cookie的格式是这样的:wordpress_hashofurl=username|expiration|hmac

我们能控制的变量有$username和$expiration,其中$username需要固定。于是我们可以通过控制cookie中的$expiration去改变$hash的值,然后将cookie中的$hmac设置为0

只要不断改变$expiration,直到满足$hash=="0"的$hash出现,就成功伪造了有效的cookie。

当然,通过粗略的数学概率运算即可推知,满足条件的hash出现概率非常之低:

P = Sum(10^n,n=0,30)/16^32 = 3.26526*10^-9

接近三億個請求才有一個可碰上的概率,嗚嗚~

有時看人品,人品好的很快就碰到了,人品不好的就如我,幾乎五億了:

怎么样,少年,写一个多线程脚本跑起?

影响范围

影响大量web站点,其中的登录认证,“忘记密码”,二进制校验,cookie等方面,由于都会用到PHP中的哈希函数值比较,因此都存在隐患。

解决方案

分析使用PHP的web站点中哈希比较函数,将其中的”==”,”!=”分别更改为”===”和”!===”。

*参考译文:securityaffairsdarkreading,freebuf,转载须注明来自FreeBuf黑客与极客(FreeBuf.COM)


被黑站点统计 - 文章版权1、本主题所有言论和图片纯属会员个人意见,与本文章立场无关
2、本站所有主题由该文章作者发表,该文章作者与被黑站点统计享有文章相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和被黑站点统计的同意
4、文章作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、被黑站点统计管理员有权不事先通知发贴者而删除本文

免责声明

本站主要通过网络搜集国内被黑网站信息,统计分析数据,为部署安全型网络提供强有力的依据.本站所有工作人员均不参与黑站,挂马或赢利性行为,所有数据均为网民提供,提交者不一定是黑站人,所有提交采取不记名,先提交先审核的方式,如有任何疑问请及时与我们联系.

admin  的文章


微信公众号

微信公众号


Copyright © 2012-2022被黑网站统计系统All Rights Reserved
页面总访问量:21272375(PV) 页面执行时间:54.985(MS)
  • xml
  • 网站地图