0x00 引言


所有应用程序都是通过逻辑实现各种丰富多彩的功能的,要实现这些功能,必须掌握大量的技巧并进行周密的安排。但是,有很多情况这些功能逻辑存在缺陷,比如程序员的安全意识,比如考虑问题不周全等。即使是最简单的web应用程序,每个阶段都会执行大量的逻辑操作,这些逻辑操作代表着一个复杂的攻击面,它从没有消失,只是容易被遗忘。

逻辑缺陷的本质就是设计者或开发者在思考问题过程中做出的特殊假设存在明显的或隐晦的错误,简单来说,就是程序员可能这么认为:如果发生A,就一定会出现B,因此执行C。但是他们却忘记了另外一个问题:如果发生X会怎么样?

下面就是来谈谈一些常见的逻辑错误。

0x01 欺骗密码找回功能


密码找回功能本意是设计给那些忘记密码的用户,以便他们能够找回自己的密码。

一般的假设都是这样的:首先账号绑定了一个手机或邮箱(以手机为例),然后找回密码,输入自己的账号,然后手机号码(有些甚至这一步都不需要),然后发送验证码(一般是4位或6位纯数字,验证码有限期很长),然后用户填写验证码,验证成功之后,就可以修改账号的密码了。

那么问题逻辑缺陷很明显了,你怎么能只是根据一个验证码就确定是用户本人在修改密码呢?如果是攻击者,完全可以暴力破解验证码,这样,任意用户的密码都是可以重置的。

乌云类似漏洞

WooYun: 华为网盘部分用户密码修改

之前的总结文章:密码找回功能可能存在的问题

0x02 规避交易限制


在一些网上交易网站上,开发者一般的设计是这样的:用户购买商品,然后根据价格,得到一个总价,然后根据总价来扣钱。

那么这样的一个逻辑处理不当其实会出现很多问题,首先是,如果用户购买的商品是负数,那么计算的总计就是负数了,这样的话,系统的处理就会反给钱给用户,乌云也爆出过这样的漏洞:

WooYun: destoon无限制增加帐号资金

同样的道理,如果价格没有控制好(比如越界),为负数的话,也会出现这样的问题。有时候还不符合逻辑,因为,你的账上金额显示为负数。

乌云类似漏洞:

WooYun: UCloud 另一处严重支付逻辑错误 导致可刷余额

之前的总结文章:在线支付逻辑漏洞总结

0x03 越权缺陷


这个就以发帖来说明,一般的假设都是这样的,A发了一篇帖子,这篇帖子的地址是http://xxxx.com/fatie/A, 然后,B用户发帖,发帖的地址是http://xxxx.com/fatie/B。

那么这样的设计缺陷有可能出现B修改A发布的帖子的问题。攻击者B可以发帖,然后截住数据包,将发帖的地址改成A的地址,这样服务器如果没有其他的检查措施,那么A用户的帖子就会被B用户修改。同样的道理,如果B发布一个有害的帖子,那么在发布的时候,只需要将发布的地址修改成A的,那么就可以嫁祸给A了。

同理,A想要查看自己的信息,比如是这么一个形式:http://xxxx.com/look/A/1234。 这是A的自己的敏感信息位置,那么可能存在的缺陷就是A通过将地址修改成http://xxxx.com/look/B/1234去查看B的敏感信息。

乌云类似漏洞:

WooYun: 益云公益广告越权修改漏洞

之前的总结文章:我的越权之道

0x04 cookies和session的问题


一些网站对于用户是否成功登录不是看用户名与密码是否与数据库里面的匹配,而是看cookies是否为空或session是否为true。这样的问题的假设就是开发者认为用户能够登录,那么cookies就不会为空或session就不会为false。但是逻辑缺陷很明显,那么只要能知道用户ID,然后构造一个cookies或让session值为true就可以绕过这样的认证了。

乌云类似漏洞:

WooYun: 益云广告平台任意帐号登录

0x05 顺序执行缺陷(强制浏览)


有些网站,可能会有这样的功能:

首先,进行A过程,
其次,进行B过程,
再次,进行C过程,
最后,进行D过程。 

开发者的意图是,用户必须进行了A才能进行B,进行了B才能进行C,进行了C才能进行D,也认为用户会按照预定的顺序执行每一个步骤,这是因为在浏览器中导航是这么处理的。

开发者的假设存在缺陷。用户控制着他们给应用程序发送的每一个请求,因此能够按照任何顺序进行访问。于是,可能,用户就从B直接进入了D过程,就绕过了C。如果C是支付过程,那么用户就绕过了支付过程而买到了一件商品。如果C是验证过程,就会绕过验证直接进入网站程序了。

乌云类似漏洞:

WooYun: 中国教师资格网绕过验证(可遍历全国教师身份信息)

WooYun: 万达某分站逻辑错误可绕过支付直接获得取票密码

0x06 时间刷新缺陷


这个缺陷我想主要是针对的12306吧。

网站的假设是每隔5s,票会刷新一次。

但是这个时间确实在本地设置的间隔。于是,在控制台就可以将这个时间的关联变量重新设置成1s或者更小,这样刷新的时间就会大幅度缩短。

乌云类似漏洞:

WooYun: 12306自动刷票时间可更改漏洞

0x07 避免逻辑缺陷一些建议


逻辑缺陷给应用程序带来的危害是巨大的。我进行了一个简单的统计,对于BAT3个公司,逻辑缺陷(这里我将逻辑缺陷、权限绕过的比例加在了一起)的比例分别是:百度15%,在所有漏洞中占的比例排第二,阿里巴巴32%,在所有漏洞中排名第一,腾讯27%,与XSS漏洞并列第一。从这3个公司可以看出,逻辑缺陷或逻辑错误的危害是相当大的。

那么在实践中该如何降低逻辑缺陷造成的风险呢?

1、应用程序的设计信息要清楚,详细的记录在文档中,以便他人了解(主要是安全检查人员) 
2、始终记住用户可以控制请求的每一个方面,他们可以按照任意顺序访问多阶段功能,可以提交畸形数据,可以忽略某些参数,可以伪造某些参数,可以修改某些参数。因此在设计的时候一定尽可能要面面俱到。 
3、在安全代码审计的过程中,从各个角度考虑两个因素:应用程序如何处理用户的反常操作和输入的,不同代码组件与应用程序功能之间的相互依赖操作可能造成不利影响。 
4、在安全代码审计过程中,考虑设计过程中做的每一个假设,并想象假设被违背的每种情况,尤其注意用户可以完全控制的假设条件。

0x08 结束语


逻辑缺陷是一个非常常见的问题,因为对于一个设计者,不可能面面俱到,总会有疏漏。那么对于渗透测试员来说就必须从不同的角度考虑问题了。尤其是从异常考虑问题,从而发现应用程序是否是正确处理了异常。

除了基本的测试,在探查逻辑缺陷面临的最大的挑战就是,如何深入了解开发者的思维。需要了解他们想要打到什么目的,可能会做什么假设,可能采取哪些捷径,可能犯下什么错误。想想一个项目最后期限到了,开发人员为了完成任务,就会不顾安全。然后就会很容易犯下错误。我们想的就是如何利用这些错误了。