hash_hmac函数使用不当造成的安全问题
2019獨角獸企業重金招聘Python工程師標準>>>
近期有國外安全人員挖掘到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 md5trans_5C = bytearray((x ^ 0x5c) for x in range(256)) trans_36 = bytearray((x ^ 0x36) for x in range(256)) blocksize = md5().block_size # 64def 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,這嚴重限制了哈希過程開始時產生的哈希量。不僅散列的總數受到限制,而且在散列空間中也存在顯著的不均勻性。即使提供不同的數據也會導致許多散列是相同的??赡艿男r灪椭档姆植碱愃朴跐L動骰子,其中7是最可能的結果,并且滾動該范圍中的任何值的概率將從中值出來(6和8將具有下一個最高概率)。
poc中的代碼能夠將請求量從2 ^ 32減少到大約100,000到400,000。?
本地測試
帶上X-Hub-Signature,且使用哈希函數adler32, 訪問github-webhook-handler.php,為了方便驗證在服務端打印了當前的哈希值。
然后再利用po.php去生成哈希值,可以看到找到了服務端生成的hash值。?
相關鏈接
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
總結
以上是生活随笔為你收集整理的hash_hmac函数使用不当造成的安全问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bzoj2653: middle
- 下一篇: oracle如何清空一个用户下的所有表中