Java getRequestURI 可能出现的问题

写个简单的jsp页面

<%
    String keykey = request.getParameter("keykey");

    out.println("getContextPath:"+request.getContextPath()+"
"); out.println("getServletPath:"+request.getServletPath()+"
"); out.println("getRequestURI:"+request.getRequestURI()+"
"); out.println("getRequestURL:"+request.getRequestURL()+"
"); out.println("getQueryString:"+request.getQueryString()+"
"); %>

请求如下路径

http://pickmea.com:8081////;/examples;//;//;;//getreq.jsp?keykey=aasfasfa&asf=131

Java getRequestURI 可能出现的问题_第1张图片

各个路径大有不同,

getContextPath,获取当前的相对路径,不带/;
getServletPath,获取当前文件名称
getRequestURI,获取当前url的路径文件,不加参数,带/;
getRequestURL,全路径加域名,不带参数。
getQueryString,获取参数

由于获取到的有带分号有不带的,如果通过此路径进行鉴权,那就有可能出现问题。tomcat会忽略分号所以还是可能请求成功,fuzz下都有哪些字符。

字符列表

;
/
?
:
@
=
&
<
>
"
#
%
{
}
|
\
^
~
[
]
`
 

发现在目录后边仿造一个.的目录也是会被忽略
Java getRequestURI 可能出现的问题_第2张图片

上原有目录中加入;也是会被忽略,那么..;/等于../,通过此方法可绕过过滤../。会忽略掉;号及后面的东西即..;aasa/等于../
Java getRequestURI 可能出现的问题_第3张图片

getRequestURI 漏洞案例

权限绕过

https://mp.weixin.qq.com/s/uGGl-rPChF8D2KF-BVvr-w
修了俩次终于把getRequestURI换成了getServletPath。

https://github.com/ldbfpiaoran/springboot-acl-bypass

预防

  • 路径校验中尽量用getServletPath
  • 匹配用/*匹配

你可能感兴趣的:(Java getRequestURI 可能出现的问题)