您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么淺析Shiro Padding Oracle Attack,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
cookie的cookiememeMe已通過AES-128-CBC模式加密,這很容易受到Padding oracle攻擊的影響。攻擊者可以使用有效的RememberMe cookie作為Padding Oracle Attack 的前綴,然后制作精心制作的RememberMe來執行Java反序列化攻擊。重現此問題的步驟:登錄網站,并從cookie中獲取RememberMe。使用RememberMe cookie作為Padding Oracle Attack的前綴。加密syserial的序列化有效負載,以通過Padding Oracle Attack制作精心制作的RememberMe。請求帶有新的RememberMe cookie的網站,以執行反序列化攻擊。攻擊者無需知道RememberMe加密的密碼密鑰。
我們先來了解一下什么是shiro框架,根據百度百科的資料,可以知道Apache Shiro是一個強大且易用的Java安全框架而且它具有執行身份驗證、授權、密碼和會話管理的功能。shiro簡單來說就是權限管理組件,而通過shiro-721這個漏洞結合反序列化攻擊可以達到遠程執行的目的。根據漏洞公告來看,需要搞懂什么是padding oracle攻擊以及它有什么效果,什么是shiro反序列化攻擊為什么通過這個可以達到遠程執行的目的,以及為什么要采用RememberMe cookie 來作為攻擊的前綴。
shiro反序列化攻擊其實也就是對shrio-550漏洞的利用過程,網上對于這個漏洞的復現過程的相關記錄還是挺多的,有興趣的同學可以去找找相關的資料進行一個復現。這里我簡單說說為什么會存在shiro反序列化攻擊,根據Apache官網的資料,默認情況下shiro會使用CookieRememberMeManager。它會對用戶的身份進行序列化,加密和編碼,以供以后檢索。
流程圖如下:
《AES加密算法分析》
實驗:AES加密算法分析(合天網安實驗室)
有過CTF經驗的同學可能會對反序列化這個詞比較敏感,這在CTF賽題中是一個常常出現的題型,有的同學可能立馬就能想到能不能構造一個惡意的對象,當它被反序列化時自動觸發魔術方法以達到攻擊的目的。沒錯,這正是Shiro的反序列化攻擊流程:構造一個惡意對象發送給服務器,當服務器執行反序列時便能觸發攻擊。根據流程圖來看RememberMe Cookie采用的雙重加密,先是使用了Base64加密,再用AES加密。Base64我們都知道怎么樣去加解密,可是AES采用的是對稱加密,要加密的話還必須有一個密鑰Key。這也是Shiro-550漏洞存在的關鍵點:在默認情況下加密密鑰Key是硬編碼的,也就是說加密密鑰Key編碼在源碼內。只要可以拿到源代碼就可以拿到這個Key,從而進行shiro的反序列化攻擊。但是在Shiro1.2.5以上,官方已經修復了這個漏洞,已經拿不到KEY了。
我們知道Shiro Padding Oracle Attack利用到了shiro反序列化,通過上面的知識知道要利用這個漏洞必須構造出一個可以讓服務器反序列化的惡意對象,那么Shiro Padding Oracle Attack是可以拿到AES的加密密鑰嗎?還是有別方法可以繞過AES解密達到反序列化的目的呢?
接下來我們了解下padding oracle攻擊。
在了解這個攻擊方式之前我們首先了解下Shiro所采用的AES-128-CBC加密模式:AES代表加密方式,CBC是分組模式,128也就是16個字節,這里采用的是PKCS#5填充方式。
AES-128-CBC對明文進行加密時,首先會對明文進行分組,這里每一組是16個字節。我們很容易可以想到的是并不是每一組明文都可以正好分配,也就是說最后一組明文可能存在需要數據填充的情況。實際上,采用分組方式時是必須要填充的,如果滿了則填充滿一個新組。
注:圖來源于網絡;此圖為8位填充示意圖,16位與之類似。
在明文被分組完成后便是對明文進行分組加密。流程圖如下:
注:圖片來源于網絡
從圖中我們可以看出CBC是分組加密的,每一組先與一個初始向量IV進行異或(異或:A異或B得C,C異或B得A),異或得到的值我們稱之為中間值(IMV),再用KEY對中間值進行加密得到了第一組密文。第一組密文再作為IV與第二組明文進行異或得到第二個中間值,同樣也是用Key將這個中間值加密后得到第二組密文,以此類推。看到這里其實我們可以思考一個問題,最后一組明文其實是經過填充的,這是它與其余幾組的不同之處,那么是否意味著我們可以在這個地方有什么利用呢?
接下來我們看下解密流程,其實解密就是加密的翻轉。
注:圖片來源于網絡
從上圖我們可以看到,第一組密文塊經過KEY解密后得到中間值,中間值與IV異或得到了第一組明文。然后,第一組密文塊作為IV與第二組的中間異或得到了第二組明文,以此類推完成全部解密。這里我們還需要關注下服務器的解密過程:當我們提交一個IV時,服務器會用中間值與它異或得值然后先校驗填充情況而非直接比對明文。此時服務器會返回兩種情況:正確的密文返回200或者302;錯誤的密文返回500。
現在我們對AES加解密有了一定的了解,接下來就來看看padding oracle攻擊到底是怎么實現的。上面我們已經提到了最后一個分組存在填充情況,并且填充情況應該是下面的其中一種。
①:明文 0x01②:明文 0x02 0x02③:明文 0x03 0x03 0x03...⑧:0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08
打起精神,重難點來啦:
整理下思路,現在我們可以捕獲到密文,并且知道了加密算法也知道初始向量IV,在對密文進行分組后,只要我們有辦法繞過KEY解密的過程拿到中間值是不是就能直接用中間值(IMV)與初始向量IV進行異或操作從而拿到所有的明文。
根據服務器會對填充錯誤進行報錯這個關鍵點,我們構造出一個虛假的IV值來反推中間值,首先假定明文最后一位填充的是0x01,也就是上面八種填充情況中提到第①種情況。根據異或的特性,只有唯一的IV值與中間值異或能得到0x01,IV值最后一個字節的取值范圍是 0×01~0xFF,一共255種情況。如下圖所示,當我們試驗到0x66時發現服務器返回了200,所以很容易可以知道IMV就是0x01與0x66的異或結果0x67。
回想下上面所寫我們的解密過程,我們用初始向量IV與爆破得到的IMV值異或便可以得到最后一位明文。接下來我們再推導數第二個明文,根據填充規則,此時應該是上面八種填充情況中提到第②種情況。我們已經知道了IMV最后一字節是0x67,那么此次構造的IV最后一字節就是0x67與0x02異或的結果0x65。此時固定最后一位字節爆破倒數第二個字節,以此類推完成所有的解密。
注:圖片來源于網絡
總的來講,padding oracle并不是可以拿到AES的密鑰,而是可以繞過。正常的解密流程需要IV、密文、key;而padding oracle攻擊只需要IV、密文即可。
以上是利用padding oracle攻擊解密密文,與之類似的是利用padding oracle攻擊加密明文。我們想一想在加密過程中是不是第一組的密文作為第二組的IV,此時這個中間量(IMV)我們是可以推導出來的,那么根據異或的唯一性如果攻擊者想改變明文是不是通過改變密文就可以實現呢?
關于怎么淺析Shiro Padding Oracle Attack就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。