Apache Shiro 身份驗證繞過漏洞復現(CVE-2020-13933)


0x00 漏洞描述

Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼和會話管理。
之前Apache Shiro身份驗證繞過漏洞CVE-2020-11989的修復補丁存在缺陷,在1.5.3及其之前的版本,由於shiro在處理url時與spring仍然存在差異,依然存在身份校驗繞過漏洞由於處理身份驗證請求時出錯,遠程攻擊者可以發送特制的HTTP請求,繞過身份驗證過程並獲得對應用程序的未授權訪問。

0x01 漏洞影響

Apache Shiro < 1.6.0

0x02 環境搭建

1.下載項目到本地https://github.com/l3yx/springboot-shiro
2.將pom.xml中的1.5.2替換為1.5.3,將src/main/java/org/syclover/srpingbootshiroLoginController中的后台驗證/admin/page替換為/admin/{name}
3.通過IDEA編輯器重新build並運行即可,已編譯好的war包將其放到tomcat下的webapps目錄下運行即可
https://github.com/backlion/demo/blob/master/srpingboot-shiro-0.0.1-SNAPSHOT.war

0x03 代碼說明

1.ShiroConfig.java(pringboot-shiro-master\src\main\java\org\syclover\srpingbootshiro\ShiroConfig.java)
權限配置, 當請求/admin/* 資源時, 302 跳轉到登陸頁面進行身份認證:
2.LoginController.java(springboot-shiro-master\src\main\java\org\syclover\srpingbootshiro\LoginController.java)
/admin/{name}: 請求名為 name 的的資源(觸發身份認證):

0x04 漏洞復現

1.不在請求路由中指定資源名稱時,不觸發身份驗證,也無資源返回:
http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin

2.在請求路由中指定資源名稱時,302 跳轉到身份驗證頁面:
http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/login

3.構造特定 PoC 請求指定資源時,不觸發身份驗證,並繞過權限(通過%3b繞過)
http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin/%3bpage

0x05 漏洞分析

可以看到出問題的地方在org.apache.shiro.web.util.Webutils#getPathWithinApplication,shiro1.5.3進行了修改,直接在這里下斷點,然后dubug調試
更新后利用getServletPath和getPathInfo進行獲取URL,然而真正的漏洞點並不在此
可以看到拼合后URL是沒問題的,再看經過removeSemicolon處理后
可以看到只保留了/admin/*,可以在控制器里添加/admin/*路由進行測試,
@GetMapping("/admin*")
    public String admin2() {
        return "please login, admin";
    }

http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin/*

訪問是不會有權限驗證的,當然,在后面添加上參數的話就需要權限了

跟進removeSemicolon

同樣,將;后的內容截斷,包括;

再看下Spring如何處理

Spring沒有問題,獲取到的是/admin/;page,然后將;page作為一整個字符串,匹配/admin/{name}路由,導致越權

再看下是怎么處理URL的

`org.springframework.web.util.UrlPathHelper#decodeAndCleanUriString

removeSemicolonContent          # 去除;及以后部分
decodeRequestString                 # 進行urldecode解碼
getSanitizedPath                        # 將//替換為/
而shiro則相反
首先進行了urldecode,接着才去去除,從而導致了漏洞
漏洞 DEBUG 位置: shiro-web-1.5.3.jar
// org.apache.shiro.web.util.WebUtils.java
// line 111

public static String getPathWithinApplication(HttpServletRequest request) {
    return normalize(removeSemicolon(getServletPath(request) + getPathInfo(request)));
}
pring-web-5.2.5.RELEASE.jar
// org.springframework.web.util.UrlPathHelper.java
// line 459

private String decodeAndCleanUriString(HttpServletRequest request, String uri) {
    uri = removeSemicolonContent(uri);
    uri = decodeRequestString(request, uri);
    uri = getSanitizedPath(uri);
    return uri;
}

0x06 漏洞修復

目前官方已發布漏洞修復版本,更新 Apache Shiro >= 1.6.0

0x07 參考文獻

https://github.com/lyy289065406/CVE-2020-13933
https://www.cnblogs.com/ph4nt0mer/p/13535999.html
https://xz.aliyun.com/t/8223





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM