首页 > 其他分享 >Web通用漏洞--文件上传

Web通用漏洞--文件上传

时间:2023-08-13 16:57:03浏览次数:53  
标签:Web name 文件 -- 后缀 file 上传 进行

Web通用漏洞--文件上传

概述

文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语言版本,语言函数,中间件,引用的第三方编辑器等存在缺陷地方配合利用。另外文件上传也有多个存储逻辑,不同的文件存储方案也会给攻击者带来不一样的挑战!

靶场upload-labs-docker

js验证

采用前端代码进行文件后缀验证
在这里插入图片描述
绕过方法

  1. 删除前端代码
    通过查看前端代码,发现上传form表单有个javascirpt事件,即检测文件后缀白名单,删除即可
    在这里插入图片描述
  2. 在浏览器禁用javascript
  3. 将文件后缀修改为允许上传的后缀,通过前端校验后抓包修改文件后缀

修改解析规则

在这里插入图片描述
上传.htaccess文件添加配置解析规则,将png文件后缀进行php解析

AddType application/x-httpd-php .png

上传写有php代码的png文件,访问
在这里插入图片描述

文件类型绕过

在这里插入图片描述
源码

    <?php
        header("Content-type: text/html;charset=utf-8");
        error_reporting(0);
        //设置上传目录
        define("UPLOAD_PATH", dirname(__FILE__) . "/upload/");
        define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH));
        if (!file_exists(UPLOAD_PATH)) {
            mkdir(UPLOAD_PATH, 0755);
        }
        $is_upload = false;
        if (!empty($_POST['submit'])) {
            if (!in_array($_FILES['file']['type'], ["image/jpeg", "image/png", "image/gif", "image/jpg"])) {
                echo "<script>black();</script>";
            } else {
                $name = basename($_FILES['file']['name']);
                if (move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_PATH . $name)) {
                    $is_upload = true;
                } else {
                    echo "<script>alert('上传失败')</script>";
                }
            }
        }
    ?>

代码中通过查看type白名单进行过滤
通过抓包将数据包中的content-type进行修改即可上传成功
在这里插入图片描述

文件头检测

在这里插入图片描述
源码

 <?php
        header("Content-type: text/html;charset=utf-8");
        error_reporting(0);
        //设置上传目录
        define("UPLOAD_PATH", dirname(__FILE__) . "/upload/");
        define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH));
        if (!file_exists(UPLOAD_PATH)) {
            mkdir(UPLOAD_PATH, 0755);
        }
        $is_upload = false;
        if (!empty($_POST['submit'])) {
            if (!$_FILES['file']['size']) {
                echo "<script>error();</script>";
            } else {
                $file = fopen($_FILES['file']['tmp_name'], "rb");
                $bin = fread($file, 4);
                fclose($file);
                if (!in_array($_FILES['file']['type'], ["image/jpeg", "image/jpg", "image/png", "image/gif"])) {
                    echo "<script>black();</script>";
                } else if (!in_array(bin2hex($bin), ["89504E47", "FFD8FFE0", "47494638"])) {
                    echo "<script>black();</script>";
                } else {
                    $name = basename($_FILES['file']['name']);
                    if (move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_PATH . $name)) {
                        $is_upload = true;
                    } else {
                        echo "<script>error();</script>";
                    }
                }
            }
        }
    ?>

源码中对上传文件的类型和文件头都进行了检测

if (!in_array($_FILES['file']['type'], ["image/jpeg", "image/jpg", "image/png", "image/gif"]))
if (!in_array(bin2hex($bin), ["89504E47", "FFD8FFE0", "47494638"]))

那么将我们上传的文件头添加符合上传规则文件头并且修改数据包中的content-type类型即可成功上传
在这里插入图片描述
在这里插入图片描述

黑名单验证

在这里插入图片描述
题目中源码采用了黑名单验证的方式,将黑名单中的后缀进行替换为空,但是并没有进行循环验证处理,因此可以采用多重后缀名嵌套进行上传。
在这里插入图片描述

文件后缀大小写敏感

在这里插入图片描述
在linux系统中文件名大小写敏感,题目中源码只对小写后缀名进行过滤,可以采用大写文件名后缀进行上传。

在这里插入图片描述

零零截断(GET)

在这里插入图片描述
零零截断即在系统进行文件接受时,会错误得把%00当作结束符进行接受保存,从而不对%00后面的字符进行保存。%00使url进行解码后的结果其实是为空字节。

 <?php
        header("Content-type: text/html;charset=utf-8");
        error_reporting(0);
        //设置上传目录
        define("UPLOAD_PATH", dirname(__FILE__) . "/upload/");
        define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH));
        if (!file_exists(UPLOAD_PATH)) {
            mkdir(UPLOAD_PATH, 0755);
        }
        $is_upload = false;
        if (!empty($_POST['submit'])) {
            $name = basename($_FILES['file']['name']);
            $info = pathinfo($name);
            $ext = $info['extension'];
            $whitelist = array("jpg", "jpeg", "png", "gif");
            if (in_array($ext, $whitelist)) {
                
                $filename = rand(10, 99) . date("YmdHis") . "." . $ext;
                $des = $_GET['road'] . "/" . $filename;

                if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
                    $is_upload = true;
                } else {
                    echo "<script>black();</script>";
                }
            } else {
                echo "文件类型不匹配";
            }
        }
    ?>

在文件进行保存的时候,文件路径与文件名相连接,路径中带有%00,于是将文件保存为2.php
在这里插入图片描述
关于php版本是否符合,在网站的返回数据包中可以查看
在这里插入图片描述

零零截断(POST)

在这里插入图片描述
POST型在进行零零截断的时候需要将文件路径写在传送数据的位置,由于GET型在写入%00时,系统会自动将地址栏的%00进行解码,但是POST不会,因此在进行上传过程中需要将%00进行解码发送。
在这里插入图片描述

配置绕过

在网站管理员进行网站配置过程中没有严格进行配置网站,导致php3,php5等文件后缀名文件也进行php解析。
在这里插入图片描述

<?php
        header("Content-type: text/html;charset=utf-8");
        error_reporting(0);
        //设置上传目录
        define("UPLOAD_PATH", dirname(__FILE__) . "/upload/");
        define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH));
        if (!file_exists(UPLOAD_PATH)) {
            mkdir(UPLOAD_PATH, 0755);
        }
        $is_upload = false;
        if (!empty($_POST['submit'])) {
            $name = basename($_FILES['file']['name']);
            $ext = pathinfo($name)['extension'];
            $blacklist = array("asp","aspx","php","jsp","htaccess");
            
            if (!in_array($ext, $blacklist)) {
                if (move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_PATH . $name)) {
                    $is_upload = true;
                } else {
                    echo "<script>error();</script>";
                }
            } else {
                    echo "<script>black();</script>";
            }
        }
    ?>

源码中采取了白名单验证后缀名,如何后缀名为php,asp等将不能通过验证
在这里插入图片描述

条件竞争

条件竞争是利用一种错误的逻辑进行的文件上传,所以可以将上传的文件中写入访问即创建的代码,再对该文件进行不断上传,同时不断访问该文件,只要访问到了该文件,便会创建一个后门文件出来。

在这里插入图片描述

 <?php
        header("Content-type: text/html;charset=utf-8");
        error_reporting(0);
        //设置上传目录
        define("UPLOAD_PATH", dirname(__FILE__) . "/upload/");
        define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH));
        if (!file_exists(UPLOAD_PATH)) {
            mkdir(UPLOAD_PATH, 0755);
        }
        $is_upload = false;
        if (!empty($_POST['submit'])) {
            $name = basename($_FILES['file']['name']);
            $ext = pathinfo($name)['extension'];
            $upload_file = UPLOAD_PATH . '/' . $name;
            $whitelist = array('jpg','png','gif','jpeg');
            
            if (move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_PATH . $name)) {
                if(in_array($ext,$whitelist)){
                    $rename_file = rand(10, 99).date("YmdHis").".".$ext;
                    $img_path = UPLOAD_PATH . '/'. $rename_file;
                    rename($upload_file, $img_path);
                    $is_upload = true;
                }else{
                    echo "<script>black();</script>";
                    unlink($upload_file);
                }
            } 
        }
    ?>

源码中先将文件进行存储,再进行判断文件是否合法。
首先抓取上传文件的数据包
在这里插入图片描述
发送至intruder模块进行空值爆破,无限制得上传该文件
在这里插入图片描述
再抓取访问该文件得数据包,依旧进行空值爆破
在这里插入图片描述
当访问数据包出现不同长度的返回包时,大概率时已经成功创建了,连接后门验证结果即可
在这里插入图片描述
连接成功
在这里插入图片描述

二次渲染

在进行文件上传过程中,很多网站会对上传后的图片进行二次渲染以适应web显示界面等。
在这里插入图片描述
在对绕过二次渲染的图片马中,gif文件最为简单
在这里插入图片描述
先将图片进行上传,然后将上传过后的图片进行下载,与源文件进行对比,在没有修改的部分插入代码即可。
在这里插入图片描述
经过对比灰色部分就是没有发生变化的部分,在灰色部分插入代码即可
在这里插入图片描述
重新上传,再次下载查看payload是否存在
在这里插入图片描述

使用网站本身的包含漏洞进行验证
在这里插入图片描述

move_uploaded_file缺陷

在这里插入图片描述
在保存文件名后面加上/.便可以上传成功

代码审计

不会!

文件解析方案

  1. 执行权限(有可能绕过)
    文件上传后,存储文件的文件夹无执行权限

  2. 解码还原(不能绕过)
    文件在上传过程中,源码通过函数将文件中的数据提取出来并进行编码,存储入数据库中。在使用文件时,调用数据编码进行解码还原。

文件存储方案

  1. 分站存储(不能绕过)
    网站与存储上传文件属于不同站点、不同服务器,在网站服务器进行上传,传输至存储文件服务器,一般会设置执行权限。
  2. 对象存储(不能绕过)
    OSS对象云存储,只能存储文件,并不能执行。具有key泄露的风险。

以上内容仅作学习,如有错误或瑕疵,欢迎批评指正,感谢阅读。

标签:Web,name,文件,--,后缀,file,上传,进行
From: https://www.cnblogs.com/Pengj/p/17626793.html

相关文章

  • 第十章 项目沟通管理
    规划沟通管理沟通渠道数量:(n(n-1))/2规划沟通管理的过程:(1)工具与技术沟通技术:沟通模型:沟通方法:沟通方法举例子:文化意识:(2)输出沟通管理计划:管理沟通管理沟通的过程:(1)工具与技术会议管理:监督沟通监督沟通的过程:     ......
  • 【RL】L7-Temporal-difference learning
    TDlearningofstatevaluesThedata/experiencerequiredbythealgorithm:\(\left(s_0,r_1,s_1,\ldots,s_t,r_{t+1},s_{t+1},\ldots\right)\)or\(\left\{\left(s_t,r_{t+1},s_{t+1}\right)\right\}_t\)generatedfollowingthegivenpolicy......
  • 第十一章 项目风险管理
    规划风险管理规划风险管理的过程:(1)输出风险管理计划:相关方风险偏好:几种分解结构的区别:识别风险识别风险的过程:(1)工具与技术核对单:SWOT分析:(2)输出风险登记册:关于风险的几个文件:实施定性风险分析实施定性分析的过程:主观的猜测行为,去定优先级(1)工具与技......
  • 2023.32 AI架构
    AI架构是指在设计和构建人工智能系统时所采用的整体结构和组织方式。AI架构通常由多个组件和层次组成,每个组件负责不同的任务和功能。以下是一种常见的AI架构:数据层:AI系统的基础是数据。数据层负责数据的收集、存储和准备工作。这包括数据的获取、清洗、预处理和转换,以使其适合后......
  • Wireshark使用
    WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程中各种问题定位。本文主要内容包括:1、Wireshark软件下载和安装。2、WireShark工作原理及优势。3、Wireshark使用过程。一.Wireshark软件下载及安装软件下载路......
  • 周日 Filter
    importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjava.io.IOException;//@WebFilter("/hello.jsp")@WebFilter("/*")publicclassFilterDemo2implementsFilter{@OverridepublicvoiddoFilter(ServletR......
  • Auto-registering all your components in Vue 3 with Vite
    Auto-registeringallyourcomponentsinVue3withVite#vue#vitejs#componentsWhyauto-registercomponents?I'mactuallyabigfanofmanuallyimportingcomponentsinVueapplications.Itmakesitveryclearwhereeverycomponentcomesfrom,does......
  • 第十二章 项目采购管理
    规划采购管理规划采购管理的过程:(1)输入组织过程资产:合同类型:⭐一本通P83总价合同的类型:成本补偿合同的类型:合同类型,举例子:(2)工具与技术自制或外购分析:(3)输出招标文件:采购工作说明书:招标文件:供方选择标准:独立成本估算:实施采购实施采购的过程:(1)工具......
  • 4 表达式
    =赋值运算符优先级较低,赋值运算符满足右结合律*p++相当于*(p++) p++++p不同的行为值得注意以下情况可能发生类型转换:比int类型小的整数值首先提升为较大的整数类型;函数调用时;算数运算时;初始化时;显示类型转换static_castconst_castreinterpret_caststatic_cast......
  • 3 字符串向量数组
    当把string对象和子符字面值混在一条语句中使用时,必须确保每个+运算符的两侧的运算对象至少有一个是string用花括号对vector做初始化,不能用下标形式添加元素迭代器,iterator const_iterator两种迭代器类型,如果vector或string对象是常量,只能使用const_iterator。对vect......