浅谈条件竞争漏洞及利用

浅谈条件竞争漏洞及利用


0x01 前言

最近看到了两三个关于条件竞争的例子,正好hgame上有一个类似的题目,这里就直接把这个知识点弄得明白点,因此就有了浅谈条件竞争漏洞。。

0x02 正言

条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。

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

开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果,简而言之就是并没有考虑线程同步。

应用:

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

二、先上传文件、判断是否合法再删除
首先先将文件上传,在判断该文件是否合法,如果不合法再进行删除,这个逻辑看上去也没有很不合理,但是问题就在于,如果我们采用大量的并发请求,就传递一个生成恶意webshell的PHP,访问它就可以生成webshell。在上传完成和安全检查完成并删除它的间隙,攻击者通过不断地发起访问请求的方法访问了该文件,该文件就会被执行,并且在服务器上生成一个恶意shell的文件。至此,该文件的任务就已全部完成,至于后面发现它是一个不安全的文件并把它删除的问题都已经不重要了,因为攻击者已经成功的在服务器中植入了一个shell文件,后续的一切就都不是问题了。

实例分析(这里的两个应用我们各举实例进行分析):
https://hgame.vidar.club的二发入魂
在这里插入图片描述
随便进去之后发现你只有500000万元,而且卖东西只会亏钱,要求你赚到1亿买flag,这时就想到利用条件竞争,我们同时抓买包和卖包,然后bp进行爆破,这里卖包线程应大于买包线程,以便于在还没来得及进行余额判断时便又买了一次,相当于同样的钱买了几次,这样一直爆破便能得到很多钱了。在这里插入图片描述
最终得到足够数目的钱买flag。
在这里插入图片描述
二、
下面一段简单的上传代码

<?php
header("Content-Type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];
$ext = substr($filename,strrpos($filename,'.') + 1); //后缀

$path = 'uploads/' . $filename;
$tmp = $_FILES['file']['tmp_name'];
if(move_uploaded_file($tmp, $path)){
	if(!preg_match('/php/i', $ext)){ //判断后缀是否为php
		echo 'upload success,file in '.$path;
	}else{
		unlink($path); //已经上传后判断若是PHP则删除
		die("can't upload php file!");
	}
	}else{
		die('upload error');
}

这里我的目的是想上传一个简单的shell:
在这里插入图片描述
像上图中的代码,如果我们上传一个php文件,在执行完move_uploaded_file之后,执行unlink之前,此时这个php文件是已经保存到了web服务器上的,并且我们能够访问。所以只要我们在删除该文件之前,访问上传的文件,就可以获得一次执行php代码的机会。如果上传的php的功能是写一句话到一个php文件,这样我们在删除之前访问该文件,就会生成一个一句话木马,就可以得到webshell。很明显这里就存在竞争,我们用多个线程上传文件,同时用多个线程访问上传后的文件,这样就存在竞争,就有可能在删除之前执行我们上传的文件。
在这里插入图片描述
我们将抓上传包并放到爆破模块,并且抓shell.php的包,开始显然是没有这个路径的。
在这里插入图片描述
可以看到成功得到了我们的myshell.php,就是利用的线程不同步从而执行了一次shell.php的机会生成了myshell.php


参考链接:
https://www.jianshu.com/p/09d0eb938e6a
https://blog.csdn.net/iamsongyu/article/details/83346260

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值