> 文章列表 > upload 通关pass16-pass20

upload 通关pass16-pass20

upload 通关pass16-pass20

1.pass16 白名单 二次渲染

需要先上传一个正常图片,然后下载下来,跟原图片进行比对,用010 16进制编辑器,把php代码放到没有改变的位置,即一样的地方

upload 通关pass16-pass20

访问:
upload 通关pass16-pass20

2.pass17 白名单 条件竞争

upload 通关pass16-pass20
这题先是上传文件并保存该文件,然后在检查后缀,不是允许上传的文件就删除(unlink),可以利用条件竞争在文件删除前在新建一个文件
burp抓包,随便设一个变量,使用intruder模块进行爆破
upload 通关pass16-pass20

观察文件是否产生,使用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

访问
upload 通关pass16-pass20

3.pass-18 白名单 文件包含图片马

upload 通关pass16-pass20
这题看着很多代码,检查了后缀名所以后缀需要是允许的那几个
myupload.php改一下文件上传的位置
upload 通关pass16-pass20

burp抓包改后缀
upload 通关pass16-pass20

访问
upload 通关pass16-pass20

4.pass-19 黑名单 ./绕过

upload 通关pass16-pass20
通过代码审计,发现保存的文件名可控,这个地方没有检查上传时的文件后缀,即上传时文件后缀是什么也可以,检查的是保存的文件名的后缀,windows流一些特征都可以使用,没有过滤

burp抓包 加上/.,空格,::$data,点都可以绕过
或者%00截断 upload-19.php%00.jpg %00解码upload-19.php .jpg
需要小于5.3.4,且magic_quote_gpc为off
upload 通关pass16-pass20访问upload 通关pass16-pass20

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,这样的话文件命令时会使最后一个为空,因为file[1]为空,传入索引为0元素的值还可以用windows一些环境特性的值,点空格::file[1]为空,传入索引为0元素的值还可以用windows一些环境特性的值,点 空格 ::file[1]为空,传入索引为0元素的值还可以用windows一些环境特性的值,点空格::data,或/.(windows和linux都可以使用)
burp抓包
upload 通关pass16-pass20
访问
upload 通关pass16-pass20
总结:
在这里插入图片描述
参考文章:
pass-20数组绕过