Fork me on GitHub

OWASP top10-失效的访问控制,越权与逻辑漏洞

失效的访问控制,越权与逻辑漏洞

越权等逻辑漏洞都属于业务设计缺陷的安全问题,因此不受安全设备(例如防火墙,wafer...)限制。然而却也是最常见,危害性不可小觑的漏洞!因此,在排除安全设备安全隐患后我们还需要进行失效的访问权限控制探测

根据前辈对常见的漏洞进行的统计,发现其中越权操作和逻辑漏洞占比最高。在我们所测试过的平台中基本都有发现,包括任意查询用户信息、任意删除等行为;最严重的漏洞出现在账号安全,包括重置任意用户密码、验证码暴力破解 

越权概述

什么是越权:

如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为纵向越权操作。

如果使用C用户的权限去操作D用户的权限,C和D都是同等级用户,则成为水平越权。

越权漏洞也应当属于逻辑漏洞,但是由于它的危害性大且广,所以先单独记录一下。

形成原因:

越权漏洞形成的原因是:后台使用了不合理的权限校验规则(例如:没有进行session判断而是直接用户名判断),或者没有 进行权限分离配置导致的。

①只是进行了前段js身份校验,那么就可以抓包修改用户id登陆(这种情况很少),这就叫抓包绕过

②多阶段功能,但是只对前期的登陆页面进行了身份验证,这样的话在输入测试用户正常登陆后就可以抓包更改各种可控参数,肆意操作(这里只测试范围内的合法操作者)了。例如:修改当前用户信息,查看他人信息,修改他人密码....;或者修改访问资料,例如:会员资料url泄露后,普通会员可以通过会员url享受会员资料和服务;会员资料下载,普通用户查看....ps:例如今年护网时,天融信的管理员修改密码不需要原密码校验漏洞,(直接访问他修改密码的url,进行密码修改就ok了,都不需要进行登录!!!)

③后台验证不严谨不合理(无效),只是直接对前段可控参数进行了验证和引用(例如:并没有同时对用户名和密码进行验证,而是仅仅对用户名进行验证)。这样的话前段直接修改这些可控参数就可以很轻易地进行越权了

④权限配置错误(没有最低权限访问机制,或者说没有权限分离),例如:正常登陆,但是修改访问对象参数(例如:url,管理员操作,其他用户操作等等)就可以进行越权访问;有的都不需要更改,可以直接纵向越权;奇葩一点的就是:会员身份和普通身份配合使用!(很多资料访问接口他只是做到了用户身份验证,但是并设置低权限用户不可访问)

⑤浏览器预加载不严谨

⑥一些0、1,true、false、fail、success和验证相关的参数可修改,返回意想不到的数据...

⑦程序流程错误:例如错误提示,可能会将当前输入证号的敏感信息同时反弹到前段页面

⑧业务流程错误:允许重复注册,但是会出现禁止登陆或者多人共用一个证号的现象....

....总之就是不合理的身份校验或权限校验规则导致!

越权漏洞搜集:

没办法使用工具,只能手工操作

一般越权漏洞容易出现在权限页面(需要登录的页面)或增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。

我们可以通过页面直接修改用户信息进行越权操作试探

也可以抓包修改有关信息进行越权试探

总之:注意可控参数;坚持参数同变同控原则,一个变量变,其他都不变;一个变量不变,其他变量都变;所有参数都变。

越权分类

平行越权

A用户和B用户属于同一级别用户,但各自不能操作对方个人信息,A用户如果越权操作B用户的个人信息的情况称为平行越权操作。

例如:lucy正常登陆后,查看自己用户信息时burpsuit抓包,修改用户名为lili提交数据包后,返回lili的用户数据

lucy和lili为相同权限的用户。

if(isset($_GET['submit']) && $_GET['username']!=null){
    //这里在用户访问数据时没有对用户session进行验证,而是知识验证了用户名是否为空。如此一来,只要有名的用户都能随意访问他人信息了?    $username=escape($link, $_GET['username']);
    $query="select * from member where username='$username'";
    $result=execute($link, $query);
    if(mysqli_num_rows($result)==1){

再记载几个典型案例:

通过注册错误提示获取已存在用户信息,然后注册成功后登陆,进行抓包越权。

通过注册错误提示获取已存在用户信息,然后抓包改包,重复注册...要么拒绝服务,严重的就是越权操作他人账户。

注册时,输入已经存在的用户信息,直接抓包查看相应包(该已经存在的用户的用户信息可能会返回到相应包中)

用户信息出现在了cookie值中,那么可以改变cookie值进行越权(主要原因还是因为服务端没有对cookie中的用户信息和密码进行而次验证,而是直接根据cookie进行操作了)

还有一个奇葩案例:抓包发现没有cookie,然后攻击者添加cookie竟然成功访问攻击者添加cookie对应用户的证号

抓包改变各种id值...

.......

垂直越权

A用户权限高于B用户,B用户越权操作A用户的权限的情况称为垂直越权。

例如:

①管理员用户添加用户,提交后用burpsuit进行抓包。普通用户登陆后提交数据,进行抓包。

然后将管理员添加用户的包里的cookie替换为普通用户的cookie,同时referere头也进行伪造。

再次将改造后的数据包提交,发现用户添加成功!(一般用于测试)

②普通用户登陆,然后抓包将post值,refer头,或者用户名进行更改为管理员的,然后进行管理员权限操作成功。

③在知道后台页面的同时,使用普通用户登陆成功后抓包,然后尝试使用普通用户的cookies登陆后台管理员页面或者后台操作。

④普通用户登录管理员后台后直接就可以进行任意操作,值就是权限配置问题。

主要原因还是因为:

在用户进行某些操作时,服务端对用户session和level级别没有进行严格判断

对用户权限没有进行最小化处理,导致用户可以查看自己权限意外的信息。

最普遍的,莫过于管理员可以查看其他用户的一些敏感信息,实际上管理员也是不应该有权限查看敏感信息的知识与权限管理信息而已。

再来几个例子:

今年hw行动中,绿盟UTS综合威胁探针管理员任意登陆 漏洞,就是通过修改回包中的false值为true,从而获取admin的密码md5值,然后再直接抓包将提交密码修改为md5值就ok了。都不需要进行md5破解

案例:

http://www.wooyun.org/bugs/wooyun-2010-020651

http://www.wooyun.org/bugs/wooyun-2010-021150

http://www.wooyun.org/bugs/wooyun-2010-020723

http://www.wooyun.org/bugs/wooyun-2010-020356

http://www.wooyun.org/bugs/wooyun-2010-019523

逻辑漏洞概述

逻辑漏洞一般指的就是在业务流程中,对客户的各个环节操作权限与动作控制不够严格准确。

导致非法份子可以通过一些意想不到的方式跨业务流程甚至伪造修改他人信息对企业或者其他用户造成意想不到的损失。

常见的逻辑漏洞

交易支付(修改金额为负数或为o,其实就是抓包,看见数字就改)、密码修改(是否有原密码)、密码找回(1、改数据包跳过步骤 2、用自己的用户身份找回密码,在最后修改密码的时候抓包修改成其它用户 3、修改返回包,把0改成1或false改成true 4、手机号密码找回看一下返回包里面是否有手机验证码、5、邮箱密码找回的时候,试试修改邮箱,用别人的帐号找回,发邮件填写自己的邮箱、6、验证码长度短,纯数字可以直接burp暴破 7、同一验证码可以登录不同帐号 8、验证码纯数字,无时间限止 9、密码找回答案比较简单 或参数判断不严格10、爆破时修改手机号位数等等)、越权修改、越权查询、突破限制、任意用户注册、短信炸弹、占用资源(时间,例如:飞机票全部加入购物车,达到时间限制重新加入购物车)等各类逻辑漏洞

如何挖掘逻辑漏洞

确定业务流程--->寻找流程中可以被操控的环节--->分析可被操控环节中可能产生的逻辑问题--->尝试修改参数触发逻辑问题

和所有漏洞挖掘一样,首先肯定是先对业务进行亲身了解啦!

确定业务流程:

先亲身体验一下整个业务流程,注意每个业务细节。例如:证号注册,证号登陆,密码修改,密码找回,填写用户信息,用户信息存储与修改,购物,交易.....

寻找可被操控环节:

然后就是寻找流程中可以被操控的环节啦,例如:所有用户与服务交互的地方→输入用户信息的地方,显示用户相关信息的地方(用户身份与地址,商品数量与价格...),传输用户相关信息的地方(cookie...等等)

猜测环节中可能产生的逻辑问题:

分析可被操控环节中可能产生的逻辑问题:如上边常见漏洞所分析,当然,还有很多意想不到的奇葩漏洞,这就到考研我们网安人员逻辑思维能力的时候了o(* ̄︶ ̄*)o是道高一尺还是魔高一丈呢?

实践检验:

尝试修改参数触发逻辑问题:这个时候就是验证我们的猜想的时刻,实践是检验真理的唯一标准。然而,我们在实际操作之前一定要和服务方认真确定好测试时间,测试权限与程度.....以不影响客户体验,甲方利益,拒绝各方纠纷隐患为原则;沟通和信守承诺很重要

如何绕过:

实践过程中不免会遇到服务端的一些安全防御,作为安全人员首先就是要学会知己知彼,学会像敌人一样进攻才能最终达到优秀的安全防御目的。因此我们这个时候要学会绕过防御

例如:

验证码返回在数据包中

回包对比修改参数,修改判断值,例如:0、1;false、true;fail、success(一般都是目前操作成功,例如验证码通过,信用卡还款成功)

发包修改(修改参数,js判断....身份等等越权操作)

x-forward-for:127.0.0.1

抓包修改,步骤跳过

....

逻辑漏洞案例:

注册证号时可能出现的漏洞:

①不安全提示

例如:

会提示注册用户名或者手机号已存在(如果提示了那我们是不是就知道了该证号为有效证号;如果没提示我们就试探道他提示已存在为止;撞破网站后会得出大量用户信息,那怕拿来发广告都是可怕的何况诈骗等恶性操作)

会提示密码格式,那岂不是为我们暴力破解缩小了字典范围?...

②不安全的密码

在注册帐号的时候,密码没有限制复杂度。那么根据人性,该服务一定存在很多弱口令了。

③未限制注册次数,任意证号注册

那么是不是就会有恶意攻击这可能会无限次进行注册,对服务端造成类似doc的攻击,且制造垃圾数据占用服务端存储资源和证号id资源。

如果是使用短信或者邮箱注册,还可能造成炸弹攻击

④成功注册时,抓包修改已有其他有效用户名可能会返回其他用户所有信息。

虽然奇葩,但是的确有次案例

登陆时可能存在的信息漏洞与不安全措施:

1、注入点及万能密码登陆(这个sql注入有细讲)

2、弱口令

3、没有做密码非空判断

2、不安全的用户提示(一般提示用户名不存或密码及验证码错误)

和注册一样,我们同样可以用这种方式暴力破解大量有效用户名,进而进行密码破解

3、查看登录页面源代码,是否存在敏感信息泄露

例如:服务端真实ip地址,管理员信息,等等(假设开发不严谨加上开发人员可能有注释的习惯,就呵呵哒了...)

利用这些信息可能会直接威胁到服务端的数据库甚至系统安全

4、数据包中是否包含用户信息,例如电话,uid....

那么我们抓包修改为攻击对象的用户信息岂不是可能产生越权漏洞?

破解密码时的漏洞:

7、在暴力破解的时候是否限止ip,锁定用户,限制次数

8、下面会提到过的弱验证码(客户端验证,验证码简单,返回包中存在验证码或token值,验证码有效时间过长.....)

9、弱密码(密码长度不够,密码格式简单、、、)

10、密码前段绕过(前段验证,那么我们使用自己账户登录后抓包修改为他人用户名)

11、修改返回包中的一些参数可能迫使用户密码可以出现在返回包中,或者返回包中本来就存在密码等信息

12、密码可能没有做非空判断,我们直接删除密码参数绕过

13、一些看是修改密码需要先原密码登陆,但是等我们使用扫描器将该应用所有可访问地址提取出,退出证号条件下挨个访问,总会有那么几个不需要授权,然后我们就可以直接进行相应操作了!

例如重置密码的JS,发送短信的JS,都是有可能未授权可访问的。JS扫描的话推荐使用JSFind: https://github.com/Threezh1/JSFinder
同时它也会提取页面中的URL

验证信息可能存在的漏洞:

5、没有token值,没有双因素验证等(有则,基本攻击没戏)

双因素验证,例如短信验证最好加上客户意识信息,增强用户安全意识很重要!

验证码验证,

修改密码时加上原密码验证

6、手机号验证或者邮箱验证时

①尝试修改成自己的手机号或者邮箱接收他人验证码

②或者返回包中是否也有验证码

③服务端发短信api接口没有同一证号时间限制,次数限制...会形成电话或者短信或者邮箱炸弹,消耗掉服务端短信存储

而使用证号却是别人证号!

7、数据包是否含有敏感信息泄露

如cookice中的用户电话信息,用户身份信息,返回包中的验证码,token值,false/true//0/1等确认信息等等(这些值被抓包利用后有跟没有一个样,不是被暴力破解就是被逻辑绕过)

8、不安全的验证码(不更新不销毁....)

验证码长度不够,或者验证码可预测(例如abcd选项验证码,熟人验证码),且纯数字,同时又有效时间长甚至不更新都容易被burp直接爆破。甚至会出现同一个验证码可以登陆不同证号的情况

9、有的一个验证码可以登陆多个用户,甚至出现万能验证码

10、修改用户名等其他参数(例如手机号后边添加空格,可以绕过验证码爆破限制)真实案例:微信

证号登陆后可能存在的漏洞

9、帐号登录之后,应该具备超时功能,session及时更新

(防止csrf等等攻击或者一些暴力破解操作)

10、养成一定的安全意识,不要随意点击其他网页,防止钓鱼攻击

如果需要,先关闭工作系统再打开

11、不要随意下载其他软件

修改密码可能存在的漏洞

12、OA、邮件、默认帐号等相关系统,在不是自己注册的情况下,应该在登录之后要强行更改密码(防止弱口令)

一般统一下发证号都是弱口令(123456、1111111、888888.....)

13、修改密码时,是否需要原密码验证

如果可以不需要,那我们岂不是可以随意抓包修改他人密码?

如果需要,那么我们是否可以逻辑绕过?

14、先自己正确修改密码,输入自己原密码后抓包修改uid对其他用户密码进行修改;

15、直接抓包删除原密码验证参数或者代码;

16、修改返回包0/1确认参数...

17、尝试是否可以不输入原密码,有些程序员可能没有做非空判断....

13、一些看是修改密码需要先原密码登陆,但是等我们使用扫描器将该应用所有可访问地址提取出,退出证号条件下挨个访问,总会有那么几个不需要授权,然后我们就可以直接进行相应操作了!

例如:今年hw行动中天*信出现的漏洞,管理员用户登陆后修改验证码不需要使用原密码验证,且修改密码页面没有进行授权访问设置,导致直接抓包修改密码的漏洞

密码找回可能存在的漏洞

密码找回根本不可能是有原密码,只能把功夫下在验证码上,因此密码找回漏洞大部分也是验证码漏洞喽....等然,还有其他一些漏洞需要注意啦....

1、修改数据包跳过步骤(抓包后将步骤参数进行修改)

2、用自己的用户身份找回密码,在最后修改密码的时候抓包修改成其他用户(越权)

3、修改返回的包,把0改成1或者false改成true(或者使用自己证号进行密码找回,然后对比其他用户密码找回返回数据包,与自己成功找回密码的数据包进行对比修改)

4、密码找回,需要回答的问题答案简单可预测(例如:你的名字,你父母的生日,选择你的好友,选择你的好友购买过的商品)

5、参数判断不严格,例如你抓包修改了其他参数(手机号,用户名等等)就可以成功绕过验证码爆破限制

修改或查询用户信息可能存在漏洞:

修改用户信息时,抓包修改用户名,或者用户电话等证号信息。进行横向甚至纵向越权

交易支付中的逻辑问题:

1、恶意刷单

例如:

将所有机票同时放入购物车,导致其他用户不可购买

竞争对手互相下单,批量差评

报复性批量下单,批量退货

供应商刷单赚取信用

黄牛炸弹,导致其他人无法正常买票(类似短信炸弹,占用服务端资源)

2、交易

跳过支付项进行交易

修改金额为负数或为0,修改商品数量或者价格为负数或为0

信用卡还款,步骤绕过

修改积分(暴涨也可为负值)

案例:

交易逻辑漏洞

本案例使用burpsuit抓包方式进行测试

  • 是否可以用他人用户信息登陆
  • 加入购物车时是否可以修改购买数量为负数,商品价格是否可以修改.
  • 确认购物车信息时是否可以修改商品数量为负数,是否存在折扣限制突破问题,是否可以修改商品总金额.
  • 输入物流信息时是否可以控制运费,如果可以,尝试修改为负数.
  • 确认订单时或者之前是否可以修改用户信息而保留物流信息
  • 确认订单后跳转支付接口时是否可以修改支付金额或者支付账户,可否不支付直接跳转到交易成功环节. 
用户密码登陆

直接抓包,修改返回包中的false为true...类似于密码找回中的第三个漏洞,修改返回包

例如;之前提到的

今年hw行动中,绿盟UTS综合威胁探针管理员任意登陆 漏洞,就是通过修改回包中的false值为true,从而获取admin的密码md5值,然后再直接抓包将提交密码修改为md5值就ok了。都不需要进行md5破解

修改密码

 密码找回漏洞挖掘

借鉴自:

http://drops.wooyun.org/web/5048#more-5048

 

例如:

其他常见越权逻辑漏洞案例:

所有用户信息查询,修改,等页面.

如网上银行的余额信息,普通网站的个人资料查询修改等页面.

只要涉及到要从数据库中查询或提交数据的地方,都有可能存在越权漏洞的产生.

 

案例:

http://www.wooyun.org/bugs/wooyun-2010-020651

http://www.wooyun.org/bugs/wooyun-2010-021150

http://www.wooyun.org/bugs/wooyun-2010-020723

http://www.wooyun.org/bugs/wooyun-2010-020356

http://www.wooyun.org/bugs/wooyun-2010-019523

1、任意修改用户资料

http://www.wooyun.org/bugs/wooyun-2010-070940

http://www.wooyun.org/bugs/wooyun-2010-059453

http://www.wooyun.org/bugs/wooyun-2010-033279

 

2、任意查询用户信息

http://www.wooyun.org/bugs/wooyun-2010-061274

http://www.wooyun.org/bugs/wooyun-2010-039797

 

3、任意重置用户密码

http://www.wooyun.org/bugs/wooyun-2010-068091

http://www.wooyun.org/bugs/wooyun-2010-021686

 

4、恶意注册

http://www.wooyun.org/bugs/wooyun-2010-08966

http://www.wooyun.org/bugs/wooyun-2010-069402

http://www.wooyun.org/bugs/wooyun-2010-051923

 

5、恶意短信

http://www.wooyun.org/bugs/wooyun-2010-077349

 

其它逻辑漏洞:

http://www.wooyun.org/bugs/wooyun-2010-020783

http://www.wooyun.org/bugs/wooyun-2010-020763

http://www.wooyun.org/bugs/wooyun-2010-020253

http://www.wooyun.org/bugs/wooyun-2010-020042

http://www.wooyun.org/bugs/wooyun-2010-019761

http://www.wooyun.org/bugs/wooyun-2010-019332

http://www.wooyun.org/bugs/wooyun-2010-019012

http://www.wooyun.org/bugs/wooyun-2010-017457

http://www.wooyun.org/bugs/wooyun-2010-016193

http://www.wooyun.org/bugs/wooyun-2010-015569

http://www.wooyun.org/bugs/wooyun-2010-08031

http://www.wooyun.org/bugs/wooyun-2010-01050

 小结:

如何绕过:

实践过程中不免会遇到服务端的一些安全防御,作为安全人员首先就是要学会知己知彼,学会像敌人一样进攻才能最终达到优秀的安全防御目的。因此我们这个时候要学会绕过防御

例如:

验证码返回在数据包中

回包对比修改参数,修改判断值,例如:0、1;false、true;fail、success

发包修改(修改参数,js判断....身份等等越权操作)

x-forward-for:127.0.0.1

抓包修改,步骤跳过

逻辑攻击方式:

业务流程跳过(修改流程参数)

横向越权,纵向越权(修改用户信息)

修改数据(数量,金额...0或负数)

修改判断参数(0/1)

删除判断参数或者代码(验证码或者密码判断代码)或者空验证码空密码验证

修改其他参数格式(服务端参数验证不够严格,例如修改电话号码位数绕过验证码限制)

暴力破解

暴力攻击占用资源

使用头x-forwarded-for 127.0.0.1或者1,本地访问绕过

万能密码登陆(sql注入)

防御方式:

每个环节每个参数严格过滤(非空判断,非负数判断,白名单过滤,session判断,level判断,业务环节记录判断,同一用户信息判断(例如防止他人电话接受验证码))

错误提示时,敏感信息尽量不显示在客户端

验证码等验证参数能不出现在响应包就不出现在相应包

判断参数0/1能不出现在相应包就不出现在相应包,出现在响应包要做到更改无效

出现在客户端包括cookie甚至服务端数据库中,邮箱里的用户信息都要进行脱敏处理,例如:用户名不完全显示,电话号码,身份证信息部分使用*代替,返回包中必须出现验证码类时使用特殊加密等方式进行伪装.....

异地登陆提醒,甚至短信提醒

x-forwarded-for 1服务端本地登陆判断和过滤

api接口限制同一证号短信验证码次数防止短信炸弹

证号错误登陆次数限制,IP锁定,防止暴力破解

业务上限制单个证户购买数量和证号真实性,防止恶意占用商品资源或者炸弹攻击

 

posted @ 2020-11-10 17:15  子墨·咖啡  阅读(86)  评论(0)    收藏  举报