hash_hmac函数使用不当造成的安全问题

近期有国外安全人员挖掘到api.wordpress.org的一个RCE漏洞,可以影响到远程更新的Wordpress网站。Wordpress开发者利用Github的WebHooks功能来进行源码的更新迭代,但是在服务端实现WebHooks的功能时hash_hmac未安全使用,造成了认证绕过,再利用后面代码的逻辑了进行了远程代码执行漏洞攻击。

有安全问题的代码

function verify_github_signature() {
	if ( empty( $_SERVER['HTTP_X_HUB_SIGNATURE'] ) )
		return false;

	list( $algo, $hash ) = explode( '=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2 );

	// Todo? Doesn't handle standard $_POST, only application/json
	$hmac = hash_hmac( $algo, file_get_contents('php://input' ), FEATURE_PLUGIN_GH_SYNC_SECRET );

	return $hash === $hmac;
}

以上代码出现在Wordpress开发者利用GitHub的WebHooks功能来进行代码自动化部署,修复后的代码可以点击这里查看。

为了验证POST请求是来自Github服务器,而不是来自恶意用户,GitHub使用SHA1生成散列并在头部提供签名:

X-Hub-Signature:sha1 = {hash}

通过计算hmac的只是否一致来进行判断。

php中的hash_hmac函数是什么

简单理解为一个带密钥的hash算法。

具体的实现流程

HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))

K代表密钥,M代表消息,H代表hash函数,opad为0x5c,ipad为0×36

当H为md5是,相应的python实现代码如下

from hashlib import md5

trans_5C = bytearray((x ^ 0x5c) for x in range(256))
trans_36 = bytearray((x ^ 0x36) for x in range(256))
blocksize = md5().block_size # 64

def hmac_md5(key, msg):
   if len(key) > blocksize:
       key = md5(key).digest()
   key = key + bytearray(blocksize - len(key))
   o_key_pad = key.translate(trans_5C)
   i_key_pad = key.translate(trans_36)
   return md5(o_key_pad + md5(i_key_pad + msg).digest())

 

寻找带有缺陷的哈希函数

正如上面指出的,webhook让允许自己选择哈希算法。 PHP提供了许多非加密安全散列函数,可以通过hash_algos查询获知支持的函数列表,如crc32,fnv32和adler32,它们生成32位散列。 这些散列函数是校验和,其被设计为检验数据传输时是否出现了差错,它们不是为了提供安全而设计的。如果可以找到一个足够弱的散列算法,然后采用穷举的手法去猜测发送的数据能被服务端检验通过发的哈希值,从而绕过服务端的验证。

分析下adler32,它实际上是两个16位哈希函数,其输出连接在一起。当处理短的数据时,它有一个已知的实现缺陷。 当与PHP的hash_hmac函数组合时,第二轮哈希将只传递68字节的数据到adler32,这严重限制了哈希过程开始时产生的哈希量。不仅散列的总数受到限制,而且在散列空间中也存在显着的不均匀性。即使提供不同的数据也会导致许多散列是相同的。可能的校验和值的分布类似于滚动骰子,其中7是最可能的结果,并且滚动该范围中的任何值的概率将从中值出来(6和8将具有下一个最高概率)。

poc中的代码能够将请求量从2 ^ 32减少到大约100,000到400,000。 

本地测试

带上X-Hub-Signature,且使用哈希函数adler32, 访问github-webhook-handler.php,为了方便验证在服务端打印了当前的哈希值。

165351_ZkbX_569022.png

然后再利用po.php去生成哈希值,可以看到找到了服务端生成的hash值。 

Clipboard Image.png

相关链接

http://php.net/manual/zh/function.hash-hmac.php

https://en.wikipedia.org/wiki/Adler-32#Weakness

https://www.wordfence.com/blog/2016/11/hacking-27-web-via-wordpress-auto-update/

*本文作者:漏洞盒子,转载须注明来自FreeBuf黑客与极客(FreeBuf.COM)

转载于:https://my.oschina.net/safedog/blog/809146

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值