先讲一个经典案例,
例子:银行提现
假设现有一个用户在系统中共有2000元可以提现,他想全部提现。于是该用户同时发起两次提现请求,第一次提交请求提现2000元,系统已经创建了提现订单但还未来得及修改该用户剩余金额,此时第二次提现请求同样是提现2000元,于是程序在还未修改完上一次请求后的余额前就进行了余额判断,显然如果这里余额判断速度快于上一次余额修改速度,将会产生成功提现的两次订单,而数据库中余额也将变为-2000。而这产生的后果将会是平台多向该用户付出2000元。
本质上讲,条件竞争漏洞产生的原因就是程序逻辑不合理。
对于这种漏洞,代码常见的特征有:
1、将文件上传到服务器,然后检测文件后缀名,如果不符合条件,就删掉。
在这段代码中,程序会先执行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。