前言
无。
环境搭建
要求版本:shiro<1.5.3,测试用的代码不变。
攻击方法1
跟CVE-2020-1957相似的方法,用分号;绕过。
好像1.5.2版本要利用还要配置tomcat根目录,我这用的SpringBoot,就不管它了。
攻击方法2
通过双重URL编码绕过:
原因很好猜,肯定是shiro对双重URL编码的处理跟spring之间出了点偏差,继续去getRequestUri函数看看:
可以看到,此时从tomcat中取到的uri已经经过了一次URL解码,而在后面的处理函数decodeAndCleanUriString函数中:
private static String decodeAndCleanUriString(HttpServletRequest request, String uri) {
uri = decodeRequestString(request, uri);
int semicolonIndex = uri.indexOf(';');
return (semicolonIndex != -1 ? uri.substring(0, semicolonIndex) : uri);
}
public static String decodeRequestString(HttpServletRequest request, String source) {
String enc = determineEncoding(request);
try {
return URLDecoder.decode(source, enc);
} catch (UnsupportedEncodingException ex) {
...
return URLDecoder.decode(source);
}
}
可以看到会再进行一次URL解码,也就是说最后获得的就是//admin//:
经过normalize处理后就变成了/admin/,匹配不上,也就绕过了认证。
修复方法
1.5.3版本下,getPathWithinApplication函数做了修改:
public static String getPathWithinApplication(HttpServletRequest request) {
return normalize(removeSemicolon(getServletPath(request) + getPathInfo(request)));
}
private static String removeSemicolon(String uri) {
int semicolonIndex = uri.indexOf(';');
return (semicolonIndex != -1 ? uri.substring(0, semicolonIndex) : uri);
}
不做URL解码了。
参考文章
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!