Spring中getRequestURI与getRequestURL权限绕过

admin 2024年2月29日17:03:38评论9 views字数 2696阅读8分59秒阅读模式

01

检测代码

在Filter和Interceptor对某些URI进行权限校验,使用getRequestURI和getRequestURL则可能存在权限校验

漏洞原理:请求URL中可以填充一些特殊字符,来跳过权限校验

检测代码

@Slf4j@Servicepublic class URIRiskInterceptor extends HandlerInterceptorAdapter {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)    throws Exception {        //校验数据        String requestURI = request.getRequestURI();        String requestURL = request.getRequestURL().toString();        String servletPath = request.getServletPath();        log.info("输出数据requestURI:{}n,requestURL:{}n,servletPath:{}n", requestURI, requestURL, servletPath);        return true;    }}

Controller层

@Slf4j@RestControllerpublic class FirstController {    @RequestMapping(value = "/test")    public String test(@RequestParam("id") Long id, @RequestParam("name") String name) {        log.info("test,请求进来了");        return id + "-" + name + " is success";    }}

02

绕过方式

String.startsWiths是字符串('String class')提供的方法之一,这个方法用于检查字符串是否以前缀以/system/login开头

如/system/login开头的接口是白名单,不需要进行访问控制(登陆页面所有人都可以访问),其他接口都需要进行登陆检查时,防止未授权访问

@Slf4j@Servicepublic class URIRiskInterceptor extends HandlerInterceptorAdapter {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)            throws Exception {        //校验数据        String requestURI = request.getRequestURI();        String requestURL = request.getRequestURL().toString();        String servletPath = request.getServletPath();        log.info("输出数据requestURI:{}n,requestURL:{}n,servletPath:{}n", requestURI, requestURL, servletPath);        //放行登录请求        if (requestURI.startsWith("/system/login")) {            log.info("yes,跳过校验{}", requestURI);        } else {            log.info("no,进行校验{}", requestURI);        }        return true;    }}

这种直接包含/system/login即可实现绕过 payload如下:http://127.0.0.1/system/login/../../test

URL截断绕过

针对String.endsWith()的权限绕过

String.endsWiths是字符串('String class')提供的方法之一,这个方法用于检查字符串是否以后缀以test结尾

这里payload设置为/test;admin等

@Slf4j@Servicepublic class URIRiskInterceptor extends HandlerInterceptorAdapter {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)            throws Exception {        //校验数据        String requestURI = request.getRequestURI();        String requestURL = request.getRequestURL().toString();        String servletPath = request.getServletPath();        log.info("输出数据requestURI:{}n,requestURL:{}n,servletPath:{}n", requestURI, requestURL, servletPath);        //若结尾为.do或者.action的请求进行校验,但是SpringMVC很少有这种后缀的。        if (requestURI.endsWith("test")) {            log.info("no,进行校验{}", requestURI);        } else {            log.info("yes,跳过校验{}", requestURI);        }        return true;    }}

真实场景newbee-mall

这里用的newbee-mall的源码,有需要的可以私信找我领取源码

找到Spring过滤层Interceptor目录


Spring中getRequestURI与getRequestURL权限绕过

漏洞出现在这里,对uri进行赋值request.getRequestURI(),接着进行一个语句判断,在24行中使用了uri.stratsWith("/admin")判断Uri路径是否以admin开头,并且判断session中的loginuser是否为空如果为空访问admin则进入false;

这里我们session是不可控的,只能针对于uri进行利用,这里uri使用的getRequestURI(),可以找一些特殊字符来绕过路径判断比如; /等

这里payload为:/;/admin/

Spring中getRequestURI与getRequestURL权限绕过

团队二维码,后期开放免费知识库,扫码直接进群共同进步,欢迎各位师傅进群交流

Spring中getRequestURI与getRequestURL权限绕过

原文始发于微信公众号(CodeA聊安全):Spring中getRequestURI与getRequestURL权限绕过

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月29日17:03:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Spring中getRequestURI与getRequestURL权限绕过https://cn-sec.com/archives/2536912.html

发表评论

匿名网友 填写信息