龍海網(wǎng)站建設(shè)哪家好關(guān)鍵詞拓展工具有哪些
前言
關(guān)于shrio漏洞,網(wǎng)上有很多博文講解,這些博文對漏洞的解釋似乎有一套約定俗成的說辭,讓人云里來云里去,都沒有對漏洞產(chǎn)生的原因深入地去探究.....
本文從現(xiàn)象到本質(zhì),旨在解釋清楚Shrio漏洞是怎么回事! 550和721到底有什么區(qū)別!兩者利用前提到底是什么?(有別于網(wǎng)絡(luò)上的解釋,如有錯誤還望大佬及時指正)。
shiro框架產(chǎn)品介紹
Apache Shiro是一個強大且易于使用的Java安全框架,用于身份驗證、授權(quán)、加密和會話管理。它為應(yīng)用程序提供了諸如用戶認(rèn)證、角色和權(quán)限檢查、會話管理等安全功能,使開發(fā)人員能夠輕松地集成安全性需求而不必過多關(guān)注實現(xiàn)細(xì)節(jié)。
Apache Shiro的主要特點包括:
-
身份驗證(Authentication):支持多種身份驗證機制,包括基于用戶名密碼的認(rèn)證、基于LDAP的認(rèn)證、基于OAuth的認(rèn)證等。
-
授權(quán)(Authorization):提供簡單且靈活的授權(quán)管理機制,可以基于角色、權(quán)限字符串或自定義邏輯進(jìn)行訪問控制。
-
會話管理(Session Management):支持會話管理功能,包括會話存儲、會話超時管理等,能夠幫助開發(fā)人員管理用戶的會話狀態(tài)。
-
加密(Cryptography):提供加密算法和工具類,用于對用戶密碼和其他敏感數(shù)據(jù)進(jìn)行加密處理。
-
Web集成:對Web應(yīng)用程序提供了方便的集成支持,可以輕松地與各種主流的Java Web框架(如Spring、Struts、JSF等)結(jié)合使用。
總的來說,Apache Shiro為Java應(yīng)用程序提供了一套完整的安全解決方案,使開發(fā)人員能夠?qū)W⒂跇I(yè)務(wù)邏輯的開發(fā),而無需過多關(guān)注安全細(xì)節(jié)的實現(xiàn)。
shiro550漏洞原理
(1)shiro在登錄處提供了Remember Me這個功能,來記錄用戶登錄的憑證,然后shiro會對用戶傳入的cookie進(jìn)行解密并進(jìn)行反序列化,服務(wù)端接收rememberMe的cookie值后的操作是:Cookie中rememberMe字段內(nèi)容---> Base64解碼---> 使用密鑰進(jìn)行AES-CBC解密---> 反序列化
(2)由于該版本AES加密的密鑰Key被硬編碼在代碼里(漏洞能夠被利用的本質(zhì)),且大部分項目未修改默認(rèn)AES密鑰,這意味著攻擊者只要通過源代碼找到AES加密的密鑰,就可以構(gòu)造一個惡意對象,對其進(jìn)行序列化,AES加密,Base64編碼,然后將其作為cookie的Remember Me字段值發(fā)送,Shiro將數(shù)據(jù)進(jìn)行解密并且反序列化,最終觸發(fā)反序列化漏洞。
(3)處理Cookie的類是CookieRememberMeManaer,該類繼承AbstractRememberMeManager類,跟AbstractRememberMeManager類,很容易看到AES的key。org.apache.shiro.mgt.AbstractRememberMeManager ——kPH+bIxk5D2deZiIxcaaaA==
shiro框架驗證
1.未登錄的情況下,請求包的cookie中沒有rememberMe字段,返回包set-Cookie里也沒有deleteMe字段
2、登錄失敗的話,不管有沒有勾選RememberMe字段,返回包都會有 rememberMe= deleteMe 字段
3.不勾選RememberMe,登錄成功的話,返回包set-Cookie里有rememberMe=deleteMe字段。但是之后的所有請求中Cookie都不會有RememberMe字段
4.勾選RememberMe,登錄成功的話,返回包set-Cookie里有rememberMe=deleteMe字段,還會有remember 字段,之后的所有請求中Cookie都會有rememberMe字段
5.可以在cookie后面自己加一個rememberMe=1,看返回包有沒有rememberMe= deleteMe
shiro550漏洞復(fù)現(xiàn)
shiro550利用條件
0.Shiro <= 1.2.4中
1.aes加密的key
2.目標(biāo)服務(wù)器含有可利用的攻擊鏈。
工具準(zhǔn)備
這是一款專門針對shiro漏洞利用的工具,寫的確實不錯。直接拿過來一把梭哈
靶場搭建
查看web界面
shrio框架驗證
開始漏洞攻擊,輸入shiro的默認(rèn)密鑰,檢測當(dāng)前利用鏈
命令執(zhí)行
shiro720漏洞原理
在Shiro550漏洞中,Cookie所使用的AES加密密鑰為硬編碼,所以我們可以構(gòu)造惡意序列化數(shù)據(jù)并使用固定的AES密鑰進(jìn)行正確加密惡意序列發(fā)送給服務(wù)端,進(jìn)而達(dá)到攻擊的目的。但在該漏洞公布后,Shiro官方修復(fù)了這一漏洞,將AES密鑰修改成了動態(tài)生成。也就是說,對于每一個Cookie,都是使用不同的密鑰進(jìn)行加解密的。
public AbstractRememberMeManager() {this.serializer = new DefaultSerializer<PrincipalCollection>();AesCipherService cipherService = new AesCipherService();this.cipherService = cipherService;setCipherKey(cipherService.generateNewKey().getEncoded());}
具體的密鑰產(chǎn)生調(diào)試參考
Java反序列化漏洞——Shiro721 - 楓のBlog
CBC字節(jié)翻轉(zhuǎn)攻擊&Padding Oracle Attack原理
簡單介紹下這個加密過程
CBC字節(jié)翻轉(zhuǎn)攻擊
CBC要求第一個分組的明文在加密運算前先與IV進(jìn)行異或;從第二組開始,所有的明文先與前一分組加密后的密文進(jìn)行異或。
解密過程剛好相反,第一組密文在解密之后與初始向量IV異或得到第一組明文。第二組密文解密之后和第一組密文異或得到第二組明文
為什么使用要使用異或呢! 異或加密是一種簡單的加密方法,它基于異或運算(XOR)的性質(zhì)。相同為0,不同為1。例如0異或1為1,1異或1為0。這就造就了異或運算的一個特性:任何數(shù)和0異或結(jié)果仍然是原來的數(shù),任何數(shù)和自身異或結(jié)果是0。這意味著如果你對一個字符串進(jìn)行異或加密,然后再對結(jié)果使用相同的密鑰進(jìn)行異或,你將得到原始字符串。
這說的還是有點抽象,我們還是舉個例子。假如我們 有明文01101011 有IV11001001 兩者進(jìn)行異或結(jié)果為10100010 拿這個結(jié)果在于IV進(jìn)行異或 10100010異或11001001=01101011,你會發(fā)現(xiàn)明文又回來了。事實上異或加密在軟件中廣泛使用。
我們把目光返回CBC字節(jié)翻轉(zhuǎn)攻擊
參考文章CBC字節(jié)翻轉(zhuǎn)攻擊&Padding Oracle Attack原理解析 - 楓のBlog
假如A(可控的)異或B(不可控的)得C(結(jié)果) 那么A異或C得B, 如此假如我們有想要的明文X ,A異或C異或B異或X,這個結(jié)果是不是就是X了,這樣的話就可以來控制輸出明文為自己想要的內(nèi)容
那么現(xiàn)在的問題是對于結(jié)果C我們怎么得知?這就需要了解一下padding oracle攻擊了
Padding Oracle Attack原理
在介紹Padding Oracle Attack原理前,我們先了解下如下的概念,
我們知道在分組加密算法中有填充字節(jié)的概念,需要填充的比較參考值是BlockSize(一組的字節(jié)數(shù),不夠需要進(jìn)行填充)
舉個例子 假如我們想加密BRIAN;12;1;0x050x050x050x050x05,這里設(shè)置的初始向量iv為0x7B 0x21 0x6A 0x63 0x49 0x51 0x17 0x0F
BlockSize=8
加密過程
BRIAN;12
此為第一組 ;1;
此為第二組 由于不夠BlockSize我們需要填充5個0x05(8-3=5)
這時服務(wù)器發(fā)送的Cookie應(yīng)該為7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
,初始向量iv被填充在加密密文之前。
解密過程
最后解得明文,判斷最后一個字節(jié)。這里是0x05,哪么是5個0x05嗎?如果是則pading成功去除填充字節(jié)就是解密明文,如果不是則padding非法,等待系統(tǒng)處理。(如果padding失敗的信息返回給了用戶,就達(dá)成了攻擊的必要條件)
現(xiàn)在思考 我們有密文塊可控,知道BlockSize的大小,知道最后的padding是否成功,能不能把明文猜出來?
明文;1;0x050x050x050x050x05是 0xF8 0x51 0xD6 0xCC 0x60 0xFC 0x95 0x37異或0xC3 0x60 0xED 0xC9 0x6D 0xF9 0x90 0x32得到的 其中我們可以控制 0xF8 0x51 0xD6 0xCC 0x60 0xFC 0x95 0x37 0xC3 0x60 0xED 0xC9 0x6D 0xF9 0x90 0x32由des加密生成不可控,當(dāng)然如果得知了這一塊,明文也就可以算出來了
請看下表
密 | 密 | 密 | 密 |
---|---|---|---|
⊕ | ⊕ | ⊕ | ⊕ |
00 | 00 | 00 | [枚舉] |
0x1 |
我們可以不斷改變異或值得最后一位字節(jié),直到padding成功。如果成功有兩種情況,1是剛好是0x1,這時不管前面的密文如何都可以padding成功,2是瞎貓碰到死耗子和最后的前幾位密文剛剛好pading成功,我們只需你是0X01的情況,修改最后前幾位的密文padding失敗即可排除情況2。這時我們可以得到第一個密文的值:0x1⊕剛剛爆出來的異或值=密文的明文
密 | 密 | 密 | 明 |
---|---|---|---|
⊕ | ⊕ | ⊕ | ⊕ |
00 | 00 | [枚舉] | 固定異或值 |
0x02 | 0x2 |
接下來假設(shè)padding值為0x2(成功padding是要有兩個0x02的) 固定最后一個字節(jié)異或值 =明文⊕ 0x2,對倒數(shù)第二個字節(jié)進(jìn)行枚舉。直到padding成功 成功后是不是就可以把響應(yīng)的密文解出來了,0x2⊕剛剛爆出來的異或值=密文的明文
密 | 密 | 明 | 明 |
---|---|---|---|
⊕ | ⊕ | ⊕ | ⊕ |
00 | [枚舉] | 固定異或值 | 固定異或值 |
0x03 | 0x03 | 0x03 |
繼續(xù)重復(fù)上一步的操作,設(shè)paddding為0x03對倒數(shù)第3個字節(jié)進(jìn)行枚舉,直到padding成功,得到相應(yīng)位置的明文..............
最后的結(jié)果我們可以把最后的明文信息爆破出來,結(jié)合字節(jié)翻轉(zhuǎn)攻擊就可以把明文修改為我們想要的明文了。最終會進(jìn)行序列化處理,那么我們需利用一個條反向序列化鏈就可以造成代碼執(zhí)行命令執(zhí)行的漏洞了。
參考Padding Oracle 攻擊_嗶哩嗶哩_bilibili
Shiro721利用條件
0.Apache Shiro < 1.4.2 ?
1.已經(jīng)登陸用戶的合法cookie ? ·加密的初始向量iv以及密文 ?
2.Padding正確,反序列化錯誤處理(Padding Oracle Attack) ? ·Padding正確,服務(wù)器正常響應(yīng) ? ·Padding錯誤,服務(wù)器返回Set-Cookie: rememberMe=deleteMe
?
3.目標(biāo)服務(wù)器含有可利用的攻擊鏈 ? ·構(gòu)造惡意類
漏洞利用缺陷,類似于sql盲注需要發(fā)送大量http請求,非常容易觸發(fā)防火墻或waf。流量過大的可能會把服務(wù)器打崩。
漏洞復(fù)現(xiàn)
Docker搭建環(huán)境
Copy Highlighter-hljsgit clone https://github.com/3ndz/Shiro-721.git cd Shiro-721/Docker docker build -t shiro-721 . ? //不要忽略721后面的那個點,意為當(dāng)前路徑 docker run -p 8080:8080 -d shiro-721
打開web頁面
使用現(xiàn)有的密碼登錄一下,記得把Remember Me打上勾,
現(xiàn)在我們已經(jīng)有一個合法的cookie了
啟動漏洞利用工具,設(shè)置下代理為burp。分析下攻擊流量
啟用dnslog回顯攻擊,burp查看攻擊流量,分析流量特征
特征1
特征2
根據(jù)流量我們可以發(fā)現(xiàn)這樣的特征,
1.流量很大 需要不斷的在cookie中做填充字節(jié)嘗試 2.可能被重定頁面 3.在填充測試中會有兩個不同的結(jié)果 成功沒有deleteme 失敗則有deleteme
此時的工具攻擊頁面 不斷改變 Calulating block 的值進(jìn)行填充測試。
攻擊的過程十分漫長,條件利用比較苛刻,不能高并發(fā),容易被檢測,也容易把服務(wù)器打崩。
參考文章
https://www.cnblogs.com/qianxinggz/p/13388405.htmlhttps://www.cnblogs.com/qianxinggz/p/13388405.html
Padding Oracle 攻擊_嗶哩嗶哩_bilibiliPadding Oracle 攻擊, 視頻播放量 488、彈幕量 0、點贊數(shù) 25、投硬幣枚數(shù) 12、收藏人數(shù) 19、轉(zhuǎn)發(fā)人數(shù) 4, 視頻作者 jiegec, 作者簡介 ,相關(guān)視頻:LLL 格基歸約算法,ECDSA 橢圓曲線數(shù)字簽名算法,Shamir 秘密共享算法,Coppersmith 方法,普通人千萬別學(xué)網(wǎng)絡(luò)工程師,這里面的水真的太深了!!!,【密碼學(xué)】PLONK協(xié)議,23級第一次例會 - Crypto入門,【加法的幾何表示】兩個點如何相加?畫兩條直線就夠了,【極致低阻】航模XT60大電流電流表,沒事干了就堆點料吧,月入過萬?5個建議!零基礎(chǔ)轉(zhuǎn)行新媒體運營,勸你謹(jǐn)慎入坑!https://www.bilibili.com/video/BV1au4y1m7KQ/?spm_id_from=333.337.search-card.all.click&vd_source=4e747ff54c26459caabbedaa87d1c684
CBC字節(jié)翻轉(zhuǎn)攻擊&Padding Oracle Attack原理解析 - 楓のBlogCBC字節(jié)翻轉(zhuǎn)攻擊 概述 CBC字節(jié)翻轉(zhuǎn)攻擊是一種對分組密碼的攻擊,屬于側(cè)信道攻擊。這種攻擊針對的是CBC M…https://goodapple.top/archives/217?