18842388900

网站建设 APP开发 小程序

Article/文章

记录成长点滴 分享您我感悟

您当前位置>首页 > 知识 > 网站建设

PHP Hash更有缺陷并影响大量Web网站登录身份验证

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

漏洞描述

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

攻击者可以通过输入以“0E”开头的字符串开头的字符串来利用此漏洞,该字符串由PHP解释为0。如果数据库中的密码以“0E”开头,即使没有真实密码,他也可以以该用户身份登录。

攻击案例: 

4月8日,WordPress发布了一个重要的更新,其中修复了一系列安全漏洞。其中最突出的是cookie伪造漏洞(CVE-2014-0166)。

我们来看看修补后的代码:

$键=wp_hash($用户名$ pass_frag '|' $期满,$方案。); $散列=hash_hmac |; - 如果($ HMAC( 'MD5',$用户名 '' $期满,$键。) !=$散列){+如果(hash_hmac( 'MD5',$ HMAC,$键)!==hash_hmac( 'MD5',$散列,$键)){

我试图分析前一天的漏洞。我对php功能还不太了解。几个小时我都想不起来。我无法弄清楚为什么我添加了hash_hmac来修复漏洞。那时,我以为它与加密算法中的一些问题有关,并放弃了。

突然,我今天看到了一篇文章,顿悟是比较运算符的一个问题。事实上,我也注意到两个符号“!=”和“!==”之间的区别,但我想到了使用它的可能性,我专注于hash_hmac。也许这是WordPress的障碍?哦,开玩笑。

我们将所有问题都放在“!=”和“!==”:

我们知道php有两个相等的运算符,一个是严格的,另一个是非严格的。 php手册定义如下:

'==='和'!=='是严格的比较器,只有在类型相同时才相等。 '=='和'!='是非严格的比较器,在类型转换后进行比较。

看一下php手册中给出的例子:

< phpvar_dump(0=='A');> truevar_dump( '1'=='01'); //1==1→truevar_dump('10 '==' 1E1' ); //10==10→truevar_dump(100=='1E2'); //100==100->真>

字符串在与数字进行比较之前会自动转换为数字,因此0=='a'。

另外两个字符串比较(如果两者都是数字形式)同时转换为数字以进行比较,因此'1'=='01'。

此时你必须要问,wordpress代码是比较cookie的哈希值和哈希的真实哈希值,与此有什么关系?

让我们注意上面的例子'10'=='1e1',php智能将一串科学记数法转换为相应的数字(1e1=1 * 10 ^ 1=1)。两个不同的角色实际上是相等的。我想知道你是否得到了启示?

好的,来一个显而易见的,你一定会意识到:

的var_dump( '0e123456789012345678901234567890'==='0')//falsevar_dump( '0e123456789012345678901234567890'=='0')//真

当散列显示为'0exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'时,它等于'0'。

让我们回到wordpress验证码。首先根据wp-config.php中的用户名($ username),密码($ pass_frag),cookie有效期($ expiration)和密钥($ 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。

当然,粗略的数学概率运算可以推断出满足条件的概率非常低。

P=总和(10 ^ N,N-=0,30)/16^32=3.26526*10^-9

有近3亿个请求有可能遇到,呜呜〜

有时看着角色,角色非常好,角色不如我,差不多有5亿:

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

影响范围

影响大量网站,包括登录验证,“忘记密码”,二进制检查,cookie等,因为它们都使用PHP中的哈希函数值比较,因此存在隐患。

解决方案

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

网站建设,小程序开发,小程序制作,微信小程序开发,公众号开发,微信公众号开发,网页设计,网站优化,网站排名,网站设计,微信小程序设计,小程序定制,微信小程序定制

相关案例查看更多