0


文件上传漏洞基础/content-type绕过/黑名单绕过/

一、content-type绕过

contenent-type

有些上传模块,会对http的类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务器是通过ent-type判断类型,content-type在客户端可被修改,则此文件上传也有被绕过的风险!

源代码分析

upload-labs pass-02

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                $is_upload = true;

            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
    }
}

关键代码

if (($_FILES['upload_file']['type'] == 'image/jpeg') || 
($_FILES['upload_file']['type'] == 'image/png') || 
($_FILES['upload_file']['type'] == 'image/gif'))

在后端检测了上传文件的content-type是不是图片格式,也就是说,我们前面用的删掉前端函数,直接上传方式是用不了的,我们需要发送数据包中的content-type为image/png

绕过方式

①修改脚本后缀,上传,抓包中修改后缀(因为上传的就是图片,所以content-type就是image/png)

②直接上传脚本,抓包中直接修改conent-type

尝试绕过

还是先清空前面上传的文件

尝试上传test.php

①修改后缀上传

可以看到content-type就是image/png,这时候我们直接修改后缀即可

上传成功

②直接上传脚本修改content-type

修改content-type 为 image/png

上传成功

二、黑名单绕过

黑名单

上传模块,有时候会加入黑名单限制,在上传文件的时候获取后缀名,再把后缀名与程序中黑名单进行检测,如果后缀名在黑名单的列表内,将禁止文件上传

代码分析

upload-labs pass03

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

分析一下代码,其中$deny_ext是一个数组,里面存放着需要被检测的后缀名,即黑名单

$file_ext进行处理提取后缀名并转为小写

in_array($file_ext, $deny_ext)

判断$file_ext是否在$deny_ext中,即后缀名是否在黑名单中

后缀名不在黑名单中时,才进行上传操作

绕过方法

尝试其他的后缀名,如该题屏蔽了asp、aspx、php、jsp,我们可以使用如asa、cer、ashx、phtml文件,但要确保服务器可以执行该类型文件

这里屏蔽的asp 那asa cer cdx 大概率是可以使用的,如果网站允许.net执行ashx可以代替aspx

在不同的中间件中有特殊的情况,有点apache版本会默认开启AddType application/x-httpd-php .php .php3 .phtml,将后缀名为phtml、php3的文件解析成php文件

尝试绕过

我们尝试将脚本文件改为phtml后缀上传

上传成功访问一下

这啥都没有啊

查看一下配置文件

可以看到这里没有默认开启,而是被注释掉了,导致我们上传的文件无法被执行

我查阅了一下其他大佬的通关秘籍,发现这里都是直接把这个注释打开,那咱也打开

重启phpstudy再次访问

可以看到成功访问到了!

标签: php 开发语言 安全

本文转载自: https://blog.csdn.net/qq_40345591/article/details/127449928
版权归原作者 白帽Chen_D 所有, 如有侵权,请联系我们删除。

“文件上传漏洞基础/content-type绕过/黑名单绕过/”的评论:

还没有评论