前言
权限校验非常重要。如果不对水平、垂直权限做校验,就会发生泄漏用户数据的事故,造成P0故障。
一、水平权限漏洞
1、水平权限漏洞基本概念
什么是水平权限漏洞呢?
简单来说,水平权限漏洞是用户CURD了本不属于他的资源。以上图结构举例来说:用户B可访问2/3两个数据,当是当用户B尝试去CURD数据1且操作成功,这时候用户B的行为就是我们说的水平权限漏洞。
2、水平权限漏洞危害
用户访问成功、修改成功、删除成功、查询成功本不属于他的数据。
比如用户B对数据1执行CURD操作,虽然数据1本不属于用户B,但是我们缺少对‘水平权限’的校验,导致用户B对数据1CURD成功。
3、水平权限漏洞解决方案
方案有多种,此处我讲解一种比较常用的方案。
这个是最直接有效的修复方案:在web层的逻辑中做鉴权,检查提交CRUD请求的操作者(通过session信息得到)与目标对象的权限所有者(查数据库)是否一致,如果不一致则阻断。这个方案实现成本低、能确保漏洞的修复质量,缺点是增加了一次查库操作。我之前一直用这种方案来对已发生的水平权限漏洞做紧急修复。
XT解决水平权限的方案和上述方案一致,举例:
用户A对groupid=1001进行删除操作,那么web端是拿着groupid=1001到数据库里面找ownerid。如果ownerid=用户A,那么说明可以执行删除操作;如果不等于,说明水平权限泄漏,操作失败。 当然,如果允许主账号可以对子账号进行删除操作,那么如果用户A满足主子账号的要求,即使ownerid!=用户A,而等于主账号,也是OK的。 具体的看业务场景。
二、垂直权限漏洞
1、垂直权限漏洞基本概念
纵向越权指的是一个低级别攻击者尝试访问高级别用户的资源。
垂直权限漏洞是指Web应用没有做权限控制,或仅仅在菜单上做了权限控制,导致恶意用户只要猜到了其他页面的URL,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。
2、垂直权限漏洞危害
访问了本不属于自己的菜单界面、接口。
3、垂直权限漏洞解决方案
建议使用基于角色访问控制机制来防止纵向越权攻击,即预先定义不同的权限角色,为每个角色分配不同的权限,每个用户都属于特定的角色,即拥有固定的权限,当用户执行某个动作或产生某种行为时,通过用户所在的角色判定该动作或者行为是否允许。