条件竞争漏洞

先讲一个经典案例,

例子:银行提现

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

本质上讲,条件竞争漏洞产生的原因就是程序逻辑不合理。

对于这种漏洞,代码常见的特征有:

1、将文件上传到服务器,然后检测文件后缀名,如果不符合条件,就删掉。


代码来源合天网安实验室:http://www.hetianlab.com

在这段代码中,程序会先执行move_upload_file,即服务器在验证你上传的文件是否合法之前,就先把你传的东西给保存并转储(而且可以访问)了。从线程的角度来看,存储文件的线程已经建立了。

此时倘若再建立一条新的线程,例如此刻我们去访问这个被上传的文件,那么这个文件就会被两个线程同时访问,他们分别是线程1:文件上传完毕后,要拉他去进行类型验证。线程2:请求访问这个文件。两个线程的访问同一个资源,就会带来竞争。于是服务器就会产生一些奇怪的反应。例如导致不符合要求的文件依然可以被上传并访问。

解题方案:

总体思路:上传一个文件,同时不停地去访问这个文件

Step1:上传一个东西上去,这个过程要抓包,并送到intruder里


要抓的包类似这样

然后设置好battering ram(或者sinper,效果一样) , payload null , generate 50(或者更多)。一号线程部署完毕。

Step2:不停的去访问这个文件

这里有两种实现方法

①:先访问一下这个文件,这个过程抓包送intruder,同样上battering ram(或者sinper) , payload null , generate 50(或者更多)

然后把step1的intruder和这个一起开动,结果按length排序即可。

②:用脚本一直访问这个文件。这种方法主要是可以同时用 if'flag' in r.text:查询是否弹了flag,方便做题。因为有的题只要你成功上传了东西,就会给你弹flag哈哈哈哈。

至此,我们就完成了利用条件竞争漏洞非法上传文件的目的,可能还顺便捡了个flag。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。