• <kbd id="qyk40"></kbd>
  • <strike id="qyk40"></strike><samp id="qyk40"><pre id="qyk40"></pre></samp>



    最近一個(gè)被稱為“Magic Hash”的PHP漏洞可以使得攻擊者非法獲取用戶的賬號(hào)信息。漏洞原因是PHP以一種特定的方式處理被哈希的字符串,攻擊者可以利用其從中嘗試并可能獲取密碼,繞過登錄認(rèn)證系統(tǒng)和其它運(yùn)行在PHP哈希比較之上的函數(shù)。

    漏洞描述

    PHP在處理哈希字符串時(shí),會(huì)利用”!=”或”==”來對(duì)哈希值進(jìn)行比較,它把每一個(gè)以”0E”開頭的哈希值都解釋為0,所以如果兩個(gè)不同的密碼經(jīng)過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會(huì)認(rèn)為他們相同,都是0。

    攻擊者可以利用這一漏洞,通過輸入一個(gè)經(jīng)過哈希后以”0E”開頭的字符串,即會(huì)被PHP解釋為0,如果數(shù)據(jù)庫中存在這種哈希值以”0E”開頭的密碼的話,他就可以以這個(gè)用戶的身份登錄進(jìn)去,盡管并沒有真正的密碼。

    攻擊案例: 

    4月8日,wordpress發(fā)布了一個(gè)重要更新,在該次更新中,修復(fù)了一系列安全漏洞。其中最顯眼的就是cookie偽造漏洞(CVE -2014- 0166)。

    我們來看修補(bǔ)的代碼:

        $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 ) ) {

    前日嘗試分析該漏洞,奈何知識(shí)匱乏,對(duì)php特性不夠了解,一連用了幾個(gè)小時(shí)都想不出。想不通為何加了一次hash_hmac就可以修復(fù)漏洞。當(dāng)時(shí)的我以為是涉及到了加密算法上的一些問題,就放棄了。

    今日突然看到一篇文章,頓悟是comparision operator的問題。其實(shí)之前也有注意到 “!=” 與 “!==” 這兩個(gè)符號(hào)的不同,不過大致想了一下沒想到利用的可能,就把重點(diǎn)放在了hash_hmac上。也許這是wordpress的障眼法?呵呵,說笑。

    我們把全部的關(guān)注點(diǎn)放到 “!=” 與 “!==” 上來:

    我們知道php比較相等性的運(yùn)算符有兩種,一種是strict,一種是non-strict。php manual中是這樣定義的:

     

    "==="和"!=="即strict比較符,只有在類型相同時(shí)才相等。"=="和"!="即non-strict比較符,會(huì)在類型轉(zhuǎn)換后進(jìn)行比較。

    再看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
    ?>

    字符串在與數(shù)字比較前會(huì)自動(dòng)轉(zhuǎn)換為數(shù)字,所以0=="a"了。

    另外兩個(gè)字符串比較,如果兩個(gè)都是數(shù)字形式,則同時(shí)轉(zhuǎn)換為數(shù)字進(jìn)行比較,所以"1"=="01"。

    這時(shí)你要問了,wordpress的代碼中是將cookie中的hash和真實(shí)hash這兩個(gè)hash的字符串進(jìn)行比較,和這個(gè)有什麼關(guān)系呢?

    我們注意上面"10"=="1e1"這個(gè)例子,php智能的將科學(xué)計(jì)數(shù)形式的字符串轉(zhuǎn)換為對(duì)應(yīng)數(shù)字(1e1 = 1*10^1 = 1)。兩個(gè)不同的字符居然相等了,不知到這裡你是否得到了啟示?

    好吧,來一個(gè)明顯的,你一定會(huì)恍然大悟:

    var_dump("0e123456789012345678901234567890"==="0") //false
    var_dump("0e123456789012345678901234567890"=="0") //true

    當(dāng)hash以"0exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"之類的形式出現(xiàn)時(shí),與"0"相等。

    讓我們回到wordpress的驗(yàn)證代碼上來。先生成根據(jù)用戶名($username)、密碼($pass_frag)、cookie有效期($expiration)、wp-config.php中的key($key)四個(gè)信息計(jì)算出對(duì)應(yīng)的$hash (算法很簡單,不細(xì)說), 然后用cookie中取得的$hmac值與之進(jìn)行比較($hmac != $hash ?),從而驗(yàn)證cookie有效性。

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

    我們能控制的變量有$username和$expiration,其中$username需要固定。于是我們可以通過控制cookie中的$expiration去改變$hash的值,然后將cookie中的$hmac設(shè)置為0

    只要不斷改變$expiration,直到滿足$hash=="0"的$hash出現(xiàn),就成功偽造了有效的cookie。

    當(dāng)然,通過粗略的數(shù)學(xué)概率運(yùn)算即可推知,滿足條件的hash出現(xiàn)概率非常之低:

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

    接近三億個(gè)請(qǐng)求才有一個(gè)可碰上的概率,嗚嗚~

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

     

    怎么樣,少年,寫一個(gè)多線程腳本跑起?

    影響范圍

    影響大量web站點(diǎn),其中的登錄認(rèn)證,“忘記密碼”,二進(jìn)制校驗(yàn),cookie等方面,由于都會(huì)用到PHP中的哈希函數(shù)值比較,因此都存在隱患。

    解決方案

    分析使用PHP的web站點(diǎn)中哈希比較函數(shù),將其中的”==”,”!=”分別更改為”===”和”!===”。

    穩(wěn)定

    產(chǎn)品高可用性高并發(fā)

    貼心

    項(xiàng)目群及時(shí)溝通

    專業(yè)

    產(chǎn)品經(jīng)理1v1支持

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽(yù)

    堅(jiān)持

    10年專注高端品質(zhì)開發(fā)
    • 返回頂部
    老司机国内精品久久久久| 亚洲精品国产va在线观看蜜芽| 国产福利微拍精品一区二区| 亚洲国产精品福利片在线观看 | 国产AV午夜精品一区二区三| 综合91在线精品| 欧美日韩综合一区二区三区| 国产亚洲美女精品久久| 国内精品国语自产拍在线观看91| 国产精品扒开腿做爽爽爽的视频| 曰韩精品无码一区二区三区| 亚洲国产婷婷综合在线精品| 精品国精品自拍自在线| 日韩高清在线免费看| 午夜一级日韩精品制服诱惑我们这边 | 国产99视频精品专区| 亚洲精品日韩一区二区小说| 国产无套精品一区二区| 国产成人亚洲精品影院| 五月天婷亚洲天综合网精品偷| 日韩免费视频网站| 在线精品日韩一区二区三区| 日韩美女一级毛片| 精品视频免费在线| 拍国产乱人伦偷精品视频| 精品福利视频第一| 精品无码黑人又粗又大又长 | 99re热久久这里只有精品6| 久久香蕉超碰97国产精品 | 欧美精品久久久久a片一二三区| 亚洲综合精品第一页| 香蕉久久丫精品忘忧草产品| 日韩精品射精管理在线观看| 日产精品一卡2卡三卡4乱码| 国产欧美另类久久久精品图片| 国产精品久久国产精麻豆99网站| 麻豆国产精品入口免费观看| 国产精品videossex另类| 亚洲日韩激情无码一区| 亚洲欧美日韩久久精品| 无码人妻精品一区二|