文件上传漏洞

对文件上传类型进行区分,是属于编辑器文件上传,还是属于第三方应用,还是会员中心。要确保文件上传是什么类型,就用什么类型方法对它进行后期的测试。

常规类:扫描获取上传,会员中心上传,后台系统上传,各种途径上传

CMS类:已知CMS源码,搜索已知cms漏洞

编辑器类:ckeditor,fckeditor,kindeditor,xxxeditor,也是搜索相关编辑器漏洞

配合解析漏洞下的文件类型后门:可以通过解析漏洞,上传包含后门代码的图片

上传方法

方法一

先直接传一个PHP,实战先传马。
实战先传一个正常的图片,看看有无返回存储地址。
如果能直接上传并解析,已离成功不远。

方法二
先传一个shell,然后进行修改。
connect-Type:image/jpeg,看看是否可以进行绕过,如果不行,在上传内容添加GIF89a
当然上传了还得看是否能够被解析为php,所有的上传都要考虑是否能够被解析。

方法三
上传一个abc.abcd,目的只是为了查看是否为白名单还是黑名单绕过。
黑名单限制一般为此文件类型不允许上传,考虑双写,大小写,空格,php2,php3,php4,php5,pht
phtml,等方式
我们继续上传一个/htaccess文件
.htaccess文件能够设置服务器的解析文件的格式,匹配到dudu就已php的格式来解析,继而上传马
如果说.htaccess不能上传,接下来上传一个.user.ini,继而上传一个马

方法四
如果白名单限制上传
考虑00截断上传
文件包含漏洞+图片马
文件包含漏洞+二次渲染+图片马

方法五
上传的东西是否被服务器很快的删除或者移除,或者说上传成功,但是无法访问,就得考虑条件竞争。
以上均不行,考虑逻辑层面的思路。

涉及资源

https://github.com/c0ny1/upload-labs

后端黑白名单绕过

文件上传常见验证

后缀名(直接),类型(间接),文件头等

后缀名

黑名单,白名单

黑名单:

明确不允许上传的格式后缀

asp php jsp aspx cgi war 等

如果php phtml..没有定义到后名单里,可以用这格式绕过限制,依旧可以达到效果

白名单

明确可以上传的格式后缀

jpg png zip rar gif 等

要白名单验证要更安全

文件类型:MIME 信息

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,

当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式

Content-Type称之为MIME信息

靶场练习

upload-lab-01

由于采用了前端验证,所以可以通过抓包直接修改文件格式,从而绕过。

upload-lab-02

拦截上传shell.php的请求包,修改文件类型为:image/jpeg或者image/png或者image/gif


upload-lab-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)) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH. '/' . $_FILES['upload_file']['name'])) {
                 $img_path = UPLOAD_PATH .'/'. $_FILES['upload_file']['name'];
                 $is_upload = true;
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

php,phps,php3,php5,pht等都有可能被解析成php文件的,当然这得取决apache的配置。先试试看,通过Burpsuite改包上传成功。

upload-lab-04

利用 .htaccess 文件进行绕过

其内容为 AddType application/x-httpd-php .jpg

可以将jpg格式的文件作为php文件进行解析

先上传 .htaccess 文件再上传 hacker.jpg 文件

upload-lab-05

大小写绕过,window上搭载的服务器是不区分大小写的,而Linux上的服务器是区分的,所以win上搭载的服务器可以通过大小写绕过防护。

upload-lab-06

还是黑名单限制,通过查看源代码,知道删除了文件名后面的., 但是并没有删除空格,所以通过上传一个后缀名再添加一个空格的文件去绕过黑名单,windoes在创建文件时会自动删掉最后的空格。

$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",".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)) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH . '/' . $_FILES['upload_file']['name'])) {
                $img_path = UPLOAD_PATH . '/' . $file_name;
                $is_upload = true;
            }
        } else {
            $msg = '此文件不允许上传';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

upload-lab-07

在第七行发现,原来是没有过滤末尾的点呀,吸取上一次的教训,直接修改后缀名在后面加.是不可以的,因为会被win自动过滤

所以还是使用抓包修改

1

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

}

2

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

}

upload-lab-08

和7一样的

$file_name = deldot($file_name);//删除文件名末尾的点

少了这个过滤,

所以我们可以进行文件名加点绕过。

Windows有个特性,就是如果文件名后缀以.或者空格结尾的,系统在保存文件时会自动去除点和空格。所以可以通过在文件名后面增加一个点来绕过限制

upload-lab-09

源码截取

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 = str_ireplace(‘::$DATA’, ‘’, $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空

比起上面的,都进行了过滤和限制,但是存在逻辑漏洞

当我们构造一个 phpinfo.php. .的文件时

phpinfo.php. .  –删除文件名末尾的点–>phpinfo.php.

phpinfo.php.    ——转换为小写———->phpinfo.php.

phpinfo.php.    —去除字符串::$DATA–>phpinfo.php.

phpinfo.php.    ——-首尾去空————>phpinfo.php.

phpinfo.php.   –后缀没有在黑名单中—>成功上传—–>解析时默认删除末尾的 . —>最终等价于上传了phpinfo.php文件

upload-lab-10

上传 10.pphphp 文件

后端黑名单中包含 ‘php’ , 会将php替换为空 , 但只替换一次 , 替换后的文件名为 10.php , 仍然可以正常使用

upload-lab-11

%00截断

.pphphp

都不对,气死了

upload-lab-12

利用%00url截断绕过

upload-lab-13

也是利用%00url截断绕过,但是环境问题无法验证,需要低版本的php

upload-lab-14

制作图片木马https://blog.csdn.net/qq_42702981/article/details/118652121

存在文件包含漏洞

<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?>

判断了是否为图片

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)){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

上传带有木马的jpg文件,通过文件包含漏洞执行

upload-lab-15

与14相同

upload-lab-16

https://blog.csdn.net/u014029795/article/details/102908114

存在二次渲染,需要手动寻找未被修改的位置,写入payload.

https://blog.csdn.net/u014029795/article/details/102908114

upload-lab-17

条件竞争

通过不断发包从而达到效果,可以通过burp进行爆破

https://www.fujieace.com/penetration-test/upload-labs-pass-17.html

upload-lab-18

和17 相同

upload-lab-19