1、HttpServletRequest中URL解析函数
url=host+uri(工程名+servlet路径)
request.getRequestURL():返回全路径;
request.getRequestURI():返回除去Host(域名或IP)部分的路径;
request.getContextPath():返回工程名部分,如果工程映射为/,则返回为空;
request.getServletPath():返回除去Host和工程名部分的路径;
漏洞出在,当后台程序使用getRequestURI()或getRequestURL()函数来解析用户请求的URL时,若URL中包含了一些特殊符号,则可能会造成访问限制绕过的安全风险,其中分号;就是其一。
问题出在tomcat对URL特殊字符的处理上
1.分号;
在URL中遇到;号会将;xxx/中的分号与斜杠之间的字符串以及分号本身都去掉:
2.斜杆/
判断是否有连续的/,存在的话则循环删除掉多余的/:
3./和…/(本级目录和上级目录)
将/./删除掉--------并将/…/进行跨目录拼接处理
那么分号的作用就显现出来了:
/;xxx/实现分割目录 (;xxx导致的匹配问题)
/…;/实现跨目录,常用在…/被禁用的场景下(不能被识别)
;.css或;.js等利用白名单绕过认证鉴权
最终结果就是绕过鉴权的拦截器,算是一个比较凶残的漏洞
解决方案:
1
要么在拦截器规则里进行,如直接获取解码、跨目录拼接后路径并予以拦截;
2
或者在路径匹配时进行拦截,不做目录拼接处理,不删除;号