一、逻辑越权
1.1 漏洞原理
逻辑越权漏洞就是当用户跳过自己的权限限制,去操作同等级用户或者上级用户。正常的情况下,当一个用户去访问某个资源的时候,首先需要去登录验证自己的权限,其次是对数据的查询,最后返回数据内容。
但是如果在权限验证这里,出现了验证不足或者根本就没有验证,那么就会导致越权漏洞的出现。
1.2 漏洞原因
对数据的增删改查的对人员客户端的请求数据过分相信,未对其进行权限判定而导致的问题。说白了,就是过分相信了数据包,而忽略了别有用心之人对数据包的篡改。
二、逻辑越权的分类
2.1 水平越权
水平越权是进行同级别权限的越权访问。比如:原本你只能查看自己的工单,但是你越过了权限查看了你隔壁同事的工单(隔壁同事为同级别),这就造成了水平越权访问。
如图所示,普通用户A的权限原本仅限于访问自己的工单,但是通过水平越权访问普通用户B的工单。
2.2 垂直越权
垂直越权就是通过自身低权限账号去执行高权限账号所能执行的操作。例如:普通用户却得到里管理权限的查看所有的用户的权限。
如图所示,各个级别的用户有着不同的权限,董事长为最高权限的用户,但是普通员工通过垂直越权直接访问了董事长的工单,虽然该垂直越权所进行的操作仅仅是访问工单,但同样通过垂直越权说不定可以直接审批给自己涨工资的操作呢~
三、逻辑越权姿势
3.1 登录脆弱性
登陆点爆破
一般情况下,登录点未进行错误次数限制,那么就可以进行爆破。
HTTP/HTTPS传输|验证密文比对安全测试
如果为HTTPS传输数据或者采取了其他加密方式传输,需要先探测出加密方式,后续在Bp中加密后再进行爆破操作。
Cookie脆弱点验证
一般需要进行源码审计,判断Cookie的构成形式,是否可以通过构造Cookie中某个可变字段的值从而达到绕过效果。但若没有源码的情况下,只能进行盲探,难度较大。
session固定点测试
session固定点测试换一个角度理解就是会话固定,可以通过劫持有效会话从而达到一个越权拿到当前用户所访问的所有信息,或者得到用户的固定sessionID,从而达到越权访问。session和Cookie之间的区别这里不做赘述,可以把这两个都以理解为一种访问凭证。
3.2 支付篡改
可篡改点:
修改订单中商品数量
将商品数量修改为-1,若订单支付价格计算逻辑为订单数量*商品价格,则有可能造成支付金额为负数,从而支付金额为0。
修改商品单价
修改数据包中商品单价对应的字段,从而篡改最终支付价格。(如果所有计算操作都调用数据库中的数据或者在数据库中完成,则无法实现支付篡改)
修改订单ID
先创建个便宜的订单,得到订单ID,在创建第二个高价订单,在支付的时候修改订单编号为上个便宜订单的订单ID,从而支付便宜订单得到高价订单的操作。
修改调用支付接口
篡改数据包中的调用支付接口的数据,从而调用自己的某一接口。
3.3 找回机制
客户端回显
验证码在客户端浏览器或数据包中回显。
Response状态值
单独请求回复状态值判断验证码是否正确。
验证码爆破
纯数字验证码过于简单,可以进行爆破。
找回流程绕过
一个正常的找回流程分为3步:
1、输入找回账号;
2、验证找回信息;
3、重置密码。
可以通过丢弃中间数据包,直接跳过中间验证步骤,进行密码重置操作。
3.4 接口安全
接口调用
例如调用某网站短信接口,修改数据包中目标电话的value,大量调用短息接口给同一目标就可以造成短信轰炸。
3.5 验证码
验证码识别
借助第三方工具对验证进行识别,识别结果结合Bp进行爆破。
验证码复用
开发人员进行程序涉及的时候,给通过验证的验证码分配了session但是并未销毁session,导致可以借助已通过验证的验证码的session来绕过后续的验证。
验证码绕过
本地验证(前端验证)
本地代码审计,观察是否在执行发送后会调用本地JS代码,或者在浏览器中执行禁用JS,观察是否会对提交产生影响。绕过思路是直接通过Bp强行发包,忽略在本地的验证。
服务器验证(后端验证)
关于服务器端的验证可能会存在如下问题:
验证码在后台不过期,导致可以长期被使用;
提交一次正确验证码的表单,间隔一段时候后再次提交相同验证码的表单,表单中账号密码随意输入,若是仅返回账密错误,那表示上次提交的验证码任然存活。
验证码校验不严格,逻辑出现问题;
后端允许对错误的验证码有一定次数的尝试,为攻击这提供了可猜测的机会。
验证码设计的太过简单和有规律,容易被猜解
容易理解,验证码有序有规律,容易被攻击者猜测。
3.6 token
客户端回显
下一次的token将会在response回包中回显,这样可以判断除token的值是在服务器端生成的,可以借助Bp中的工具得到每次回包中的token然后添加到下一次爆破的数据包中,能实现存在token的情况下进行爆破。
四、修复防御方案
- 前后端同时对用户输入信息进行校验,双重验证机制;
- 调用功能前验证用户是否有权限调用相应功能;
- 执行关键操作前必须验证用户身份,验证用户是否具备操作数据的权限;
- 直接对象引用的加密资源 ID,防止攻击者枚举 ID,敏感数据特殊化处理;