Java getRequestURI 可能出現的問題


寫個簡單的jsp頁面

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

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

%>

請求如下路徑

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

各個路徑大有不同,

getContextPath,獲取當前的相對路徑,不帶/;
getServletPath,獲取當前文件名稱
getRequestURI,獲取當前url的路徑文件,不加參數,帶/;
getRequestURL,全路徑加域名,不帶參數。
getQueryString,獲取參數

由於獲取到的有帶分號有不帶的,如果通過此路徑進行鑒權,那就有可能出現問題。tomcat會忽略分號所以還是可能請求成功,fuzz下都有哪些字符。

字符列表

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

發現在目錄后邊仿造一個.的目錄也是會被忽略

上原有目錄中加入;也是會被忽略,那么..;/等於../,通過此方法可繞過過濾../。會忽略掉;號及后面的東西即..;aasa/等於../

getRequestURI 漏洞案例

權限繞過

https://mp.weixin.qq.com/s/uGGl-rPChF8D2KF-BVvr-w
修了倆次終於把getRequestURI換成了getServletPath。

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

預防

  • 路徑校驗中盡量用getServletPath
  • 匹配用/*匹配


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM