java 权限url权限_filter设计缺陷导致的权限绕过

本文探讨了Java中基于filter的权限控制设计缺陷,包括非标准化绕过、URL截断绕过、URL编码绕过以及Spring Web动态Controller追加/的绕过方式。通过分析这些绕过手段,提出了修复建议,如使用安全的路径获取方法,进行接口标准化处理,使用ESAPI的规范化方法,并推荐使用成熟的权限控制框架。
摘要由CSDN通过智能技术生成
  • 1.1 权限控制的本质

一般来说,为了防止越权操作,通常会结合filter进⾏相关接⼝的鉴权操作。其中不不外乎就是对每⼀个接口(通俗来说就是我们的URI/URL)进行业务梳理,然后判断当前URI/URL是否具有相应的业务权限。

  • 1.2 常见权限控制的实现

一般情况下,通常是获取到当前URI/URL,然后跟需要鉴权的接口进行⽐对,或者直接结合startsWith()或者endsWith()方法,设置对应的校验名单。

例如下⾯的过滤器实现,以/login开头的不需要校验(登陆业务每个人都可以访问),所有.do/.action结尾的接⼝均需要做登陆检查,防止未授权访问等。

String uri = request.getRequestURI();if(uri.endsWith(".do")||uri.endsWith(".action")) {
    //检测当前用户是否登陆User user =(User) request.getSession().getAttribute("user");if(user==null|| "".equals(user)) {
    errorResponse(response, paramN, "未授权访问");return;}}

但是,在Java中获取当前request中的URI/URL通常会使用request.getRequestURL()和request.getRequestURI()这两个方法,但是如果没有进⾏相关的处理的话,有可能导致权限控制绕过的风险。

  • 1.3 绕过方式

当权限过滤器获取当前request中的URI/URL使用request.getRequestURL()和request.getRequestURI()这两个方法时,可以考虑以下三种⽅式进行权限绕过:

  • 1.3.1 非标准化绕过

  • 相关场景:

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

String uri = request.getRequestURI();if(uri.startsWith("/system/login")) {
    //登陆接口设置⽩白名单filterChain.doFilter(request, response);}else if(uri.endsWith(".do")||uri.endsWith(".action")) {
    //检测当前⽤户是否登陆User user =(User) request.getSession().getAttribute("user");if(user==null|| "".equals(user)) {
    errorResponse(response, paramN, "未授权访问");return;}}
  • 相关效果如下:

当未登录直接访问UserInfoSearch.do接口时,显示未授权访问:

99b4c2d9e022231b88c3f5cd87033d00.png

  • 相关原理:

中间件在进⾏解析时,会对我们URI中的../进行相关处理从⽽得到相关的servlet。也就是说尝试对我们访问的URL引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值