- 什么是越权?
越权漏洞成因主要是因为开发过程中对数据增删改查时对客户端没有进行严格的权限判定,导致单个用户可以操作其他用户的一些操作,叫做越权。
换句话来讲就是,A用户与B用户之间可以访问自身的内容(例如个人资料、地址等),由于数据进行查询操作的时候并没有对用户的身份识别进行判断,导致A用户可以越权查看B用户才能看到的内容 - 水平越权和垂直越权
我们都知道,越权分为水平越权和垂直越权,那么什么是水平越权什么是垂直越权呢?
攻击者能执行与自己同级别的其他用户执行的操作,即尝试访问与它拥有相同权限的用户资源,即水平越权
其实我觉得这句话比较笼统,因为在工作当中很多人都有一个误区,那就是大多数人认为,水平越权通常发生在同级别用户当中,即普通用户与普通用户之间、管理员用户与管理员用户之间。
而垂直越权则发生在普通用户与管理员用户之间,相信很多朋友都会有这个误区,毕竟都是这么写的。
然而我在这里想问大家一下,什么是管理员用户,什么是普通用户?在开发者的程序里,我看到用户的权限分为很多等级,我曾经做过一个项目名为《用户权限管理平台》,即便是管理员,也分为10个等级,那么不同等级的管理员之间的越权行为还能是水平越权吗? - 自我思考
通过一些项目不难发现,所谓管理员和普通用户能够访问的内容其实有很大一部分是共通的,就像数学里面的取交集
如上图所示,这个是一个资金管理平台的项目,里面所展示的仅仅是部分功能点,其中红色标注字体是管理员用户比普通用户多出来的功能,而黑色则是管理员用户与普通用户都有的相同功能。
所以我认为,所谓的水平越权,不如说是:攻击者能执行与自己同权限不同内容的其他用户执行的操作,即尝试访问与它拥有相同访问权限的用户资源,即水平越权
什么意思呢?即用户A是普通用户,用户A和管理员用户B拥有部分相同的功能,比如说“付款管理”
按照正常的逻辑,用户A只能访问属于自己的付款管理记录,而管理员可以访问所有人的付款管理记录,现在用户A通过修改特有的参数访问到了其他用户的付款记录,这不就是水平越权了吗?
可能有人会问,那A用户访问的资源是其他用户的,那其他用户的不就还是普通用户,你这不等于没说吗?
所以说,我觉得管理员用户的功能不如说是一个汇总,他拥有普通用户绝大多数或者是全部的功能,同样拥有普通用户没有的功能,而权限的划分也并不应该是根据用户的身份划分,而应该根据用户的功能划分。 - 示例
如果按照以上的思路走,就是越权的区分在于用户的功能而不是用户的身份权限,举一个小例子,一个房源管理平台的小例子
现有两个用户,二者都是这家公司的员工,但是一个是财务员工,一个是营销员工。
二者权限一致,甚至某些功能都是一样的,但是营销多出来的功能,比如说售后功能,而财务可能会多出来一个交易管理功能,那这二者功能点的差异还能说是水平越权吗? - 越权漏洞的危害
说了这么多,那么越权操作都会造成哪些危害呢?
越权访问,这类漏洞是指应用在检查授权(Authorization)时存在纰漏,使得攻击者在获得低权限用户帐后后,可以利用一些方式绕过权限检查,访问或者操作到原本无权访问的高权限功能。在实际的代码安全审查中,这类漏洞往往很难通过工具进行自动化检测,因此在实际应用中危害很大。其与未授权访问有一定差别。
也就是说,越权会影响到很大一部分的正常业务,举个例子。
一个销售平台,用户买东西需要填写邮寄地址,攻击者在获取到越权点之后通过一系列手段更改了用户的收件地址,从而导致你买的东西邮到了我家。
那么我们在工作的时候该如何去挖掘这种漏洞呢? - 越权的挖掘与验证
在测试的过程中,如果想更好的挖掘出漏洞,甲方会满足测试者的所有条件,比如说给你两个甚至是三个测试账号
其中一个是管理员账号,拥有着最高的权限,两个普通用户(普通用户里面的功能也不一定就是一样的,甚至说管理员用户可能还会缺少普通用户的功能)
而我们登录账户之后要做的第一件事是观察,查看一下用户之间有哪些共同的功能点,有哪些不同的功能点,相同的功能点里面有哪些内容是不一样的,这个就是重点关注对象
大家可以看到,上面的两个账户一个是营销账户一个是财务账户,二者功能模块相似,但是其中的内容却不是完全一样的,由于保密协议的原因不便展示
最上面的消息提醒可以看到,二者未读消息一个是6一个是28,可以点进去看一下
通常来讲,一个有数据交互的页面通常都是由至少两个参数决定的,一个是用户的身份信息,即token/sessionid/单点登录 加上请求的参数(id/oid/userid......)
而首先我们抓取数据包要做的就是将一些没有用的数据删除掉,这样的好处是能找到究竟是哪个参数导致了越权的产生,甚至还能挖掘到其他的漏洞,比如说未授权访问
而想到快速确定这里存在越权与否,如果是get请求,仅需抓取数据包,将请求头拿走放到浏览器里直接访问,看看能不能正常访问即可
如果是垂直越权并且还是post请求,可以将用户的有效的身份信息覆盖即可,那么为什么说是有效信息呢?
看看,一个cookie里有多少东西呢,那么怎么验证是不是都是有用的呢?一个一个删,然后发送数据包,如果页面可以正常请求那么就是没用的垃圾数据,如果全删没了还能访问,恭喜你,你找到了未授权访问。
这里需要注意的是要留意请求里是否携带其他的身份验证,而不是放在这个cookie里面了
甚至可以说,留意referer来源地址,里面也会有意想不到的惊喜哦!
好了,分享到此结束