getRequestURl导致的安全鉴权问题

getRequestURl导致的安全鉴权问题

经常我们在看到相关的一些JAVA程序站点的时候会遇到一些问题即为,为什么他们的POC在最后总有一

些让人不理解的字符例如:;.js ;server ;.css等。

我们进行盲猜的时候大概可以知道这大概率是为了绕过鉴权的,但是因为什么可以导致被绕过呢,今天

我们来展开分析。

获取URL的几个方法:


System.out.println("1:我是getRequestURI"+requestURI);

StringBuffer requestURL \= request.getRequestURL(); //获取url

System.out.println("2:我是getRequestURl"+requestURI);

String servletPath \= request.getServletPath(); //获取Servlet的路径

System.out.println("3:我是getServletPath"+requestURI);

在JAVA当中获取到当前的URL一般可以分为上述几个方法,我们来进行运行查看。

Snipaste_2024-08-22_21-32-56.png
可以看到最后一个是I的获取到的只是访问的目录
URL的获取到的是全部的一个地址
ServletPath获取到的也是一个访问目录
在经过测试之后可以发现一个问题:

测试相关的Payload绕过

Snipaste_2024-08-22_21-33-51.png

那么即为上述问题,可以看到不同的获取URL的方法,对于结果并不一样。
可以看出来,其中两个方法:
getRequestURL
getRequestURI
获取到的参数都不尽相同,但是我们是否能够成功的进行访问呢。

Snipaste_2024-08-22_21-35-07.png
可以看到我们即使输入别的参数也是可以正常访问到的。
这里我们模拟一个环境。
getRequestURL方法

Snipaste_2024-08-22_21-35-26.png
这里我设置了一个过滤器,要求是过滤全部的请求,通读一次代码为,若是在URL当中判断出来存在相关的.css的时候放行,若是不存在.css那么不允许进行放行。

Snipaste_2024-08-22_21-35-52.png
那么我们使用上述的payload即可进行相关的绕过,导致我们可以成功的被放行。

getRequestURI方法

Snipaste_2024-08-22_21-36-32.png
同样我们换成getRequestURI方法的时候也是可以进行绕过的。

Snipaste_2024-08-22_21-36-51.png
那么我们换成下一个方法

getServletPath方法

Snipaste_2024-08-22_21-37-25.png
我们在进行测试绕过的时候可以发现。

Snipaste_2024-08-22_21-37-45.png
使用这个方法是不能够成功绕过的。

equals与endsWith

并且自己在测试的时候发现,若是变为equals方法是无法进行绕过的。
再通过查询相关资料之后发现

Snipaste_2024-08-22_21-38-26.png
equals是进行判断两个值是否等价,也就是是否是完全相等的,然而endsWith是来判断一个字符串的结尾是否为指定结尾的

Snipaste_2024-08-22_21-38-59.png
可以看到其中的indexOf方法也是比较好理解的,也是进行一个指定内容在字符串当中出现的位置。
然而startsWith方法则是进行判断是否以某个字符串开头的

Snipaste_2024-08-22_21-39-45.png
在其他方法当中都是可以绕过的除了(equles)那么方法startsWith该如何进行绕过呢。
下面代码实例

Snipaste_2024-08-22_21-40-11.png
可以看到这段过滤器当中进行了判断是否.css开头,那么这种办法是无法进行绕过的,但是如果他指定某一个路径开头呢

Snipaste_2024-08-22_21-40-31.png
回到刚才我们可以看到我们输入/a/../index也是可以的,那么当过滤器代码变为了下面这种

Snipaste_2024-08-22_21-40-51.png
指定我们以css目录开头

Snipaste_2024-08-22_21-41-09.png
同样我们也是可以进行绕过的。
全程代码只有一个路由/Servlet_dome以及一个过滤器

相关代码


import jdk.nashorn.internal.ir.RuntimeNode;

import javax.servlet.\*;

import javax.servlet.http.HttpServletRequest;

import java.io.IOException;

import java.io.PrintWriter;

public class Filter\_dome implements Filter {public void init(FilterConfig config) throws ServletException {

}

public void destroy() {

}

@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws ServletException, IOException {

HttpServletRequest req \= (HttpServletRequest) request;

String requestURL \= req.getRequestURI();

if (requestURL.startsWith("/css")){

chain.doFilter(request,response);

}

else {

PrintWriter writer \= response.getWriter();

writer.println("false");

}

}

}

相关Servlet代码


import javax.servlet.\*;

import javax.servlet.http.\*;

import javax.servlet.annotation.\*;

import java.io.IOException;

import java.io.PrintWriter;

@WebServlet(name \= "Servlet\_dome", value \= "/Servlet\_dome")

public class Servlet\_dome extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

String requestURI \= request.getRequestURI(); // 获取整个URL

System.out.println("1:我是getRequestURI"+requestURI);

StringBuffer requestURL \= request.getRequestURL(); //获取url

System.out.println("2:我是getRequestURl"+requestURL);

String servletPath \= request.getServletPath(); //获取Servlet的路径

System.out.println("3:我是getServletPath"+servletPath);

PrintWriter writer \= response.getWriter();

writer.println("success");

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

}

}

相关web.xml代码


<web-app xmlns\="http://xmlns.jcp.org/xml/ns/javaee"

xmlns:xsi\="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation\="http://xmlns.jcp.org/xml/ns/javaee

http://xmlns.jcp.org/xml/ns/javaee/web-app\_4\_0.xsd"

version\="4.0"\>

<filter>

<filter-name>Filter\_dome</filter-name>

<filter-class>controller.Filter\_dome</filter-class>

</filter>

<filter-mapping>

<filter-name>Filter\_dome</filter-name>

<url-pattern>/\*</url-pattern>

</filter-mapping>

</web-app>

相关案例:

某大型源码导致权限的绕过

Snipaste_2024-08-22_21-43-02.png
这一段是进行过滤SQL注入攻击的,但是发现使用的getRequestURl来获取到相关的路径,并且通过
indexOf来判断出现的位置,出现相关参数之后就不会在进行绕过而是进行了放行,导致被sql注入攻击

某大型厂商导致权限绕过

Snipaste_2024-08-22_21-43-30.png
这个运用了Spring框架,其中明确规定了若是访问路径为.js或.css等不进行过滤,然而看下面的过滤器类
名称可以看到为Login等方法,也能想到可以进行绕过认证导致前台漏洞的产生

总结

getRequestURL() 和 getRequestURI() 这两个API解析的URL是包含特殊字符的,当使用不当时会存在
安全问题,我们应该进行使用 getServletPath() 来获取URI。

  • 发表于 2024-09-18 10:14:37
  • 阅读 ( 17173 )
  • 分类:漏洞分析

1 条评论

Ambition
好好好
请先 登录 后评论
请先 登录 后评论
echoa
echoa

6 篇文章

站长统计