2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

科普:哈希長度擴展攻擊淺析

 JP_Morgen 2014-05-18

  貌似大多數(shù)滲透師都很少測試密碼學方面的漏洞。我一直都對密碼學頗有興趣,于是決定研究web應用開發(fā)者誤用加密算法的情況,以及如何利用這些漏洞。

科普:哈希長度擴展攻擊

  一月份的時候,我研究了下對于一些比較弱的Message Authentication codes(MACs)[譯者注:關于MAC與hash的區(qū)別參見此鏈接],如何進行哈希長度擴展(hash length extension)攻擊。我發(fā)現(xiàn)一些很不錯的論文和博文,談到了這種攻擊方式。然而,針對哈希長度擴展攻擊的具體細節(jié),卻鮮有資料。在這篇文章中,我將會對此進行詳細解釋。

  Message Authentication Codes 101

  Message authentication codes (MACs)是用于驗證信息真實性的。最簡單的MAC算法是這樣的:服務器把key和message連接到一起,然后用摘要算法如MD5或SHA1取摘要。例如,假設有一個網(wǎng)站,在用戶下載文件之前需驗證下載權限。這個網(wǎng)站會用如下的算法產(chǎn)生一個關于文件名的MAC:

  def create_mac(key, fileName)

  return Digest::SHA1.hexdigest(key + fileName)

  End

  最終產(chǎn)生的URL會是這樣:

  http:///download?file=report.pdf&mac=563162c9c71a17367d44c165b84b85ab59d036f9

  當用戶發(fā)起請求要下載一個文件時,將會執(zhí)行下面這個函數(shù):

  def verify_mac(key, fileName, userMac)

  validMac = create_mac(key, filename)

  if (validMac == userMac) do

  initiateDownload()

  else

  displayError()

  end

  End

  這樣,只有當用戶沒有擅自更改文件名時服務器才會執(zhí)行initiateDownload()開始下載。實際上,這種生成MAC的方式,給攻擊者在文件名后添加自定義字串留下可乘之機。

  Length Extension Attacks, The Simple

  Explanation

  哈希摘要算法,如MD5,SHA1, SHA2等,都是基于Merkle–Damgrd結(jié)構(gòu)。這類算法有一個很有意思的問題:如果你知道m(xù)essage和MAC,只需再知道key的長度,盡管不知道key的值,也能在message后面添加信息并計算出相應MAC。

  Example: message + padding +extension

  繼續(xù)用上面的例子,對文件下載的功能進行長度擴展攻擊:

  http:///download?file=

  report.pdf%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%00%00%00%00%00%00%00%00%00%00%00%A8/../

  ../../../../../../etc/passwd&mac=ee40aa8ec0cfafb7e2ec4de20943b673968857a5

  Length Extensions In Depth

  為了理解這種攻擊方式,你必須先了解hash函數(shù)的內(nèi)部原理。

  How Hash Algorithms Work

  哈希函數(shù)以區(qū)塊為單位操作數(shù)據(jù)。比如說,MD5, SHA1, SHA256的區(qū)塊長度是512 bits 。大多數(shù)message的長度不會剛好可以被哈希函數(shù)的區(qū)塊長度整除。這樣一來,message就必須被填充(padding)至區(qū)塊長度的整數(shù)倍。用前面文件下載的MAC的例子來說,填充后的message是這樣的(‘x'表示key):

  xxxxxxxxxxxreport.pdf\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\x00\x00\x00\x00\x00\x00

  \x00\x00\x00\x00\x00\xA8

  在本例所用的SHA1算法中,哈希值由五組整數(shù)構(gòu)成。一般我們看到的形式是把這五個整數(shù)轉(zhuǎn)換為16進制然后連接到一起。運行算法時,初始值(又叫registers)被設置為這組數(shù):67452301, EFCDAB89,

  98BADCFE, 10325476, C3D2E1F0. 緊接著,填充message,再將其分割為512bits的區(qū)塊。算法輪流操作每個區(qū)塊,進行一系列的計算并更新registers的值。一旦完成了這些運算,registers里的值就是最終的哈希值。

  Calculating An Extension

  計算擴展值得第一步是創(chuàng)建一個新的MAC。我們首先對待擴展的值:上例中的‘/../../../../../../../etc/passwd’進行哈希摘要。但是,在進行摘要之前,我們要把registers里的初始值設置為原始message的MAC。你可以將其想象為讓SHA1函數(shù)從服務器上的函數(shù)運行結(jié)束的地方繼續(xù)進行。

  攻擊者的 MAC = SHA1(extension + padding) <- 覆蓋registers初始值

  這個攻擊有個前提,在傳入服務器的哈希函數(shù)時,擴展值必須存在于單獨的區(qū)塊中。所以我們的第二步,就是計算出一個填充值使得 key + message + padding == 512 bits 的整數(shù)倍。在此例中,key是11個字符的長度。因此填充之后的message是這樣的:

  report.pdf\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xA8

  傳送到服務器的填充及擴展之后的message以及新的MAC:

  http:///download?file=report.pdf%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%00%00%00%00%00%00%00%00%00%

  00%00%A8/../../../../../../../etc/

  passwd&mac=ee40aa8ec0cfafb7e2ec4de20943b673968857a5

  服務器要進行摘要運算的被攻擊者篡改過的message如下:

  secret + message + padding to the next block +

  extension + padding to the end of that block.

  服務器算出的哈希值將是ee40aa8ec0cfafb7e2ec4de20943b673968857a5,正好與我們添加擴展字串并覆蓋registers初始值所計算出來的一樣。這是因為攻擊者的哈希計算過程,相當于從服務器計算過程的一半緊接著進行下去。

  How To Run The Attack

  為了簡單,在這個例子中我透露了密鑰長度是11位。在現(xiàn)實攻擊環(huán)境中,攻擊者無法獲知密鑰長度,需要對其長度進行猜測。

  繼續(xù)之前的例子,假設當MAC驗證失敗時,這個存在漏洞的網(wǎng)站會返回一個錯誤信息(HTTP response code 或者response body中的錯誤消息之類)。當驗證成功,但是文件不存在時,也會返回一個錯誤信息。如果這兩個錯誤信息是不一樣的,攻擊者就可以計算不同的擴展值,每個對應著不同的密鑰長度,然后分別發(fā)送給服務器。當服務器返回表明文件不存在的錯誤信息時,即說明存在長度擴展攻擊,攻擊者可以隨意計算新的擴展值以下載服務器上未經(jīng)許可的敏感文件。

  How To Defend Against This Attack

  解決這個漏洞的辦法是使用HMAC算法。該算法大概來說是這樣 :MAC =

  hash(key + hash(key + message)),而不是簡單的對密鑰連接message之后的值進行哈希摘要。

  具體HMAC的工作原理有些復雜,但你可以有個大概的了解。重點是,由于這種算法進行了雙重摘要,密鑰不再受本文中的長度擴展攻擊影響。HMAC最先是在1996年被發(fā)表,之后幾乎被添加到每一種編程語言的標準函數(shù)庫中。

  Summary

  盡管仍有一些瘋狂的人類在寫自己的加密算法,絕大多數(shù)人已經(jīng)漸漸發(fā)現(xiàn)自己寫加密算法不是什么好主意。然而,不單純的套用公開的加密算法也是有其意義的,前提是你能夠正確的使用這些加密算法。除非你徹底吃透你使用的加密算法的原理,并懂得如何正確使用,否則還是直接用那些經(jīng)過了專業(yè)級審查的高級算法庫要安全些。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多