01
—
检测代码
在Filter和Interceptor对某些URI进行权限校验,使用getRequestURI和getRequestURL则可能存在权限校验
漏洞原理:请求URL中可以填充一些特殊字符,来跳过权限校验
检测代码
public class URIRiskInterceptor extends HandlerInterceptorAdapter {
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层
public class FirstController {
public String test( Long id, String name) {
log.info("test,请求进来了");
return id + "-" + name + " is success";
}
}
02
—
绕过方式
String.startsWiths是字符串('String class')提供的方法之一,这个方法用于检查字符串是否以前缀以/system/login开头
如/system/login开头的接口是白名单,不需要进行访问控制(登陆页面所有人都可以访问),其他接口都需要进行登陆检查时,防止未授权访问
public class URIRiskInterceptor extends HandlerInterceptorAdapter {
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等
public class URIRiskInterceptor extends HandlerInterceptorAdapter {
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目录
漏洞出现在这里,对uri进行赋值request.getRequestURI(),接着进行一个语句判断,在24行中使用了uri.stratsWith("/admin")判断Uri路径是否以admin开头,并且判断session中的loginuser是否为空如果为空访问admin则进入false;
这里我们session是不可控的,只能针对于uri进行利用,这里uri使用的getRequestURI(),可以找一些特殊字符来绕过路径判断比如; /等
这里payload为:/;/admin/
团队二维码,后期开放免费知识库,扫码直接进群共同进步,欢迎各位师傅进群交流
原文始发于微信公众号(CodeA聊安全):Spring中getRequestURI与getRequestURL权限绕过
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论