越权漏洞分类

  1. 未授权访问:本来没有账号(即没有某个功能权限),但是通过越权操作,获取了某个功能权限
  2. 水平越权(横向越权):通过越权操作,能操作其他同等权限账号的数据
  3. 垂直越权(纵向越权):低权限用户通过越权操作获取了高权限

测试方法

未授权访问

最简单的测试方法就是不登录用户,直接访问要测试的需要登录的功能模块,如果可以访问成功,则说明存在漏洞。

我们期望的应该是:

有些系统是在cookie中添加一个类似userId的字段来标识是否登录成功,这样的系统可以通过伪造cookie信息来进行测试。

我们期望的应该是:

水平越权

水平越权常见于业务系统中,例如对用户信息或者订单信息进行增删改查操作时,由于用户编号或者订单编号有规律可循(有序递增,订单编号常发现以日期开头后面再接几位有序增长的数字,类似20200520xxxx1,20200520xxxx2),测试人员通过burpsuite的 intruder对目标参数进行遍历测试即可,如发现用户A能操作用户B的用户信息或者订单信息,则说明存在漏洞,其中用户A和用户B是具有同等权限的用户。

我们期望的应该是:

垂直越权

准备两个用户,用户A是一个低权限角色的用户,用户B是管理员角色的用户,对某些应该只有管理员角色才有访问权限的功能模块,使用用户A登录进行访问,如果能正常访问,则说明漏洞存在。这里有些系统是前后端分离,可能直接访问前端用户A是看不到用户B的某些菜单的,可以先使用用户B登录系统,将相关链接或接口记录下来,之后再用用户A登录,来直接访问记录下来的链接或相关接口。

我们期望的应该是:

解决方案

对于越权问题的解决思路是对用户访问的资源进行拦截,判断当前用户是否有该资源的权限,如果有则放行,请求用户要访问的资源,如果没有则直接返回相应的提示,不再请求用户要访问的资源。
在SpringWeb项目中要解决越权问题,大体上可以有2种解决方案。

  1. 使用Servlet的过滤器,对请求资源(可以是所有的资源,包括一些静态的资源)进行过滤拦截,对当前用户和当前请求做权限判断(静态资源也需要拦截的使用这种方案)
  2. 使用SpringMVC的拦截器,对请求资源(只能拦截Controller接口资源)进行过滤拦截,对当前用户和当前请求做权限判断(Spring项目推荐使用这种方案)
    这2种方案主要是来解决未授权访问和垂直越权的问题,对于水平越权问题本质上还是要对访问数据做数据权限的控制或者对访问资源做用户隔离(操作数据时带上userId进行操作)这样就可以保证操作不到其他人的数据了。当然如果专门有数据权限的控制,则和垂直越权问题一样来解决。

以下给出两种解决方案的可参考的代码实现(实际使用过程中,根据自身项目情况进行改造)
项目环境:
JDK 1.8
Maven 3.6.3
SpringBoot项目,版本如下

  <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.5</version><relativePath/></parent><dependencies><!--springboot web 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.5</version></dependency><!-- json解析库 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version></dependency><dependencies>

Servlet过滤器代码实现

这里提供的是基于注解方式实现的。
1 AuthorizeFilter过滤器

/*** filterName:指定过滤器的名字* urlPatterns: 指定需要过滤的地址* @author luojj* @since 2022-04-11 18:27*/
@WebFilter(filterName = "authorizeFilter",urlPatterns = {"/user/*"})
public class AuthorizeFilter implements Filter {private static final String USER_KEY = "APP_USER_ID";@AutowiredUserService userService;@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)servletRequest;final String userId = request.getHeader(USER_KEY);if(canAccess(userId,request.getRequestURI())){filterChain.doFilter(servletRequest,servletResponse);return;}//处理鉴权失败//final Rsp<?> rsp = Rsp.fail(403, "无权访问");//这里实际项目上可以使用项目定义的Rsp对象Map<String,Object> rsp = new HashMap<>(2);rsp.put("code",403);rsp.put("msg","无权访问");servletResponse.setCharacterEncoding("UTF-8");servletResponse.setContentType("application/json; charset=utf-8");final PrintWriter writer = servletResponse.getWriter();writer.write(JSON.toJSONString(rsp));}private boolean canAccess(String userId,String path) {if(userId == null){return false;}//此处是具体查询用户具有哪些权限的,具体使用自己的项目上的Service方法final Set<String> userAccessUrls = userService.getUserAccessUrls(userId);return userAccessUrls.contains(path);}
}

2 需要在springboot启动类上添加以下注解,保证spring可以扫描到我们自己实现的过滤器
@ServletComponentScan(basePackageClasses = {AuthorizeFilter.class})

对于方案1至此就实现完成了。

SpringMVC拦截器代码实现

1 AuthorizeInterceptor 拦截器

@Component
public class AuthorizeInterceptor implements HandlerInterceptor {private static final String USER_KEY = "APP_USER_ID";@AutowiredUserService userService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if(!(handler instanceof HandlerMethod)){return true;}final String userId = request.getHeader(USER_KEY);if(canAccess(userId,request.getRequestURI())){return true;}//处理鉴权失败
//        final Rsp rsp = Rsp.fail(403, "无权访问");Map<String,Object> rsp = new HashMap<>(2);rsp.put("code",403);rsp.put("msg","无权访问");response.setCharacterEncoding("UTF-8");response.setContentType("application/json; charset=utf-8");final PrintWriter writer = response.getWriter();writer.write(JSON.toJSONString(rsp));return false;}private boolean canAccess(String userId,String path) {if(userId == null){return false;}final Set<String> userAccessUrls = userService.getUserAccessUrls(userId);return userAccessUrls.contains(path);}}

2 鉴权拦截器相关MVC配置

@Configuration
@AllArgsConstructor
public class AuthorizeWebMvcConfig implements WebMvcConfigurer {AuthorizeInterceptor authorizeInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(authorizeInterceptor).addPathPatterns("/**")//这是指定排除哪些访问地址不拦截.excludePathPatterns("/swagger-resources","/v2/api-docs");}
}

对于第2种方案至此就实现完成了。

SpringWeb项目越权漏洞以及解决方案相关推荐

  1. Java(web)项目安全漏洞及解决方式【面试+工作】

    Java(web)项目安全漏洞及解决方式[面试+工作] 一.安全性问题层次关系 大家经常会听到看到很多很多有关安全性方面的信息,可以说形形色色,对于在网络安全方面不太专业的同志来说,有点眼花缭乱,理不 ...

  2. [HW必备]|蓝队防守必须排查的57个安全漏洞与解决方案

    欢迎关注我的微信公众号:安全攻防渗透 信息安全领域原创公号,专注信安领域人才培养和知识分享,致力于帮助叁年以下信安从业者的学习和成长. 近日安全漏洞频发,博主在此收集了近期大家会比较关注的漏洞,做个总 ...

  3. Java开发常见漏洞及解决方案

    文章目录 1.健康监控Actuator暴露端口 2.SSRF漏洞攻击 3.富文本XSS攻击 4.暴力破解短信验证码登录 5.恶意短信轰炸骚扰用户 6.低版本Fastjson导致RCE漏洞 7.SQL注 ...

  4. 越权漏洞测试之网站渗透测试服务

    网络上,大家经常可以看到数据库被脱裤.用户信息泄露等由于安全漏洞引发的问题,给用户和企业都带来了很大的损失.由于公司业务发展迅速,功能不断增加,用户数量不断增加,安全问题日益受到人们的关注.业务部门和 ...

  5. 基于fiddler插件的代理扫描系统:越权漏洞检测

    基于fiddler插件的代理扫描系统:越权漏洞检测 # 概述 ##越权检测原理 ###系统架构 #基本步骤 待优化与工具联动 工具联动: 其他漏洞检测 # 概述 随着现在企业安全水平的提高, 单独依赖 ...

  6. Android Studio 第一次新建Android Gradle项目超级慢的解决方案

    Android Studio 第一次新建Android Gradle项目超级慢的解决方案 参考文章: (1)Android Studio 第一次新建Android Gradle项目超级慢的解决方案 ( ...

  7. 【Git】PyCharm项目关联Git的解决方案

    核心操作和<IntelliJ_IDEA项目关联Git的解决方案>是一致的,毕竟都是JetBrains家的产品. 这次简明扼要地总结一下步骤(默认你已经能做到本地Git和Github关联): ...

  8. vue项目中常见问题及解决方案

    vue项目中常见问题及解决方案 参考文章: (1)vue项目中常见问题及解决方案 (2)https://www.cnblogs.com/jiekzou/p/11011271.html (3)https ...

  9. 还在人工测越权漏洞?快来自动扫描吧!

    前言 关于越权漏洞,大家都熟知水平越权.垂直越权.未授权访问,此处不再赘述概念了. 对于越权类漏洞的测试,通用的测试方法,也都是人工通过代理抓包工具截获报文,然后尝试删除Cookie测试是否存在访问越 ...

最新文章

  1. 减法变加法------补码----同余理论
  2. 卧底各大程序员圈,才知道什么才是牛逼的程序员!
  3. TCP的三个接收队列
  4. 剑指offer_04
  5. linux查看串口端口,规范模式Linux串行端口
  6. Git Merge代码失败 解决
  7. 6-7 使用函数输出水仙花数_Go语言并发如何使用才更加高效
  8. 花生壳内网穿透实践指南
  9. android无线投屏到电视盒子,如何把电脑视频投屏到智能电视/电视盒子上?
  10. 68pin SCSI接头针脚排序
  11. 【WINRAR安装和使用教程】常用压缩软件
  12. 两台计算机如何组成局域网,两台电脑如何建立局域网
  13. 公众号第三方平台开发 教程六 代公众号使用JS SDK说明
  14. Android UI
  15. 捣鼓openwrt不死bootloader (1)
  16. 【tomcat】6、调优
  17. 损失函数 -交叉熵损失函数
  18. 腾讯企业邮箱HTTPS设置
  19. 计算机学院杨洋,杨洋-湖北大学计算机与信息工程学院
  20. uni-app:小程序开发总结

热门文章

  1. [渲染层网络层错误]导致图片无法成功加载显示 (HTTP/1.1 500 Internal Server Error)
  2. redis监控系统redis-stat应用
  3. CSP-202303-3 LDAP
  4. VMware虚拟机网络设置及hostname设置
  5. python等高线图轮廓线提取_Python:从matplotlib.pyplot.contour()中找到轮廓线
  6. 曾经最美——好朋友一封感人的信
  7. C语言-五子棋【详解】
  8. redhat php gd,RedHat下安装并开启PHP GD库的步骤
  9. 小米笔记本Pro 2020款 显卡MX350 CUDA+cuDNN tensorflow-gpu安装
  10. sql server语法——联合查询