前段时间我参与的项目被公司的安全部门检测出垂直越权的安全漏洞,我组长让我负责修复一下。
首先我查阅了一下什么是越权,以及什么是垂直越权。
越权访问漏洞指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,可以利用一些方式绕过权限检查,访问或者操作到原本无权访问的高权限功能,在实际的代码审计中,这种漏洞往往很难通过工具进行自动化监测,因此在实际应用中危害很大。其与未授权访问有一定差别,目前存在着两种越权操作类型,横向越权操作(水平越权)和纵向越权操作(垂直越权)
水平越权:指相同权限下不同的用户可以互相访问
垂直越权:指使用权限低的用户可以访问到权限较高的用户
水平越权测试方法:主要通过看看能否通过A用户操作影响到B用户
垂直越权测试思路:看看低权限用户是否能越权使用高权限用户的功能,比如普通用户可以使用管理员的功能。
接着我找到测出我这个项目有垂直越权漏洞的安全工程师,询问他测试垂直越权漏洞的方式,也就是如何复现这个漏洞。
安全工程师表示垂直越权的漏洞无法通过扫描工具或平台去测试,因为这类漏洞是跟每个项目的权限管理和角色分配息息相关,只能通过手动测试。
测试步骤:
1.浏览器打开F12,找到vue.js中配置的一些项目接口的路由。
2.先登录某个低权限用户A的账号,然后在浏览器的地址栏中直接访问第一步找到的路由地址,比如:http://ip:port/路由 。。。前提条件是该接口的是用户A不具有访问权限的一个模块中的接口。
结果发现竟然能够直接打开这个接口所在的页面,并能访问数据。
这就是所谓的垂直越权了。
根据漏洞的原理以及复现步骤,可想而知,该漏洞修复需要将项目中的权限控制细化到接口层面。对于controller层的每个接口都需要做权限的校验,如果当前登录的用户,访问某个接口时,并不具有该接口的操作权限,则不予返回数据。
解决漏洞的方案很多:
1. 可以用安全框架,比如Spring Security,Shiro
2. 可以用拦截器,拦截所有接口的请求,对每个请求做权限校验。
3. 可以用AOP,切每个接口,对每个接口做权限校验。
这里,我采用第三种方案。
具体思路:自定义一个注解,打在需要控制权限的controller层的接口上,并且设置这个接口的权限角色。然后写一个AOP,切点就是切这个自定义注解的方法,前置通知或环绕通知把方法拦截后,先获取当前登录用户的角色,再获取自定义注解中该方法的权限角色,根据这些判断当前登录用户有没有权限调用这个接口。如果有权限,则请求正常继续往下走;如果没有权限,则直接返回Response,Response中的message可以直接提示“该用户不具有该接口的权限”之类的信息。
(1)首先新增一个自定义注解
(2)新建权限校验切面类
(3)controller层接口增加自定义注解
其中自定义注解@SecurityAuth中 roleCodes 的属性值是角色的唯一编码,代码中的001、002、003分别表示三个角色,也就是说,只有001、002、003这三个角色才有权限访问这个接口,其他角色对应的用户登录后,会被aop拦截。
先用非001、002、003的角色登录平台后,然后直接在浏览器地址键入“分页查询用户列表”的url,查看页面上是否有数据返回。
如果有,则说明漏洞没修复成功;如果没有,则修复成功。
感谢:
利用AOP简单实在的防止系统垂直越权_滴哩哩哩滴哩哩哩哒哒的博客-CSDN博客