哈希長度擴展攻擊的簡介以及HashPump安裝使用方法


哈希長度擴展攻擊(hash length extension attacks)是指針對某些允許包含額外信息的加密散列函數的攻擊手段。該攻擊適用於在消息與密鑰的長度已知的情形下,所有采取了 H(密鑰 ∥ 消息) 此類構造的散列函數。MD5和SHA-1等基於Merkle–Damgård構造的算法均對此類攻擊顯示出脆弱性。

如果一個應用程序是這樣操作的:

  1. 准備了一個密文和一些數據構造成一個字符串里,並且使用了MD5之類的哈希函數生成了一個哈希值(也就是所謂的signature/簽名)
  2. 讓攻擊者可以提交數據以及哈希值,雖然攻擊者不知道密文
  3. 服務器把提交的數據跟密文構造成字符串,並經過哈希后判斷是否等同於提交上來的哈希值

這個時候,該應用程序就易受長度擴展攻擊,攻擊者可以構造出{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"鍵請刷新或者換瀏覽器)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM