自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

哈希函數(shù)的隱藏危險(xiǎn):長(zhǎng)度擴(kuò)展攻擊與服務(wù)端驗(yàn)證的安全隱患

安全 應(yīng)用安全
簡(jiǎn)而言之,將一個(gè) “1” 后面跟著 m 個(gè) “0”,再加上一個(gè) 64 位或 128 位的整數(shù),附加到消息的末尾,以生成長(zhǎng)度為 512*n 的填充消息。附加的整數(shù)是原始消息的長(zhǎng)度。然后,填充消息將被哈希函數(shù)處理為 n 個(gè) 512 位的塊。

簡(jiǎn)介

Length Extension Attack 是一種與某些特定類型的哈希函數(shù)(如 MD5,SHA-1 和 SHA-2)的特性有關(guān)的攻擊。簡(jiǎn)單來說,這種攻擊利用了一個(gè)事實(shí),即知道 H(message) 和 message 的長(zhǎng)度,我們可以輕松計(jì)算出 H(message || padding || extension) 而不需要知道 message 本身。其中 “||” 表示連接,“padding” 是根據(jù)哈希函數(shù)的規(guī)定添加的。

這是因?yàn)檫@些哈希函數(shù)使用了 Merkle-Damg?rd 結(jié)構(gòu),它將輸入切片為多個(gè)塊,并且每個(gè)塊的哈希值依賴于前一個(gè)塊的哈希值。這意味著一旦我們計(jì)算出了某個(gè)消息的哈希值,就有了一個(gè)狀態(tài),可以從那里開始并添加更多的塊。

一種服務(wù)端驗(yàn)證模式

為方便描述漏洞場(chǎng)景,我們首先假設(shè)有這樣一種服務(wù)端驗(yàn)證模式,即用戶嘗試登錄時(shí),服務(wù)端會(huì)根據(jù)用戶的 ID、名字以及一個(gè)僅服務(wù)端知道的 30 位密鑰,通過特定的哈希算法生成一個(gè)哈希值,并將其下發(fā)給客戶端。隨后,當(dāng)客戶端嘗試訪問某些特定接口,例如修改用戶權(quán)限的接口時(shí),服務(wù)端會(huì)根據(jù)前端 POST 的角色 ID、角色名字、角色權(quán)限以及同樣的 30 位密鑰,重新生成哈希進(jìn)行驗(yàn)證。如果上傳的哈希與服務(wù)端生成的哈希一致,則視為驗(yàn)證通過,并將新的角色權(quán)限寫入數(shù)據(jù)庫。

為便于理解,下面是根據(jù)描述寫的一些簡(jiǎn)單的代碼做為示例:

越權(quán)思路

由于驗(yàn)證模式存在漏洞,攻擊者可以在不知道 SecretKey 的情況下,通過重新構(gòu)造交易請(qǐng)求,達(dá)到繞過權(quán)限驗(yàn)證的目的。越權(quán)攻擊的核心思路在于利用長(zhǎng)度擴(kuò)展攻擊的特性。攻擊者首先需要獲取到原始的哈希值,并通過簡(jiǎn)單的迭代算法計(jì)算出原始數(shù)據(jù)的長(zhǎng)度。一旦得到這些信息,就可以將額外的越權(quán)參數(shù)添加到原始數(shù)據(jù)中,并利用相同的哈希算法生成惡意的哈希值。

長(zhǎng)度擴(kuò)展攻擊原理

Length Extension Attack 發(fā)生的原因在于部分哈希函數(shù)的內(nèi)部機(jī)制。這些函數(shù)在處理輸入數(shù)據(jù)前,首先將數(shù)據(jù)分割成固定長(zhǎng)度的塊,然后在每個(gè)塊的末尾進(jìn)行填充以滿足特定的要求。這種設(shè)計(jì)導(dǎo)致攻擊者可以在知道原始消息哈希值和長(zhǎng)度的情況下,通過填充和附加新數(shù)據(jù),構(gòu)造出新的有效哈希值。

以 SHA-256 為例,其工作在 512 比特的塊上。對(duì)于長(zhǎng)度不是 512 比特的倍數(shù)的數(shù)據(jù),需要進(jìn)行填充操作。其填充規(guī)則如下:

1. 在數(shù)據(jù)的末尾添加一個(gè) “1” 比特;

2. 添加一定數(shù)量的 “0” 比特,使得數(shù)據(jù)的長(zhǎng)度模 512 等于 448(詳細(xì)內(nèi)容見 [1]);

3. 在最后面添加一個(gè) 64 位長(zhǎng)的塊,表示原始數(shù)據(jù)的長(zhǎng)度。

簡(jiǎn)而言之,將一個(gè) “1” 后面跟著 m 個(gè) “0”,再加上一個(gè) 64 位或 128 位的整數(shù),附加到消息的末尾,以生成長(zhǎng)度為 512*n 的填充消息。附加的整數(shù)是原始消息的長(zhǎng)度。然后,填充消息將被哈希函數(shù)處理為 n 個(gè) 512 位的塊。

構(gòu)造方法

在這個(gè)示例中,我們將以上面圖片提到的代碼做為一個(gè)特定的場(chǎng)景,其中數(shù)據(jù)字符串為 data="user_id=1&user_name=aa",密鑰為 SecretKey="Length_extension_attack_secret"。服務(wù)端會(huì)解析上傳的數(shù)據(jù)中的 data 字段,并通過分隔符 & 解析出所需的參數(shù) user_id 和 user_name。如果存在 role 字段,服務(wù)端也會(huì)獲取該字段的值。然后,服務(wù)端會(huì)將所有字段與 SecretKey 進(jìn)行哈希運(yùn)算,并與上傳的驗(yàn)證哈希進(jìn)行比較。如果哈希值一致,則認(rèn)為參數(shù)符合規(guī)則,并直接使用。

首先,我們通過登錄 loginHandler 接口獲取根據(jù) data 和 SecretKey 使用 SHA-256 生成的哈希值 hash="37d310d3465506486431fb2c2eb163f0f470479703f66dc9e5fdead8a3390c68"。

接下來,我們將探討破解的難度。以我們的測(cè)試情況為例,根據(jù)長(zhǎng)度擴(kuò)展攻擊的原理,只要知道 H(message) 和 message 的長(zhǎng)度,我們就可以通過長(zhǎng)度擴(kuò)展攻擊添加新的數(shù)據(jù)。原來的 message = SecretKey + data,現(xiàn)在我們手上已經(jīng)有 H(message),只需知道 message 的長(zhǎng)度,就可以構(gòu)造一個(gè)新的哈希值。由于 SecretKey 是一個(gè) 30 位的密鑰,只需經(jīng)過 30 次迭代,就可以得知真正的 message 的長(zhǎng)度。因此,我們可以很容易地構(gòu)造出一個(gè)新的哈希值。由于我們需要使用 admin 的權(quán)限,所以我們要將惡意的字段 "&role=admin" 拼接到原來的數(shù)據(jù)中。

我們可以利用長(zhǎng)度擴(kuò)展攻擊的特性,在不知道 SecretKey 的情況下,添加新的數(shù)據(jù)并生成一個(gè)新的哈希值。這里使用一個(gè)已經(jīng)實(shí)現(xiàn)此功能的庫 [2] 來完成測(cè)試。再使用工具生成新的哈希值 。

由于 adminActionHandler 的接口驗(yàn)證是根據(jù)上傳的 user_id,user_name 和 role 來驗(yàn)證 hash 的,我們這時(shí)候上傳的數(shù)據(jù)是 user_id=1,user_name=aa\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x70 以及 role=admin,如下圖所示:

1694066958_64f9690e9ddbe559f0117.png!small1694066958_64f9690e9ddbe559f0117.png!small

哈希值為 84ae4ae437eeabf3bd8a26294392770b86f64a81998194156ac003d58a21acd0。之后就可以調(diào)用 adminActionHandler 接口,服務(wù)端收到數(shù)據(jù)后,會(huì)把上傳的哈希與 sha256(SecretKey + fakeData) 進(jìn)行對(duì)比,通過驗(yàn)證之后將會(huì)執(zhí)行一些敏感操作。這樣,我們就成功地利用長(zhǎng)度擴(kuò)展攻擊繞過了服務(wù)端驗(yàn)證,并實(shí)現(xiàn)了越權(quán)操作。

其他可能的攻擊場(chǎng)景

1. 文件完整性驗(yàn)證:如果文件的完整性是通過連接密鑰和文件內(nèi)容,然后對(duì)其進(jìn)行哈希來驗(yàn)證的,那么攻擊者可能會(huì)擴(kuò)展文件并生成一個(gè)有效的哈希,從而繞過完整性檢查;

2. Web 應(yīng)用安全:在 Web 應(yīng)用中,如果使用了易受長(zhǎng)度擴(kuò)展攻擊的哈希函數(shù)來驗(yàn)證用戶提交的數(shù)據(jù),攻擊者可能會(huì)利用這一點(diǎn)來提交惡意數(shù)據(jù);

3. 數(shù)字簽名:在某些數(shù)字簽名方案中,如果簽名是通過連接私鑰和消息,然后對(duì)其進(jìn)行哈希來生成的,那么攻擊者可能會(huì)擴(kuò)展消息并生成一個(gè)有效的簽名;

4. 密碼存儲(chǔ):雖然不常見,但如果密碼是通過連接密鑰(例如鹽)和密碼,然后對(duì)其進(jìn)行哈希來存儲(chǔ)的,那么攻擊者可能會(huì)嘗試使用長(zhǎng)度擴(kuò)展攻擊來破解密碼。

如何防范

1. 選擇不易受長(zhǎng)度擴(kuò)展攻擊的哈希函數(shù),例如 SHA-3;

2. 使用 HMAC:HMAC 需要一個(gè)密鑰和一個(gè)消息作為輸入,輸出的結(jié)果既依賴于密鑰,也依賴于消息,因此攻擊者在不知道密鑰的情況下無法進(jìn)行長(zhǎng)度擴(kuò)展攻擊;

3. 加強(qiáng)權(quán)限驗(yàn)證:在服務(wù)端增加額外的權(quán)限驗(yàn)證步驟,例如使用多因素認(rèn)證。

以下是一些常用的 Hash 算法的特性:

結(jié)語

對(duì)于長(zhǎng)度擴(kuò)展攻擊,一種有效的防護(hù)措施是使用不受此類攻擊影響的哈希函數(shù),例如 SHA-3 和 BLAKE2。另外,還可以通過 HMAC(密鑰散列消息認(rèn)證碼)結(jié)構(gòu)來進(jìn)行防護(hù)。這些措施可有效提高系統(tǒng)的安全性,確保數(shù)據(jù)完整性和應(yīng)用程序的穩(wěn)定性。

參考鏈接:

[1] https://www.rfc-editor.org/rfc/rfc6234#page-8

[2] https://github.com/skerkour/kerkour.com/tree/main/blog/2023/sha256_length_extension_attacks

本文作者:慢霧科技, 轉(zhuǎn)載請(qǐng)注明來自FreeBuf.COM


責(zé)任編輯:武曉燕 來源: FreeBuf.COM
相關(guān)推薦

2022-01-20 10:54:23

移動(dòng)手機(jī)短信驗(yàn)證碼隱患

2014-04-15 11:22:24

2013-02-21 10:11:58

2016-09-20 23:44:43

2010-09-17 09:27:40

Linux 服務(wù)器安全

2016-09-29 22:09:26

2015-01-07 11:19:54

2021-08-31 11:59:41

API安全事件身份驗(yàn)證

2010-09-17 14:29:23

2009-07-19 15:55:08

2014-04-14 13:19:41

初志科技電子文檔

2010-05-25 16:45:33

postfix郵件服務(wù)

2009-08-13 17:25:40

Linux服務(wù)器安全隱患防范對(duì)策

2009-03-17 09:48:00

2011-05-05 18:28:18

2023-12-25 11:55:58

2009-08-29 08:12:05

安全策略黑客服務(wù)器安全

2017-02-24 08:11:09

Docker數(shù)據(jù)安全容器

2009-07-06 13:38:02

2015-01-20 09:30:27

云計(jì)算云安全云安全聯(lián)盟
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)