長度擴充攻擊 | Length Extension Attack (LEA)

常見的雜湊函數 md5, sha1, sha2, sha256, …

其中的過程其實跟 CBC 長得蠻像的,先切成一塊一塊的 block 去做 Hash (blocksize = 128, 256, 512, … 依算法而定)

與 Blockcipher 一樣,最後一塊長度不足的部分會用 Padding 補齊,再填上整段文字的長度。

前一個 block Hash 完的結果會作為下一個 block 的輸入來輸出下一個 Hash

Hash(m)=Hash(m) =

NHash(m1)Hash(m2)...Hash(mk+padding+length)N \rightarrow Hash(m1) \rightarrow Hash(m2) \rightarrow ... \rightarrow Hash(m_k + padding + length)

前面的這個 N 是 Magic number

不同的演算法,內部有定義一個 Magic number ,就是以這個開始做計算的


Length Extension Attack

該攻擊手法就是把得到的 Hash 值,作為 Magic number 繼續 hash 下去 。

舉個例子,當我把 mm 拿去做 Hash 時,實際上還是以 Magic number (N)(N) 為初始值,並把 mm 做成多個 block 一段一段算過去。

NHash(m1)...Hash(mk+padding+length)VN \rightarrow Hash(m1) \rightarrow ... \rightarrow Hash(mk + padding + length) \rightarrow V

所以,如果我把結果的 (V)(V) 作為起始值 (N)(N) 並且隨便輸入個 (E)(E) 來 Hash

VHash(E)VV \rightarrow Hash(E) \rightarrow V'

由於前方的 VV 就是 Hash(m)Hash(m) 的結果,展開就會變成:

NHash(m)Hash(E)VN \rightarrow Hash(m) \rightarrow Hash(E) \rightarrow V'


結論

我們可以透過輸入 m 得到的 VV

來預測出輸入 m + padding + length + EVV',以通過一些驗證

padding 的部分有一定的格式,照做就好

大部分的 Server 會在做 Hash 之前加個 salt 或是 secret 之類的,以致於 length 無法確定,不過可以透過暴力搜尋,來找到這個長度的值

接下來就可以任意偽造 EE 來達到自己的目的囉