日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shiro反序列化工具_Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)源码解析

發布時間:2023/12/10 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shiro反序列化工具_Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)源码解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Apache Shiro

Apache Shiro是一個功能強大且靈活的開源安全框架,主要功能包括用戶認證、授權、會話管理以及加密。在了解該漏洞之前,建議學習下Apache Shiro是怎么使用.

debug環境

  • jdk1.8
  • Apache Shiro 1.2.4
  • 測試demo

本地debug需要以下maven依賴

<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.2.4</version></dependency> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-web --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.2.4</version></dependency>

漏洞產生流程

一般登錄時,存在記住我的功能,如下圖:

Apache Shiro框架就是在實現該功能時存在漏洞.

Apache Shiro如何記住我?

  • 序列化用戶身份對象.(這里為SimplePrincipalCollection)
  • 對序列化后的數據進行AES加密,密鑰為常量.
  • base64編碼
  • 設置到cookie中,cookie name等于rememberMe.
  • Apache Shiro如何解析我?

  • 讀取cookie中的rememberMe的值.
  • 對其值進行base64解碼.
  • AES解密
  • 反序列化
  • 我們如何攻擊?

    通過以上,我們可以看出,只要手動構造一個反序列化payload,進行AES加密(密鑰我們知道的)和base64編碼,即可在反序列化時執行任何操作.

    源碼解析

    記住我源碼分析

    打開登錄界面,輸入admin/vulhub,勾選Remember me,點擊登錄.首先進入用戶代碼中調用Apache Shiro驗證接口的方法.

    接著正式進入Apache Shiro處理. 一些不重要的調用過程省略,調用棧如下:

    我們在org.apache.shiro.mgt/AbstractRememberMeManager.onSuccessfulLogin下斷點.

    從上面代碼我們發現,首先程序清理了驗證信息.接著調用rememberIdentity來保存新的驗證信息.跟進該方法.

    我們發現該方法首先去獲取一個PrincipalCollection對象.該對象就是保存在cookie中的對象.接著調用rememberIdentity保存該對象.跟進rememberIdentity方法.

    我們先看它是如何反序列化和AES加密的.跟進byte[] bytes = convertPrincipalsToBytes(accountPrincipals);.

    從以上代碼可以發現,調用serialize序列化為byte數組.這一步不做分析.我們重點看看如何進行AES加密的.跟進encrypt(bytes).

    首先該方法獲取AES加密service.再通過getEncryptionCipherKey()得到密鑰.最后對序列化后的對象進行加密.其中密鑰是一個常量,該常量在org/apache/shiro/mgt/AbstractRememberMeManager.AbstractRememberMeManager設置.常量值如下:

    回到rememberIdentity方法,我們繼續來看下面的rememberSerializedIdentity方法.

    通過以上過程,Apache Shiro完成了如何記住我.

    解析我源碼分析

    在源碼分析之前,提一個debug遇到的坑,Apache Shiro在設置rememberme這個cookie的同時也會設置一個JSessionid cookie,當通過瀏覽器進行發送請求,請刪除掉JSessionid cookie,否則Apache Shiro通過JSessionid獲取驗證信息,并不會經過解析我的過程,也就無法debug 我們在上一步登錄后,刪除JSessionid cookie,訪問http://localhost:8080.在org/apache/shiro/mgt/DefaultSecurityManager.getRememberedIdentity下斷點.

    該方法主要獲取存儲在cookie中的Principal對象,我們跟進getRememberedPrincipals方法內.

    從上述源碼可以發現,通過getRememberedSerializedIdentity進行cookie的提取和base64解密.接著通過convertBytesToPrincipals進行AES解密和反序列化得到Principals對象.我們重點看看convertBytesToPrincipals該方法.

    很顯然,該方法中通過decrypt進行AES解密.跟進decrypt.

    該方法和加密基本一樣.先獲取cipherService,再通過密鑰解密. 再回到convertBytesToPrincipals方法中.調用deserialize進行反序列化.至此反序列化漏洞的觸發過程就結束了.

    修復

    我們再來看看1.2.5如何修復的. 1.2.5:

    1.2.4:

    通過上述可以看出1.2.5將密鑰動態生成.避免了攻擊者可以自己生成序列化惡意對象.這個漏洞可以說是硬編碼密鑰導致的反序列化漏洞.

    最后

    關于該漏洞的利用可以參考vulhub.該文章旨在分享,后面也會就vulhub上的demo來做一系列的漏洞原理的分享.

    總結

    以上是生活随笔為你收集整理的shiro反序列化工具_Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。