文件上传-upload-labs(部分)

tmx8911
16
2025-05-14

Pass-01-js 检查:

一、分析题目:
第一步上传一个正常的图片:

上传成功:

二、测试上传一个PHP文件:

提示文件不允许上传,只允许上传.jpg/.png/.gif类型的文件
说明是白名单,使用的是前端js检查:

方法一:修改js源码

点击F12检查:
发现如下检查代码:

编辑删除return checkFIle(),再尝试上传:

上传成功!

方法二:修改后缀名:

使用Burp:



上传成功!

Pass-02-验证 Content-type:

分析题目:

isset()函数用于检测变量是否已设置并且非 NULL。

file_exists()函数检查文件或目录是否存在。

​move_uploaded_file()函数把上传的文件移动到新位置。

发现是是后端服务器的MIME检查:

方法:使用burp修改MIME类型:



上传成功

Pass-03-黑名单绕过:

分析题目:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $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.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
            if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
in_array() 函数搜索数组中是否存在指定的值。

​ trim() 函数移除字符串两侧的空白字符或其他预定义字符。

​ str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。

​ strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。


但是这里的黑名单规则不严谨,在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml

方法:修改文件后缀名:

将webshell.php文件的后缀修改为.php3 .php5 .php7等


上传成功!

Pass-04-.htaccess 绕过:

分析题目;
尝试上传.php

查看源码:

$is_upload = false;
$msg = null;
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.'/'.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 . '文件夹不存在,请手工创建!';
    }
}

查看源码,黑名单中的过滤的内容更多了

方法:使用 .htaccess 后缀名的文件:

.htaccess 是一个用于 Apache Web 服务器的配置文件,它是一种特殊的文本文件,使用 “.htaccess” 作为文件名的后缀。该文件通常用于在特定目录下改变 Apache 服务器的行为以及对网站进行配置。

.htaccess 文件的作用是允许网站管理员在特定目录中覆盖默认的服务器设置,以灵活地控制网站的行为和功能。它可以包含一系列指令,用于自定义访问权限、重定向URL、启用或禁用模块、修改请求处理规则等。

常见的用途和功能:

URL 重写:通过 RewriteRule 指令可以修改 URL 地址的结构,使得对外暴露的 URL 更加友好和易读,同时也方便实现重定向和 URL 路由功能。
访问控制:通过使用指令如 Require 和 Allow/Deny,可以限制特定用户或 IP 地址的访问权限,保护敏感目录或文件。
自定义错误页面:通过 ErrorDocument 指令,可以针对不同的 HTTP 错误代码自定义相应的错误页面。
缓存控制:通过使用指令如 ExpiresByType,可以设置不同类型文件的缓存过期时间,以提升网站性能和加快页面加载速度。
MIME 类型配置:通过 AddType 或 AddHandler 指令,可以自定义文件扩展名与 MIME 类型之间的映射关系。
重写规则:使用 RewriteRule 和 RewriteCond 指令,可以实现灵活的 URL 重写和重定向规则,对请求进行修改或转发。

上传文件内容:

<FilesMatch "jpg">   
        SetHandler application/x-httpd-php
</FilesMatch>

说明:如果文件里面有一个后缀为.jpg的文件,就会被解析成.php

将webshell.jpg 和 .htaccess 文件上传

Pass-05-后缀名Fuzz:

分析题目:

$is_upload = false;
$msg = null;
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 . '文件夹不存在,请手工创建!';
    }
}

发现没有转成大小写,可以使用windows的不区分大小写的漏洞:

方法:后缀名大小写混合绕过:

将文件后缀名改成大小写混合可绕过:
webshell.php 改为webshell.Php
使用burp更改:


上传成功

Pass-06-大小写绕过:

分析题目:
查看源代码:

$is_upload = false;
$msg = null;
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 = $_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
        
        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 . '文件夹不存在,请手工创建!';
    }
}


观察发现源码中缺少了trim函数(去除字符串首尾处的空白字符),说明这里可以尝试空格绕过

方法:文件名末尾空格绕过

使用Burp:
****

成功!

动物装饰