条件竞争漏洞

一、条件竞争简介

竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。

开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,但他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。

线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。

条件竞争漏洞其实也就是当同时并发多个线程去做同一件事,导致处理逻辑的代码出错,出现意想不到的结果。

条件竞争漏洞一般出现在与数据库系统频繁交互的位置,例如金额同步、支付等较敏感操作处。另外条件竞争漏洞也会出现在其他位置,例如文件的操作处理等。

二、漏洞原理

对于条件竞争漏洞比较经典的案例是转账、购买,也是条件竞争漏洞的高发场景。这里从数据库层面还原一个星巴克无限购买案例。直观解释下这个漏洞的原理,假设我们使用账户里的1000元购买10件100元的商品,正常购买流程为:

购买物品——>查询余额是否大于商品价格——>购买成功,余额-1000,商品数+1/购买失败,提示余额不足:

1) 查看数据库账户余额及物品数:

在这里插入图片描述

2) 点击购买,拦截数据包,设置intruder发送50个数据包,线程调到25后发进行并发请求:

在这里插入图片描述

3) 查看数据库的日志,可以看到对count的查看SELECT和更新UPDATE并不是线性依次执行的,所以导致在完成对count-1000的操作之前进行了另一次查询count仍为1000,最终结果是购买数量大于10,而余额为负数:

在这里插入图片描述

4) 解决方案通常是加“锁”,mysql执行事务前加BEGIN,后加COMMIT,从而锁定一次事务处理,使按序进行:

在这里插入图片描述

三、挖掘技巧

1)方法:

使用burpsuite的Inturder模块,将线程调到25进行多线程异步发包,也可以使用curl同时发包。通过查看多个异步请求返回的不同结果,比如11个测试中有10个相同,那一个包可能就是攻击成功的请求。

2)漏洞场景:

挖掘需要关注的功能点有:

  1. 购买:付款/购买/积分/订单操纵相关的漏洞
  2. 兑换:积分/优惠券/注册邀请码(案例1)
  3. 绕过次数限制(案例2)
  4. 多过程处理,如文件上传处理(案例4)
  5. 此外还可能存在DOS攻击(案例3)

特点总结来说就是——共享同一资源,生成其他结果。

3)注意:

这个漏洞具有偶现性,很受环境因素的影响,比如网络延迟、服务器的处理能力等,所以只执行一次可能并不会成功,尽量多尝试几次。

四、漏洞防御

1)对于业务端条件竞争的防范,一般的方法是设置锁;

2)对于文件上传,一定要经过充分完整的检查之后再上传;

1)对于业务端条件竞争的防范,一般的方法是设置锁;

2)对于文件上传,一定要经过充分完整的检查之后再上传;

3)在操作系统的角度,共享数据要进行上锁保护。

posted @ 2022-07-06 18:24  爱吃_白菜  阅读(77)  评论(0编辑  收藏  举报