前言
并发漏洞各位师傅可能或多或少都接触过,大到并发支付,小到并发点赞、短信等。测试起来很非常简单,找到对应接口,直接tubor intruder一把梭!但是这种漏洞怎么产生的?开发是怎么写的代码?你真的了解它背后的原理吗?今天就来看看并发逻辑漏洞的原理,测试方式以及如何规避它。
并发漏洞经常出现的场景
签到
抽奖
优惠券领取
购买限制商品
余额更新
并发漏洞产生的原因
在看并发漏洞以前,先来了解一下两种执行模式:
串行操作
每个请求都是依次处理,上一次请求处理结束后,才会处理下一个请求。
并发操作
多个任务交替或同时执行。
并发漏洞就是在并发操作下产生的。
并发漏洞的核心原因是多线程或进程对共享资源的无序访问,导致程序结果和预期不符。
常见的有三种情况:
竞态条件:比如两个线程同时扣减余额,可能只扣了一次的钱。
死锁:线程互相卡住对方的资源,谁都动不了。
内存可见性:一个线程改了数据,另一个线程却看不到最新值。
根本原因是开发者没处理好同步,比如漏了加锁或者顺序不对。高并发的支付、库存系统特别容易出这类问题。
并发领取优惠券案例
领取优惠的功能在很多站点都存在,而且很多师傅也可能也都尝试过去并发领取优惠券,原本一个用户只允许领取一张,但是并发成功的话,可以绕过这个限制,领到几十甚至几百张。
领取优惠券一般设计到了三张表,分别是用户表,优惠券表,以及用户领取优惠价的关系表。
下面就以这个案例详细介绍一下并发漏洞的产生过程。
在实际过程中,我们以为的领取优惠券的过程如下:
所有的操作串行操作,用户点击领取优惠券后,先查询是否领取,如果没有领取,领取后写入数据库
但是为了提高效率,目前大部分都是采用了多线程去执行,那么当一个短时间内多次点击就有可能出现下面的情况
可以看到请求A的结果还没有写入数据库中,请求B的查询操作已经完成,就导致了用户可以重复领取优惠券的情况。
并发操作测试
测试是否存在并发漏洞其实很简单,就是在并发的条件下发送原始数据包观察是否有多次成功的记录即可。
测试并发漏洞时,可以使用burp插件Turbo Intruder,进行高效的并发HTTP请求。也是我们目前常见的能够测试并发漏洞的插件。下面就来看下如何使用这个插件。
安装
直接burp extensions中安装
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)