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如何記住我?
Apache Shiro如何解析我?
我們如何攻擊?
通過以上,我們可以看出,只要手動構造一個反序列化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)源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 斗鱼注册服务器没有返回,斗鱼遭遇服务器大
- 下一篇: 高一计算机网络技术应用计划,高一计算机网