CTF中的条件竞争漏洞

条件竞争是沃特?

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

开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。
线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。

形象实例

#抽象成四个字,措手不及!!!

利用多线程并发去执行同一个操作进程,服务器无法或者没有处理程序,导致处理高并发的线程未能同步好所有请求,导致请求与请求之间产生等待时出现逻辑缺陷。出现意想不到的结果,措手不及应接不暇人山人…咳咳,反应不过来就出错。

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

给两个例子好好消化消化。

例1:金额提现

假设现有一个用户在系统中共有2000元可以提现,他想全部提现。于是该用户同时发起两次提现请求,第一次提交请求提现2000元,系统已经创建了提现订单但还未来得及修改该用户剩余金额,此时第二次提现请求同样是提现2000元,于是程序在还未修改完上一次请求后的余额前就进行了余额判断,显然如果这里余额判断速度快于上一次余额修改速度,将会产生成功提现的两次订单,而数据库中余额也将变为-2000。而这产生的后果将会是平台多向该用户付出2000元。

例2:先存储文件,再判断是否合法,然后再删除。

首先将文件上传到服务器,然后检测文件后缀名,如果不符合条件,就删掉,典型的“引狼入室”
攻击:首先上传一个php文件
当然这个文件会被立马删掉,所以我们使用多线程并发的访问上传的文件,总会有一次在上传文件到删除文件这个时间段内访问到上传的php文件,一旦我们成功访问到了上传的文件,那么它就会向服务器写一个shell。

乌云实例:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-049794.html

乌云人民币套现:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-099622.html

CTF实例

https://blog.csdn.net/iamsongyu/article/details/83346029 //Itshop
辣条之王 知识点1.条件竞争 2.数据溢出
数据溢出重点一句话:我们输入的是份数,后台肯定要查询数据库中我们的大辣条数目书否符合条件,即是否大于份数*5,才会给我们相应的辣条之王。我们的目的是数据库判断可以过,但是后台也得给我们足够的辣条之王,思路是使用整数溢出欺骗数据库,(重中)使得我们请求的数字在服务器看来就是1分辣条之王,而实际上是很多。(之重!)

ctf题目:http://119.23.73.3:5006/web2/index2.php (练习)

首先进入CTF地址,观察发现,网址为inde2.php,
正常来说应是index.php,访问index.php发现自动跳转 inde2.php
抓包截包,

进入 uploadsomething.php,发现应该是个上传页面,第一个框为上传文件名,第二个为文件内容,
上传1.php ,返回路径 查看

凭我专业八级的英语水平,这意思应该是太慢了,于是聪明的你想到的条件竞争漏洞,迅速上传迅速访问。
OK,使用burp intruder 模块 爆破上传,然后访问。

于是,开始,

分别抓取两个包发送intruder
第一个包网址:http://119.23.73.3:5006/web2/uploadsomething.php?filename=1.php&content=
第二个包网址:http://119.23.73.3:5006/web2/uploads/c2a54d18d324f0c9b33b29243f77d3a45b5f9463/1.php

调整没有字典的爆破,不断发包,

然后设置发送三千个数据包,然后设置线程调至50

第一个包为以50线程迅速上传三千次,
第二个包为以50线程迅速访问三千次,只要速度够快就可以访问到。
然后开始爆破成功得到flag,我们可以看到也不是百分百可以得到flag,存在竞争,

防御

对于数据库的操作,正牌的方法是设置锁

对于文件上传,一定要经过充分完整的检查之后再上传而不是先上传在辨别。


参考:https://blog.csdn.net/ivalue/article/details/81412494
参考:https://www.0dayhack.com/post-666.html