WEB常见漏洞之文件上传(靶场篇)1

简介: WEB常见漏洞之文件上传(靶场篇)

0x01漏洞概述

upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关,每一关都包含着不同上传方式。

0x02环境配置

在 Windows 下使用 phpstudy 搭建靶场环境,将靶场放置到其 web 环境当中


靶场地址:https://github.com/c0ny1/upload-labs

成功访问说明靶场已经部署完成

思维导图如下:

0x03前端验证

Pass-01

场景分析

直接上传PHP文件浏览器会提示文件类型不正确,这多半就是前端校验

function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    if (file == null || file == "") {
        alert("请选择要上传的文件!");
        return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name + "|") == -1) {
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);
        return false;
    }
}

从上可知 JS 中定义白名单,白名单里包含.jpg、.png、.gif。前端验证绕过有三个思路,一是满足 JavaScript 规定的条件,通过抓包修改文件名;二是让用于验证的 JavaScript 代码不生效;三是修改 JavaScript 满足上传条件。

抓包绕过

首先将文件名phpinfo.php后缀修改为.png


mv phpinfo.php phpinfo.png

截取上传数据包并后缀名修改为php

成功访问phpinfo.php

禁用JS

使用浏览器插件Quick Javascript Switcher禁用JavaScript

成功访问phpinfo.php

调试JS

在浏览器中选择审查元素并在以下位置中设置断点

创建top/172.16.117.135/upload/Pass-01/index.php目录文件并在其中添加后缀名


var allow_ext = ".jpg|.png|.gif|.php";

在Sources中找到Overrides选择本地目录进行覆盖并保存

刷新网站后再次上传即可直接上传成功

删除JS

复制站点源代码为test.html并从中删除 JavaScript 限制代码

在上传点修改action路径,指定图片上传脚本



<form action="http://172.16.117.135/upload/Pass-01/index.php" enctype="multipart/form-data" method="post" onsubmit="return checkFile()">

选择文件点击上传

成功访问上传文件

0x04后端验证

Pass-02

场景分析

MIME 是什么呢?

MIME(媒体类型)是一种标准,主要用来表示文档、文件或字节流的性质和格式。它的组成结构非常简单,由类型与子类型两个字符串中间用'/'分隔而组成。不允许空格存在。type 表示可以被分多个子类的独立类别。subtype 表示细分后的每个类型。


type/subtype

常见的 MIME 类型包含如下:

application/octet-stream #应用程序的默认值
text/plain #文本类型的默认值
text/html #html类型的默认值
text/css #CSS类型默认值
text/javascript #JavaScript类型的默认值
image/png #png图片的默认值
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

这是一个后端校验的 PHP 代码,从上可知其中定义了 MIME 白名单,白名单里包含了image/jpeg、image/png、image/gif,脚本会检测上传数据包的 MIME 类型是否在白名单当中,如果不在白名单之内则无法上传。通过修改上传数据包的 MIME 类型可绕过限制,文件后缀名并没有因此发生改变,我们能直接访问木马文件。

修改MIME

上传php 文件后截取数据包将Content-Type类型修改为图片类型image/png

成功访问上传文件

Pass-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)) {
            $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 = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名黑名单,黑名单里包含.asp、.aspx、.php、.jsp,脚本会检测后缀名是否在黑名单当中,如果在黑名单则无法上传。虽然在黑名单中禁止了典型的脚本后缀名,但是与典型的脚本后缀同义的后缀名还有许多,比如php5、pht、phtml、php4等后缀名都能解析为php脚本,而cer、asa、cdx等后缀名都能解析为asp脚本。因此通过修改同义后缀名可绕过限制。

需要注意的是在默认情况下 php 的同义后缀名是无法解析的。

修改同义后缀名

上传 php 文件后截取数据包将后缀名类型修改为php5

在默认情况下.php5无法被正常解析

解决方法是修改 Apache 默认配置文件httpd.conf并重启


AddType application/x-httpd-php .php .phtml .php5


AllowOverride All

成功访问上传文件

Pass-04

场景分析

$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",".ini");
        $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;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名以及.ini,脚本会检测文件后缀名是否在黑名单当中,如果在黑名单当中则无法上传。但黑名单当中忽略了.htaccess文件。


什么是.htaccess呢?

.htaccess文件可用于覆盖 Apache 的默认配置文件httpd.conf修改解析格式来绕过黑名单。它提供了针对目录改变配置的方法,在特定的文档目录中放置该文件可作用此目录以及所有子目录。而.htaccess生效的前提与上一题类似,需要在 Apache 配置文件httpd.conf配置参数AllowOverride为All,因此我们可通过上传定制的.htaccess绕过限制


上传.htaccess

编写.htaccess文件并添加 php 解析,使所有带有 mac 的文件都能解析为 php

    <FilesMatch "mac">
    Sethandler application/x-httpd-php
    </FilesMatch>

    上传时又遇到一个问题:.htaccess无法被选择。我们可将其重命名为1.htaccess后通过 BurpSuite 抓包修改回.htaccess

    然后上传带有 php 代码的mac.png

    成功访问上传文件

    在实战中需要注意的是如果遇到文件名被重命名就不能使用该方法,因为即使重命名为1.htaccess也无法生效,切记

    Pass-05

    场景分析

    访问readme.php并未发现有什么可疑之处

      $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_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;
                  if (move_uploaded_file($temp_file, $img_path)) {
                      $is_upload = true;
                  } else {
                      $msg = '上传出错!';
                  }
              } else {
                  $msg = '此文件类型不允许上传!';
              }
          } else {
              $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
          }
      }

      这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名和.htaccess,脚本会检测文件后缀名是否在黑名单当中,如果在黑名单当中则无法上传。但黑名单当中忽略了.user.ini文件。


      什么是.user.ini呢?

      .user.ini是 php 中一种配置文件,众所周知当服务器以fastcgi运行脚本程序 php 时,php.ini是 php 的配置文件,它能对文件解析、导入扩展等进行个性化配置,而.user.ini与php.ini类似,它相当于一个用户自定义的php.ini,但不能修改任意php.ini中的属性值,php.ini的属性设置可分为四大类

      PHP_INI_USER #可在用户脚本(如ini_set())、Windows 注册表(PHP 5.3及以上)、.user.ini中设置
      PHP_INI_PERDIR #可在php.ini、.htaccess、httpd.conf中设置
      PHP_INI_SYSTEM #可在php.ini、httpd.conf中设置
      PHP_INI_ALL #可在任何地方设置

      从以上分类可知,只要不是PHP_INI_SYSTEM模式下的属性,均可在.user.ini中设置。auto_append_file以及auto_prepend_file均能自动包含文件且属于PHP_INI_PERDIR模式,通过利用这两个属性可上传.user.ini加载文件可完成文件包含。因此我们可通过上传定制的.user.ini绕过限制

      上传.user.ini

      编写.user.ini文件并添加 php 解析,使名为 mac.gif 的文件解析为 php


      auto_prepend_file=mac.gif

      将.user.ini重命名为1.user.ini后选择上传,通过 BurpSuite 抓包修改文件名回.user.ini

      上传带有 php 代码的mac.gif,这时所有的 php 文件都会包含该图片

      访问readme.php即可完成 php 解析

      目录
      相关文章
      |
      2月前
      |
      安全 测试技术 程序员
      web渗透-文件包含漏洞
      文件包含漏洞源于程序动态包含文件时未严格校验用户输入,导致可加载恶意文件。分为本地和远程包含,常见于PHP,利用伪协议、日志或session文件可实现代码执行,需通过合理过滤和配置防范。
      539 79
      web渗透-文件包含漏洞
      |
      2月前
      |
      存储 安全 前端开发
      Web渗透-文件上传漏洞-上篇
      文件上传漏洞常见于Web应用,因类型限制不严可致恶意文件执行。本文介绍前端检测、MIME类型、黑名单、.htaccess、空格、双写等多种绕过方式,并结合upload-labs靶场演示利用方法,提升安全防护认知。
      299 1
      Web渗透-文件上传漏洞-上篇
      |
      2月前
      |
      安全 中间件 应用服务中间件
      WEB渗透-文件上传漏洞-下篇
      本文详解文件上传安全漏洞,涵盖白名单绕过(如00截断、条件竞争)、图片木马制作与利用、以及IIS、Apache、Nginx等常见解析漏洞原理与防御。结合实战案例,深入剖析攻击手法与修复方案。
      184 1
      |
      2月前
      |
      存储 JavaScript 安全
      Web渗透-XSS漏洞深入及xss-labs靶场实战
      XSS(跨站脚本攻击)是常见的Web安全漏洞,通过在网页中注入恶意脚本,窃取用户信息或执行非法操作。本文介绍其原理、分类(反射型、存储型、DOM型)、测试方法及xss-labs靶场实战案例,帮助理解与防御XSS攻击。
      720 1
      Web渗透-XSS漏洞深入及xss-labs靶场实战
      |
      2月前
      |
      安全 NoSQL Shell
      web渗透-SSRF漏洞及discuz论坛网站测试
      SSRF(服务器端请求伪造)是一种安全漏洞,攻击者可诱使服务端发起任意请求,进而探测或攻击内网系统。常用于端口扫描、访问内部服务、读取本地文件等。常见防御包括限制协议、域名和IP,但可通过302跳转、短地址等方式绕过。
      195 1
      web渗透-SSRF漏洞及discuz论坛网站测试
      |
      2月前
      |
      安全 程序员 数据库连接
      web渗透-CSRF漏洞
      CSRF(跨站请求伪造)是一种常见的Web安全漏洞,攻击者通过伪造用户请求,诱使其在已登录状态下执行非意愿操作。本文介绍CSRF原理、分类(站外与站内)、DVWA靶场搭建及防御措施,如同源策略与Token验证,提升安全防护意识。
      346 0
      web渗透-CSRF漏洞
      |
      1月前
      |
      算法 Java Go
      【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
      gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
      184 4
      |
      5月前
      |
      缓存 JavaScript 前端开发
      鸿蒙5开发宝藏案例分享---Web开发优化案例分享
      本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
      |
      5月前
      |
      JavaScript 前端开发 API
      鸿蒙5开发宝藏案例分享---Web加载时延优化解析
      本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
      |
      前端开发 JavaScript Shell
      鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
      本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。

      热门文章

      最新文章