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

taibeihacker

Moderator

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-...iroLoginController中的後台驗證/admin/page替換為/admin/{name}
1049983-20201129040427401-1379782706.png
1049983-20201129040427930-1551743954.png
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 跳轉到登陸頁面進行身份認證
1049983-20201129040428505-909219609.png
2.LoginController.java(springboot-shiro-master\src\main\java\org\syclover\srpingbootshiro\LoginController.java)/admin/{name}: 請求名為name的的資源(觸發身份認證)
1049983-20201129040428999-1101944912.png

0x04 漏洞复现​

1.不在請求路由中指定資源名稱時,不觸發身份驗證,也無資源返回:
02ndvcwfo2422236.png
http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin
1049983-20201129040429828-1775851797.png
2.在請求路由中指定資源名稱時,302 跳轉到身份驗證頁面:http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/login
1049983-20201129040430280-1096894926.png
u5vbnf4dn2s22239.png
3.構造特定PoC 請求指定資源時,不觸發身份驗證,並繞過權限(通過%3b繞過)http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin/;page
1049983-20201129040431055-942501932.png
jst3jrovjie22241.png

0x05 漏洞分析​

可以看到出問題的地方在org.apache.shiro.web.util.Webutils#getPathWithinApplication,shiro1.5.3進行了修改,直接在這裡下斷點,然後dubug調試
1049983-20201129040431878-1254629939.png
更新後利用getServletPath和getPathInfo進行獲取URL,然而真正的漏洞點並不在此
1049983-20201129040432474-1895311208.png
可以看到拼合後URL是沒問題的,再看經過removeSemicolon處理後
1049983-20201129040433327-937398851.png
可以看到只保留了/admin/*,可以在控制器裡添加/admin/*路由進行測試,@GetMapping('/admin*')
public String admin2() {
return 'please login, admin';
}http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin/*
1049983-20201129040433923-1159712392.png
1049983-20201129040434507-452562273.png
訪問是不會有權限驗證的,當然,在後面添加上參數的話就需要權限了
跟進removeSemicolon
1049983-20201129040435006-1073404813.png

同樣,將;後的內容截斷,包括;
再看下Spring如何處理
1049983-20201129040435555-539162384.png

Spring沒有問題,獲取到的是/admin/;page,然後將;page作為一整個字符串,匹配/admin/{name}路由,導致越權
再看下是怎麼處理URL的
`org.springframework.web.util.UrlPathHelper#decodeAndCleanUriString
1049983-20201129040436147-1903544345.png

removeSemicolonContent # 去除;及以後部分
decodeRequestString # 進行urldecode解碼
getSanitizedPath # 將//替換為/而shiro則相反
1049983-20201129040436695-881597646.png
首先進行了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 参考文献​

 
返回
上方