溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么淺析Shiro Padding Oracle Attack

發(fā)布時(shí)間:2021-12-18 18:21:34 來源:億速云 閱讀:166 作者:柒染 欄目:網(wǎng)絡(luò)安全

這篇文章將為大家詳細(xì)講解有關(guān)怎么淺析Shiro Padding Oracle Attack,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

前言

cookie的cookiememeMe已通過AES-128-CBC模式加密,這很容易受到Padding oracle攻擊的影響。攻擊者可以使用有效的RememberMe cookie作為Padding Oracle Attack 的前綴,然后制作精心制作的RememberMe來執(zhí)行Java反序列化攻擊。重現(xiàn)此問題的步驟:登錄網(wǎng)站,并從cookie中獲取RememberMe。使用RememberMe cookie作為Padding Oracle Attack的前綴。加密syserial的序列化有效負(fù)載,以通過Padding Oracle Attack制作精心制作的RememberMe。請(qǐng)求帶有新的RememberMe cookie的網(wǎng)站,以執(zhí)行反序列化攻擊。攻擊者無需知道RememberMe加密的密碼密鑰。

shiro框架

我們先來了解一下什么是shiro框架,根據(jù)百度百科的資料,可以知道Apache Shiro是一個(gè)強(qiáng)大且易用的Java安全框架而且它具有執(zhí)行身份驗(yàn)證、授權(quán)、密碼和會(huì)話管理的功能。shiro簡(jiǎn)單來說就是權(quán)限管理組件,而通過shiro-721這個(gè)漏洞結(jié)合反序列化攻擊可以達(dá)到遠(yuǎn)程執(zhí)行的目的。根據(jù)漏洞公告來看,需要搞懂什么是padding oracle攻擊以及它有什么效果,什么是shiro反序列化攻擊為什么通過這個(gè)可以達(dá)到遠(yuǎn)程執(zhí)行的目的,以及為什么要采用RememberMe cookie 來作為攻擊的前綴。

shiro反序列化攻擊

shiro反序列化攻擊其實(shí)也就是對(duì)shrio-550漏洞的利用過程,網(wǎng)上對(duì)于這個(gè)漏洞的復(fù)現(xiàn)過程的相關(guān)記錄還是挺多的,有興趣的同學(xué)可以去找找相關(guān)的資料進(jìn)行一個(gè)復(fù)現(xiàn)。這里我簡(jiǎn)單說說為什么會(huì)存在shiro反序列化攻擊,根據(jù)Apache官網(wǎng)的資料,默認(rèn)情況下shiro會(huì)使用CookieRememberMeManager。它會(huì)對(duì)用戶的身份進(jìn)行序列化,加密和編碼,以供以后檢索。

流程圖如下:

怎么淺析Shiro Padding Oracle Attack

《AES加密算法分析》

實(shí)驗(yàn):AES加密算法分析(合天網(wǎng)安實(shí)驗(yàn)室)

怎么淺析Shiro Padding Oracle Attack

有過CTF經(jīng)驗(yàn)的同學(xué)可能會(huì)對(duì)反序列化這個(gè)詞比較敏感,這在CTF賽題中是一個(gè)常常出現(xiàn)的題型,有的同學(xué)可能立馬就能想到能不能構(gòu)造一個(gè)惡意的對(duì)象,當(dāng)它被反序列化時(shí)自動(dòng)觸發(fā)魔術(shù)方法以達(dá)到攻擊的目的。沒錯(cuò),這正是Shiro的反序列化攻擊流程:構(gòu)造一個(gè)惡意對(duì)象發(fā)送給服務(wù)器,當(dāng)服務(wù)器執(zhí)行反序列時(shí)便能觸發(fā)攻擊。根據(jù)流程圖來看RememberMe Cookie采用的雙重加密,先是使用了Base64加密,再用AES加密。Base64我們都知道怎么樣去加解密,可是AES采用的是對(duì)稱加密,要加密的話還必須有一個(gè)密鑰Key。這也是Shiro-550漏洞存在的關(guān)鍵點(diǎn):在默認(rèn)情況下加密密鑰Key是硬編碼的,也就是說加密密鑰Key編碼在源碼內(nèi)。只要可以拿到源代碼就可以拿到這個(gè)Key,從而進(jìn)行shiro的反序列化攻擊。但是在Shiro1.2.5以上,官方已經(jīng)修復(fù)了這個(gè)漏洞,已經(jīng)拿不到KEY了。

我們知道Shiro Padding Oracle Attack利用到了shiro反序列化,通過上面的知識(shí)知道要利用這個(gè)漏洞必須構(gòu)造出一個(gè)可以讓服務(wù)器反序列化的惡意對(duì)象,那么Shiro Padding Oracle Attack是可以拿到AES的加密密鑰嗎?還是有別方法可以繞過AES解密達(dá)到反序列化的目的呢?

接下來我們了解下padding oracle攻擊。

padding oracle攻擊

在了解這個(gè)攻擊方式之前我們首先了解下Shiro所采用的AES-128-CBC加密模式:AES代表加密方式,CBC是分組模式,128也就是16個(gè)字節(jié),這里采用的是PKCS#5填充方式。

AES-128-CBC對(duì)明文進(jìn)行加密時(shí),首先會(huì)對(duì)明文進(jìn)行分組,這里每一組是16個(gè)字節(jié)。我們很容易可以想到的是并不是每一組明文都可以正好分配,也就是說最后一組明文可能存在需要數(shù)據(jù)填充的情況。實(shí)際上,采用分組方式時(shí)是必須要填充的,如果滿了則填充滿一個(gè)新組。

怎么淺析Shiro Padding Oracle Attack

注:圖來源于網(wǎng)絡(luò);此圖為8位填充示意圖,16位與之類似。

在明文被分組完成后便是對(duì)明文進(jìn)行分組加密。流程圖如下:

怎么淺析Shiro Padding Oracle Attack

注:圖片來源于網(wǎng)絡(luò)

從圖中我們可以看出CBC是分組加密的,每一組先與一個(gè)初始向量IV進(jìn)行異或(異或:A異或B得C,C異或B得A),異或得到的值我們稱之為中間值(IMV),再用KEY對(duì)中間值進(jìn)行加密得到了第一組密文。第一組密文再作為IV與第二組明文進(jìn)行異或得到第二個(gè)中間值,同樣也是用Key將這個(gè)中間值加密后得到第二組密文,以此類推??吹竭@里其實(shí)我們可以思考一個(gè)問題,最后一組明文其實(shí)是經(jīng)過填充的,這是它與其余幾組的不同之處,那么是否意味著我們可以在這個(gè)地方有什么利用呢?

接下來我們看下解密流程,其實(shí)解密就是加密的翻轉(zhuǎn)。

怎么淺析Shiro Padding Oracle Attack

注:圖片來源于網(wǎng)絡(luò)

從上圖我們可以看到,第一組密文塊經(jīng)過KEY解密后得到中間值,中間值與IV異或得到了第一組明文。然后,第一組密文塊作為IV與第二組的中間異或得到了第二組明文,以此類推完成全部解密。這里我們還需要關(guān)注下服務(wù)器的解密過程:當(dāng)我們提交一個(gè)IV時(shí),服務(wù)器會(huì)用中間值與它異或得值然后先校驗(yàn)填充情況而非直接比對(duì)明文。此時(shí)服務(wù)器會(huì)返回兩種情況:正確的密文返回200或者302;錯(cuò)誤的密文返回500。

現(xiàn)在我們對(duì)AES加解密有了一定的了解,接下來就來看看padding oracle攻擊到底是怎么實(shí)現(xiàn)的。上面我們已經(jīng)提到了最后一個(gè)分組存在填充情況,并且填充情況應(yīng)該是下面的其中一種。



①:明文 0x01②:明文 0x02 0x02③:明文 0x03 0x03 0x03...⑧:0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08

打起精神,重難點(diǎn)來啦:

整理下思路,現(xiàn)在我們可以捕獲到密文,并且知道了加密算法也知道初始向量IV,在對(duì)密文進(jìn)行分組后,只要我們有辦法繞過KEY解密的過程拿到中間值是不是就能直接用中間值(IMV)與初始向量IV進(jìn)行異或操作從而拿到所有的明文。

根據(jù)服務(wù)器會(huì)對(duì)填充錯(cuò)誤進(jìn)行報(bào)錯(cuò)這個(gè)關(guān)鍵點(diǎn),我們構(gòu)造出一個(gè)虛假的IV值來反推中間值,首先假定明文最后一位填充的是0x01,也就是上面八種填充情況中提到第①種情況。根據(jù)異或的特性,只有唯一的IV值與中間值異或能得到0x01,IV值最后一個(gè)字節(jié)的取值范圍是 0×01~0xFF,一共255種情況。如下圖所示,當(dāng)我們?cè)囼?yàn)到0x66時(shí)發(fā)現(xiàn)服務(wù)器返回了200,所以很容易可以知道IMV就是0x01與0x66的異或結(jié)果0x67。

回想下上面所寫我們的解密過程,我們用初始向量IV與爆破得到的IMV值異或便可以得到最后一位明文。接下來我們?cè)偻茖?dǎo)數(shù)第二個(gè)明文,根據(jù)填充規(guī)則,此時(shí)應(yīng)該是上面八種填充情況中提到第②種情況。我們已經(jīng)知道了IMV最后一字節(jié)是0x67,那么此次構(gòu)造的IV最后一字節(jié)就是0x67與0x02異或的結(jié)果0x65。此時(shí)固定最后一位字節(jié)爆破倒數(shù)第二個(gè)字節(jié),以此類推完成所有的解密。

怎么淺析Shiro Padding Oracle Attack

注:圖片來源于網(wǎng)絡(luò)

總的來講,padding oracle并不是可以拿到AES的密鑰,而是可以繞過。正常的解密流程需要IV、密文、key;而padding oracle攻擊只需要IV、密文即可。

以上是利用padding oracle攻擊解密密文,與之類似的是利用padding oracle攻擊加密明文。我們想一想在加密過程中是不是第一組的密文作為第二組的IV,此時(shí)這個(gè)中間量(IMV)我們是可以推導(dǎo)出來的,那么根據(jù)異或的唯一性如果攻擊者想改變明文是不是通過改變密文就可以實(shí)現(xiàn)呢?

關(guān)于怎么淺析Shiro Padding Oracle Attack就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI