问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
getRequestURl导致的安全鉴权问题
漏洞分析
getRequestURl导致的安全鉴权问题
经常我们在看到相关的一些JAVA程序站点的时候会遇到一些问题即为,为什么他们的POC在最后总有一 些让人不理解的字符例如:;.js ;server ;.css等。 我们进行盲猜的时候大概可以知道这大概率是为了绕过鉴权的,但是因为什么可以导致被绕过呢,今天 我们来展开分析。 ### 获取URL的几个方法: ```String 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一般可以分为上述几个方法,我们来进行运行查看。  可以看到最后一个是I的获取到的只是访问的目录 URL的获取到的是全部的一个地址 ServletPath获取到的也是一个访问目录 在经过测试之后可以发现一个问题: #### 测试相关的Payload绕过  那么即为上述问题,可以看到不同的获取URL的方法,对于结果并不一样。 可以看出来,其中两个方法: getRequestURL getRequestURI 获取到的参数都不尽相同,但是我们是否能够成功的进行访问呢。  可以看到我们即使输入别的参数也是可以正常访问到的。 这里我们模拟一个环境。 getRequestURL方法  这里我设置了一个过滤器,要求是过滤全部的请求,通读一次代码为,若是在URL当中判断出来存在相关的.css的时候放行,若是不存在.css那么不允许进行放行。  那么我们使用上述的payload即可进行相关的绕过,导致我们可以成功的被放行。 #### getRequestURI方法  同样我们换成getRequestURI方法的时候也是可以进行绕过的。  那么我们换成下一个方法 #### getServletPath方法  我们在进行测试绕过的时候可以发现。  使用这个方法是不能够成功绕过的。 #### equals与endsWith 并且自己在测试的时候发现,若是变为equals方法是无法进行绕过的。 再通过查询相关资料之后发现  equals是进行判断两个值是否等价,也就是是否是完全相等的,然而endsWith是来判断一个字符串的结尾是否为指定结尾的  可以看到其中的indexOf方法也是比较好理解的,也是进行一个指定内容在字符串当中出现的位置。 然而startsWith方法则是进行判断是否以某个字符串开头的  在其他方法当中都是可以绕过的除了(equles)那么方法startsWith该如何进行绕过呢。 下面代码实例  可以看到这段过滤器当中进行了判断是否.css开头,那么这种办法是无法进行绕过的,但是如果他指定某一个路径开头呢  回到刚才我们可以看到我们输入/a/../index也是可以的,那么当过滤器代码变为了下面这种  指定我们以css目录开头  同样我们也是可以进行绕过的。 全程代码只有一个路由/Servlet\_dome以及一个过滤器 #### 相关代码 ```jspackage 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代码 ```package 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代码 ```<?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> ``` ### 相关案例: #### 某大型源码导致权限的绕过  这一段是进行过滤SQL注入攻击的,但是发现使用的getRequestURl来获取到相关的路径,并且通过 indexOf来判断出现的位置,出现相关参数之后就不会在进行绕过而是进行了放行,导致被sql注入攻击 #### 某大型厂商导致权限绕过  这个运用了Spring框架,其中明确规定了若是访问路径为.js或.css等不进行过滤,然而看下面的过滤器类 名称可以看到为Login等方法,也能想到可以进行绕过认证导致前台漏洞的产生 ### **总结** getRequestURL() 和 getRequestURI() 这两个API解析的URL是包含特殊字符的,当使用不当时会存在 安全问题,我们应该进行使用 **getServletPath()** 来获取URI。
发表于 2024-09-18 10:14:37
阅读 ( 15229 )
分类:
漏洞分析
1 推荐
收藏
1 条评论
Ambition
2024-09-23 18:07
好好好
请先
登录
后评论
请先
登录
后评论
echoa
5 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!