漏洞介绍
众所周知,在需要登陆的网站中,一般都需要对各用户之间进行权限隔离,一个用户理应无法对另一用户的数据进行操作。但如果网站存在越权漏洞,那么这种隔离限制就有可能形同虚设。
越权漏洞一般是指后台在检查用户操作的权限时存在纰漏,使得攻击者在获得自己用户账户的权限后,利用一些方式绕过权限检查,可以访问一些本无权访问的接口或者操作其他用户的数据资源。这种漏洞可能导致攻击者获取甚至修改其他用户的敏感信息和数据,或进行其他恶意行为,对系统和用户造成不可预估的损失。同时,这种漏洞也会对组织和企业的声誉带来负面影响,甚至可能导致经济损失和法律责任。
漏洞成因
越权漏洞的成因,主要是应用开发者在用户调用接口对数据进行增、删、改、查时,对客户端请求的数据过分相信而遗漏了权限的判定,或者在权限控制的过程中考虑不足。而一旦权限验证地不充分,就容易出现越权漏洞。
越权漏洞根据实际效果的不同,一般可以分为水平越权和垂直越权两种,区别如下图所示。
水平越权:
水平越权也叫做横向越权,是一种“基于数据的访问控制”设计缺陷引起的漏洞。由于后端在收到请求时,没有判断目标数据的拥有者就直接返回数据。也就是相同权限的不同用户之间可以互相访问数据以及执行其他用户的操作等。
比如某系统内有拥有相同的权限等级的用户A和用户B,他们都能获得属于自己的私有数据。如果系统只验证了能访问数据的角色,而没有对数据做用户层面的细分或者校验,导致用户A能访问了用户B的数据,那么这种行为就叫做水平越权。
举例说明🌰,系统存在
GET /api/userinfo?id={id}
Host: example.com
这样一个接口,用以获取当前用户的身份信息。那么如果这里存在水平越权漏洞,攻击者就可以通过注册一个正常用户来获取访问这个接口的权限,然后通过遍历修改id来获取全站用户的身份信息,造成用户信息的大量泄露。
垂直越权:
水平越权也叫做横向越权,是一种“基于接口的访问控制”设计缺陷引起的漏洞。由于后端没有对高权限接口做权限控制,导致攻击者只要可以获取到这些接口,就可以进行访问。也就是低权限用户可访问高权限用户的数据以及执行高权限用户功能等。
比如某系统内有拥有普通用户权限的用户A和拥有管理员权限的用户B,而系统的管理接口只有管理员允许访问。如果系统只在前端页面做了校验,普通用户无法获取该接口,但没有对访问这个接口的用户做权限验证,导致用户A能访问了用户B的接口,那么这种行为就叫做垂直越权。
举例说明🌰🌰,系统存在
POST /api/adduser
Host: example.com
username=*&password=*&userrole=1
这样一个接口,用以向系统内添加用户。那么如果这里存在垂直越权漏洞,攻击者就可以在通过js泄露等方式获取该接口后,注册一个低权限的普通用户,然后直接构造访问该接口的请求,为自己添加一个高权限账号,获取系统的管理权限。
交叉越权:
水平越权和垂直越权同时存在,这里不做过多赘述。
处理方式
越权漏洞的本质就是访问到当前用户本不该访问的数据、执行不该执行的操作。
那么推荐的漏洞预防/修复方式,包括但不限于:
- 采用随机生成且足够安全(长度足够,字母+数字,增加爆破难度)的id;
- 对id等越权相关参数进行加密或hash;
- 在请求中携带另外的参数,如与id绑定的token等,在后端进行双因子校验;
- 对输入参数如用户角色等,进行严格校验;
- 在进行高权限的敏感接口调用时,根据cookie/token判断当前用户身份及权限;
- …
ps:如果还有其他想法,欢迎评论区交流👀