upload 通关pass16-pass20
1.pass16 白名单 二次渲染
需要先上传一个正常图片,然后下载下来,跟原图片进行比对,用010 16进制编辑器,把php代码放到没有改变的位置,即一样的地方
访问:
2.pass17 白名单 条件竞争
这题先是上传文件并保存该文件,然后在检查后缀,不是允许上传的文件就删除(unlink),可以利用条件竞争在文件删除前在新建一个文件
burp抓包,随便设一个变量,使用intruder模块进行爆破
观察文件是否产生,使用python去访问
1.php
<?php file_put_contents('2.php','<?php phpinfo()?>'); ?>
python
url='http://192.168.85.120/upload-labs/upload/1.php'
while True:
html=requests.get(url=url)
if html.status_code==200:
print('ok')
break
访问
3.pass-18 白名单 文件包含图片马
这题看着很多代码,检查了后缀名所以后缀需要是允许的那几个
myupload.php改一下文件上传的位置
burp抓包改后缀
访问
4.pass-19 黑名单 ./绕过
通过代码审计,发现保存的文件名可控,这个地方没有检查上传时的文件后缀,即上传时文件后缀是什么也可以,检查的是保存的文件名的后缀,windows流一些特征都可以使用,没有过滤
burp抓包 加上/.,空格,::$data,点都可以绕过
或者%00截断 upload-19.php%00.jpg %00解码upload-19.php .jpg
需要小于5.3.4,且magic_quote_gpc为off
访问
5.pass-20 白名单 数组绕过
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
//mime check
$allow_type = array('image/jpeg','image/png','image/gif');
if(!in_array($_FILES['upload_file']['type'],$allow_type)){
$msg = "禁止上传该类型文件!";
}else{
//check filename
$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 = "请选择要上传的文件!";
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
进行代码审计,刚开始进行了检查mime类型,需要修改为允许的那三种类型
之后判断文件名是不是没有,没有就从文件原先的名字获取,有从post方式获取save_name的值,然后判断文件是不是数组,不是数组就拆分成数组,如果是数组的话,获取数组的最后一个元素,判断是不是那三种图片类型,不是就继续进行移动文件,在移动文件之前需要获取文件名,reset函数把内部指针指向数组中的第一个元素,加上一个.,获取file数组的所有元素数量-1的元素
通过代码可以看出可以使用传入数组
下方传入的数组为一个,数组元素为2个。索引分别为0和2,这样的话文件命令时会使最后一个为空,因为
f
i
l
e
[
1
]
为空
,
传入索引为
0
元素的值还可以用
w
i
n
d
o
w
s
一些环境特性的值,点空格
:
:
file[1]为空,传入索引为0元素的值还可以用windows一些环境特性的值,点 空格 ::
file[1]为空,传入索引为0元素的值还可以用windows一些环境特性的值,点空格::data,或/.(windows和linux都可以使用)
burp抓包
访问
总结:
参考文章:
pass-20数组绕过