哈希長度擴展攻擊(hash length extension attacks)是指針對某些允許包含額外信息的加密散列函數的攻擊手段。該攻擊適用於在消息與密鑰的長度已知的情形下,所有采取了 H(密鑰 ∥ 消息) 此類構造的散列函數。MD5和SHA-1等基於Merkle–Damgård構造的算法均對此類攻擊顯示出脆弱性。
如果一個應用程序是這樣操作的:
- 准備了一個密文和一些數據構造成一個字符串里,並且使用了MD5之類的哈希函數生成了一個哈希值(也就是所謂的signature/簽名)
- 讓攻擊者可以提交數據以及哈希值,雖然攻擊者不知道密文
- 服務器把提交的數據跟密文構造成字符串,並經過哈希后判斷是否等同於提交上來的哈希值
這個時候,該應用程序就易受長度擴展攻擊,攻擊者可以構造出{secret || data || attacker_controlled_data}的哈希值。
--------------------------------------------------------------------
本文暫時不介紹其真正的原理(以后理解透了再補充好),
想要知道更多的可以訪問下面這個github上hash_extender作者的文章:
Everything you need to know about hash length extension attacks
也暫不介紹hash_extender的安裝方法,而是介紹HashPump(因為它支持python拓展。)
-----------------
1、HashPump安裝
HashPump是一個借助於OpenSSL實現了針對多種散列函數的攻擊的工具,支持針對MD5、CRC32、SHA1、SHA256和SHA512等長度擴展攻擊。而MD2、SHA224和SHA384算法不受此攻擊的影響,因其部分避免了對狀態變量的輸出,並不輸出全部的狀態變量。
(至於別的文章提到了MD4、RIPEMD-160、SHA-0、WHIRLPOOL等也可以構造長度擴展攻擊,等以后再研究。)
git clone https://github.com/bwall/HashPump apt-get install g++ libssl-dev cd HashPump make make install
至於想在python里實現hashpump,可以使用hashpumpy這個插件:
(注意還是得先安裝了libssl-dev)
pip install hashpumpy
推薦在linux里使用,使用方法可以這樣獲取:
python >>> import hashpumpy >>> help(hashpumpy.hashpump)
2、HashPump用法
這里以一個實驗吧題目為例,關鍵的代碼大概如下:
<?php $secret="XXXXXXXXXXXXXXX"; // This secret is 15 characters long for security! $username="admin"; $password = $_POST["password"]; if($COOKIE["getmein"] === md5($secret . urldecode($username . $password))){ echo "Congratulations! You are a registered user.\n"; die ("The flag is ". $flag); }else{ die("Your cookies don't match up! STOP HACKING THIS SITE."); } ?>
在題目里可以得到:
md5($secret."adminadmin")的值為571580b26c65f306376d4f64e53cb5c7
稍微整理下我們已經知道的:
$secret是密文,長度為15,如果再算上后面第一個admin,長度就是20
而數據是admin
簽名(哈希值)是571580b26c65f306376d4f64e53cb5c7
這時候我們使用HashPump,附加數據至少1位以上:
# hashpump Input Signature: 571580b26c65f306376d4f64e53cb5c7 Input Data: admin Input Key Length: 20 Input Data to Add: pcat
或者直接
hashpump -s 571580b26c65f306376d4f64e53cb5c7 -d admin -k 20 -a pcat
就會得到
3e67e8f0c05e1ad68020df30bbc505f5
admin\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00pcat
第一個是新的簽名,把它設置到cookies的getmein里。
第二個先把\x替換為%后,post提交
password=admin%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c8%00%00%00%00%00%00%00pcat
就可以通過了。
-------
ps.提供一個基於HashPump的在線網站:
http://sakurity.com/lengthextension
(可能得翻了牆才可以訪問,附加數據至少一位以上,message length為密文+數據的總長度,看不到"submit"鍵請刷新或者換瀏覽器)