使用Hash碰撞进行DoS攻击
一、哈希表碰撞攻擊的基本原理
哈希表是一種查找效率極高的數(shù)據(jù)結(jié)構(gòu),很多語(yǔ)言都在內(nèi)部實(shí)現(xiàn)了哈希表。PHP中的哈希表是一種極為重要的數(shù)據(jù)結(jié)構(gòu),不但用于表示Array數(shù)據(jù)類型,還在Zend虛擬機(jī)內(nèi)部用于存儲(chǔ)上下文環(huán)境信息(執(zhí)行上下文的變量及函數(shù)均使用哈希表結(jié)構(gòu)存儲(chǔ))。
理想情況下哈希表插入和查找操作的時(shí)間復(fù)雜度均為O(1),任何一個(gè)數(shù)據(jù)項(xiàng)可以在一個(gè)與哈希表長(zhǎng)度無(wú)關(guān)的時(shí)間內(nèi)計(jì)算出一個(gè)哈希值(key),然后在常量時(shí)間內(nèi)定位到一個(gè)桶(術(shù)語(yǔ)bucket,表示哈希表中的一個(gè)位置)。當(dāng)然這是理想情況下,因?yàn)槿魏喂1淼拈L(zhǎng)度都是有限的,所以一定存在不同的數(shù)據(jù)項(xiàng)具有相同哈希值的情況,此時(shí)不同數(shù)據(jù)項(xiàng)被定為到同一個(gè)桶,稱為碰撞(collision)。哈希表的實(shí)現(xiàn)需要解決碰撞問(wèn)題,碰撞解決大體有兩種思路,第一種是根據(jù)某種原則將被碰撞數(shù)據(jù)定為到其它桶,例如線性探測(cè)——如果數(shù)據(jù)在插入時(shí)發(fā)生了碰撞,則順序查找這個(gè)桶后面的桶,將其放入第一個(gè)沒(méi)有被使用的桶;第二種策略是每個(gè)桶不是一個(gè)只能容納單個(gè)數(shù)據(jù)項(xiàng)的位置,而是一個(gè)可容納多個(gè)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(例如鏈表或紅黑樹(shù)),所有碰撞的數(shù)據(jù)以某種數(shù)據(jù)結(jié)構(gòu)的形式組織起來(lái)。
不論使用了哪種碰撞解決策略,都導(dǎo)致插入和查找操作的時(shí)間復(fù)雜度不再是O(1)。以查找為例,不能通過(guò)key定位到桶就結(jié)束,必須還要比較原始key(即未做哈希之前的key)是否相等,如果不相等,則要使用與插入相同的算法繼續(xù)查找,直到找到匹配的值或確認(rèn)數(shù)據(jù)不在哈希表中。
PHP是使用單鏈表存儲(chǔ)碰撞的數(shù)據(jù),因此實(shí)際上PHP哈希表的平均查找復(fù)雜度為O(L),其中L為桶鏈表的平均長(zhǎng)度;而最壞復(fù)雜度為O(N),此時(shí)所有數(shù)據(jù)全部碰撞,哈希表退化成單鏈表。下圖PHP中正常哈希表和退化哈希表的示意圖。
哈希表碰撞攻擊就是通過(guò)精心構(gòu)造數(shù)據(jù),使得所有數(shù)據(jù)全部碰撞,人為將哈希表變成一個(gè)退化的單鏈表,此時(shí)哈希表各種操作的時(shí)間均提升了一個(gè)數(shù)量級(jí),因此會(huì)消耗大量CPU資源,導(dǎo)致系統(tǒng)無(wú)法快速響應(yīng)請(qǐng)求,從而達(dá)到拒絕服務(wù)攻擊(DoS)的目的。
可以看到,進(jìn)行哈希碰撞攻擊的前提是哈希算法特別容易找出碰撞,如果是MD5或者SHA1那基本就沒(méi)戲了,幸運(yùn)的是(也可以說(shuō)不幸的是)大多數(shù)編程語(yǔ)言使用的哈希算法都十分簡(jiǎn)單(這是為了效率考慮),因此可以不費(fèi)吹灰之力之力構(gòu)造出攻擊數(shù)據(jù)。
二、如何防御
-
打補(bǔ)丁,修改hash算法。
-
限制POST的參數(shù)個(gè)數(shù),限制POST的請(qǐng)求長(zhǎng)度。
-
使用防火墻檢測(cè)異常請(qǐng)求
-
增加權(quán)限驗(yàn)證,最大可能的在jsonDecode()之前把非法用戶拒絕
-
重寫(xiě)jsonDecode()方法
分享一個(gè)可以導(dǎo)致hash碰撞的json串:https://raw.githubusercontent.com/laynefyc/php_thread_demo/master/javaHash.json
總結(jié)
以上是生活随笔為你收集整理的使用Hash碰撞进行DoS攻击的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DRDoS(memcache漏洞导致的反
- 下一篇: SSL工作原理