条件竞争在漏洞挖掘中的妙用
Race Condition
0x00 前言
本篇文章主要针对应用层面出现的一些条件竞争的案例及原理讲解,希望能够为大佬们在以后的挖洞过程中增添一条思路。
0x01 什么是条件竞争?
基本概念:条件竞争发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。
下面来看一小段Python代码:
import time, threading
# 假定这是你的银行存款:
balance = 0
def change_it(n):
# 先存后取,结果应该为0:
global balance
balance = balance + n
balance = balance - n
def run_thread(n):
for i in range(1000000):
change_it(n)
t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)
看一下上面这个代码,猜一下程序运行之后你的余额还剩多少?运行逻辑是否如下图一样呢?
如果是,恭喜你!
你猜错了~
实际的代码顺序和结果可能是下面这样的:
上面这个代码运行的逻辑和结果告诉我们当两个线程同时一存一取,就可能导致余额不对,也就是我们所说的他们之间存在一个条件竞争。
那么对于上面的这个条件竞争我们如何避免呢(条件竞争常见修复方案)?
你肯定不希望你的银行存款莫名其妙地变成了负数,所以,我们必须确保一个线程在修改balance的时候,别的线程一定不能改。上面的例子如果我们要确保balance计算正确,就要给change_it()上一把锁,当某个线程开始执行change_it()时,我们说,该线程因为获得了锁,因此其他线程不能同时执行change_it(),只能等待,直到锁被释放后,获得该锁以后才能改。由于锁只有一个,无论多少线程,同一时刻最多只有一个线程持有该锁,所以,不会造成修改的冲突。通过threading.Lock()来实现创建一个锁如下:
0x02 利用条件竞争能做什么?
上面通过一小段python代码讲解了条件竞争及它的常见修复方式,那么hacker们利用条件竞争都能做些什么呢?
如上图所示:领取优惠券、并发抽奖等各类支付漏洞,此外还可用于文件上传突破、系统提权等,当然,肯定不仅限于此~
0x03 条件竞争利用案例
案例一:某生活APP利用条件竞争刷红包
某生活App推出了新人领红包活动,新号可以免费领一次红包,利用Fiddler抓包,然后重放并拦截数据包几百次以后全部一起释放,就可以领很多很多红包。
案例二:乌云某处刷人民币漏洞成功套现
1.第一张图片是乌云奖金提款时的截图,账户只有1922元,但是多线程成功发起两次1900元提取操作:
2.第二张图是第二天收到的支付宝的乌云付款,乌云的小妹妹分两次共支付3800元,说明人工审核没有起作用:
案例三:利用条件竞争绕过上传限制写webshell
Upload-labs-master第17关的源代码如下:
准备一个下面这样的小马,意思是当程序执行(被访问)时,会在本地写入一个test.php文件,文件内容为<?phpphpinfo();?>:
上传小马并拦截数据包如图:
已知上传后的访问地址为/upload-labs-master/upload/shell.php,拦截数访问shell.php的据包如下:
此时同时将之前拦截的2个数据包发送至intruder模块进行无限循环请求
当访问shell.php的请求返回200,且不报错,则说明访问成功,此时会在upload目录生成test.php,访问test.php发现可以解析,此处通过条件竞争成功上传:
0x04 总结
上面我们通过一段python代码的例子以及三个实际发生的案例对条件竞争做了一些简单的讲解,最后我们再做一次升华性的总结(再不皮一下就没机会了@_@):
只要你的手速够快(这里当然不是真的手速),程序就跑不过你,然后你就能嘿嘿嘿~
—END—
重要提醒!
团队现开了微信交流群(每日资源分享),团队语雀知识库(每日积累)及知识星球(小范围精华内容传播及问答),欢迎加入(微信群通过公众号按钮“加入我们”获取联系方式):
往期经典推荐:
最新版AWVS&Nessus破解及批量脚本分享
>>关于我们:
WhITECat安全团队是起源实验室合作安全团队,主要致力于交流分享团队成员技术研究成果、即时发布最新的漏洞新闻资讯、各大厂商内推通道以及各种安全相关延伸。团队成员目前由起源实验室核心成员、一线安全厂商攻防实验室、某研究院、漏洞盒子TOP10白帽子等人员组成。团队内有不定期的技术交流,(不可描述)工具分享等活动,致力于实现“开放分享”的hack精神。
欢迎各位大佬关注^_^
关注我们
开放共享
扫描上方二维码添加关注
一起分享安全狮的日常
本文始发于微信公众号(WhITECat安全团队):漏洞挖掘|条件竞争在漏洞挖掘中的妙用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论