目录
前言
upload-labs 我来了
mime类型:
我自己在搭的留言板中上传图片就是使用mime类型验证,判断收上来的文件属不属于我限定的mime类型,来过滤。
htaccess文件:
可以修改目录文件,或指定文件的编码格式
提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
简单来说,我们需要的是其改变指定文件解析方式的作用,可以将我们上传的jpg文件使用php进行解读(setHandler)
ps1:启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。
ps2: .htaccess文件不能起名字,他就是.htaccess文件,如果你将他改为4.htaccess或者其他的什么名字是不可以的,无法解析。在实战中有可能上传上去这个文件会被自动重命名,被重命名了就不可以了。
::$DATA
在php+windows的情况下:如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。利用windows特性,可在后缀名中加” ::$DATA”绕过。
图片马
三种合成方式:
方法一cmd copy命令
完成后
发现ma.jpg文本中出现了一句话木马
ps:最好不要直接使用记事本添加,由于编码的问题,极容易是图片无法正常显示
copy命令中/b是以二进制进行
方法二使用反汇编工具c32asm在16进制下添加
ps最好在最后添加,在中间添加可能是图片不发完全显示。。
二且这个方法你直接记事本打开是看不到一句话木马的,因为咱们是16进制写进去的嘛,嘿嘿
方法三使用ps工具
进入ps,打开图片,在文件简介处直接添加木马。。
move_uploaded_file的小特点
该函数会忽略掉文件末尾的 /.(懂得都懂233)
pass-1-js验证:
本题为js过滤
对此我们可以直接禁用js,这样就可以上传php文件了,也可以通过burp抓包,在burp中将jpg改为php,之后在右键图片,在新标签中打开,即可获得其保存路径。。通过这样我满便可以将一句话木马上传至服务器233.
pass-2-只验证Content-type:
先上传一个正常图片,抓包,观察
发现有mime类型传递,大概率是mime检查没跑了,这里直接修改filename,改为php文件,即可成功上传webshell,因为发送的包中content-type是mime类型,而在服务器只会检查contene-type而不会检查文件后缀名233
ps:同样可以直接上传一个php文件,通过抓包修改content-type为合法的值。。
pass-3-后缀名验证:
本题在pass2的基础上有加入了后缀名过滤,
除了使用mime类型还加入了后缀名限制
对此,既然已经知道限制了那些文件,那我们不用只写文件不就行了,完全可以使用PHP3嘛233
ps:选择后缀名时应该确认靶机httpd上开启了对应后缀名的使用
pass-4-htaccess
黑名单拒绝了几乎所有有问题的后缀名,除了.htaccess
前提条件(1.mod_rewrite模块开启。2.AllowOverride All
)
因此先上传一个.htaccess文件,内容如下:
注意
.htaccess文件不能起名字,他就是.htaccess文件,如果你将他改为4.htaccess或者其他的什么名字是不可以的,无法解析。在实战中有可能上传上去这个文件会被自动重命名,被重命名了就不可以了。
<FilesMatch "shell"> //使用正则表达式匹配,匹配到shell就执行
SetHandler application/x-httpd-php //将改文件使用php解析,不考虑其后缀名
</FilesMatch>
ps,FilesMatch的作用是匹配限制,不加也可以,如果不加的话,.htaccess文件所在的目录下所有文件都会以php方式解析
上传完.htaccess后,再上传装有木马的shell.jpg,
即可
成功上传webshell
pass--5--点-空-点:
审计源码后我们发现,本题只检验了一次,没有进行循环检验,那么我们完全可以将文件后缀名改为.php. .在过滤时,先把最后面的点给删掉,在收尾去空,这样留下了.php.就上传成功了。
ps:不知道为什么,高版本的php已经不可以在这么进行了,好像是不在识别.php.了,推荐使用php5
pass-6-大小写绕过
阅读源码可知相比于其他题,本题没有变小写这个过程
因此,直接改名.PHP ,成功上传
pass-7-空点
审计源码
最后没有删除空格,所以直接上传文件.pjp .(空格加点),即可绕过
完美
pass-8-点空格
审计源码
没有去掉末尾的点,因此可以上传文件.php. (点加空格)绕过
跟上关几乎一模一样
pass-9-::$DATA
审计源码,可是没有过滤::$DATA
直接走起
成功上传
完美
pass-10
emm,跟第五题一毛一样。。。。可能是重了吧
估计是我安装时bug了
pass-11-双写绕过
哦吼,这个我熟,跟sql注入绕过删除过滤一毛一样,嘿嘿
双写绕过
完美
至此,黑名单绕过已经刷完,下面几道题均为白名单限制,这才是最常见的
pass-12-%00截断
ps%00在oho5.3之后已经不能用了,我的PHP最低版本为5.6,懒得下5.2了,这儿题就跳过吧
大致思路就是再上传时将get参数savepath修改一下,改成 /upload/shell.php %00
ps:经过多次试验,发现使用注释符(";#或者";//)可以绕过检测但不知为何move_uploaded_file($temp_file,$img_path)报错,导致无法正常上传,待解决。
pass-13-%00截断
与12题一样,只是本题采用post方式传参,注意解码,get会自行解码,post不会自行解码233
pass-14-上传图片马
合成图片马将一个正常的jpg/png/gif文件与一个木马php等文件合并形成图片马,如果有文件包含漏洞(类似.htaccess),即可将图片马直接当做php脚本文件执行
另,本题对图片头两个字节进行检查,看是否为图片的,我们是在文件最后面加上木马的完全不需要担心
完美
pass
pass-15-getimagesize绕过
getimagesize()简介
这个函数功能会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的
因此本题跟上题一样,我们直接过
pass-16-exif_imagetype绕过
exif_imagetype() 读取一个图像的第一个字节并检查其签名。
本函数可用来避免调用其它 exif 函数用到了不支持的文件类型上或和 $_SERVER['HTTP_ACCEPT'] 结合使用来检查浏览器是否可以显示某个指定的图像。
但依然难不倒我们,跟14题一个解法233
pass-17-二次渲染
本题详情见(3条消息) upload-labs之pass 16详细分析_q1415500189的博客-CSDN博客
ps:png运行完脚本之后,会插入<?php $_GET[0]($_POST[1])?>
需要传入get的0= 以及post的1= 才能运行。。。
害,还是得用别人的东西,太菜了我
pass-18-条件竞争
第十八关主要是对条件竞争的考察,我们看代码他是先将图片上传上去,才开始进行判断后缀名、二次渲染。如果我们在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删除这个文件,就会提示这个文件在另一程序中打开无法删除。
操作:直接上传一个php文件,然后进行抓包,将数据包发送至intruder下,如图操作(先把变量删了)
然后如图操作修改(让我们访问是不带payload)
然后发包,用另一个浏览器一直访问2.php地址,只要在上传的一瞬间,他还没来的及删除、修改就可以了233。(卡吧)
成功卡如,但现在问题是,一旦结束攻击,他依然会被删掉这个文件
pass-19-条件竞争
ps:本题保存路径好像有问题,没有保存到upload,我们把它改一下
很明显它$dir后面忘加上.'/'了,我已经帮他加上了
本关经过代码审计,感觉像是是18与19关的融合吧,依然是条件竞争,不过这次我们只能上传图片马,用burpsuite爆破,然后用前几关的文件包含漏洞打开。
这关是检查了后缀名,然后上传,然后在进行二次渲染。这时我们只能上传图片马,而且得配合解析漏洞进行通关
操作和18关的一样,就是访问地址是加上包含漏洞的。
没什么问题,这些漏洞其实都是逻辑上的漏洞,二次渲染本身是没什么问题的。如果人家先验证在进行上传那就没有办法了。
pass-20-自定义保存路径
move_uploaded_file()有这么一个特性,会忽略掉文件末尾的 /.
所以我们把他修改为如图所示
上传
完美
pass-21-数组绕过
审计源码:
$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
//检查MIME
$allow_type = array('image/jpeg','image/png','image/gif');
if(!in_array($_FILES['upload_file']['type'],$allow_type)){
$msg = "禁止上传该类型文件!";
}else{
//检查文件名
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
}
$ext = end($file);
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上传该后缀文件!";
}else{
$file_name = reset($file) . '.' . $file[count($file) - 1];
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$msg = "文件上传成功!";
$is_upload = true;
} else {
$msg = "文件上传失败!";
}
}
}
}else{
$msg = "请选择要上传的文件!";
}
很容易发现,它最后在合并文件名称时没有使用end,而是使用了数字下标,要知道,php里数组是既可以由下标索引,也可以有键值索引的,再加上前面第11行,如果上传的是数组,就不拆字符串,这都把答案拍你脸上了,比如如我们上传的数组是这样的
$save_name=array(
'0':payload_20,
'2':php,
'3':jpg
);
显然在检验后缀名时end()函数取出的是jpg,而在合并文件名时取出的php.
综上,我们在burp中将上传的savename改成数组,格式如下
上传
完美
总结
至此upload-labs篇完结,撒花,芜湖。。。。
我觉得这uplaod-labs是挺不错的,将大部分文件上传都给你出上了,对我这种小白真的帮助非常大,感谢upload-lab作者。。