upload-labs Pass13 to 20
前言:一句话木马原理
一句话木马
|
|
例如对于include包含漏洞,请求体增加一个post的参数ant=phpinfo();
,就会实现执行phpinfo()
Antsword
Pass13-文件拼接+include文件包含
- 直接修改后缀是无法通过,原因是检查文件头类型
- 文件被重命名,而且后缀跟随文件头类型,由于限制了白名单,相当于无法修改
方法1:直接添加文件头信息
方法2:拼接图片和php文件
文件拼接,注意拼接顺序
linux下
|
|
windows下(cmd下,powershell下不成功)
|
|
注意:copy /B和/A参数的意义
|
|
最后利用注入点:由于无法上传htaccess或者user.ini,题目是需要利用提示存在的文件包含漏洞 访问 http://127.0.0.1/include.php?file=upload/2220220729012635.png
|
|
Pass14-getimagesize大小检查
见Pass13的方法2
Pass15-exif_imagetype检查
见Pass13的方法2
Pass16-imagecreatefromjpeg图片二次渲染
pass16由于重新渲染了图片,会把原来嵌入的代码删掉
gif\png\jpg格式需要不同的插入方式, 参考其他方式的wp
下面以gif为例
-
先上传一个out.gif图片马,上传后发现无法像Pass13一样访问,原因是存在类似
$im = imagecreatefromjpeg($target_path);
进行重新渲染 -
重新下载服务器生成的gif文件,使用010Editor打开,发现尾部的php代码已经被删除
上传的文件gif文件,尾部php代码被删除
Pass17-条件竞争
|
|
审计源码发现:
- 上传的数据包直接先保存在
$upload_file
路径,再进行in_array
白名单后缀检查 - 只要我们上传一个php文件,其实它是可以短暂存在于
$upload_file
,而且可以是一个php可解析文件 - 然后需要使用burpsuite,拦截上传的数据包后创建Instruder,不断的发包
- 通过浏览器或者脚本不断访问零食文件,直到访问成功
暂没复现成功
Pass19-%00截断
把保存的名称参数通过%00进行截断即可成功
Pass20
-
绕过MIME检查,通过代码审计知道需要修改
Content-Type: image/jpeg
1 2 3 4 5
//绕过检查MIME $allow_type = array('image/jpeg','image/png','image/gif'); if(!in_array($_FILES['upload_file']['type'],$allow_type)){ $msg = "禁止上传该类型文件!"; }
-
继续代码审计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
$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 = "文件上传失败!"; } }
-
根据empty($_POST[‘save_name’])的判断,如果
save_name
空,file=name
继续操作,file
通过$file = explode('.', strtolower($file))
打断成为数组,后缀ext
就是最后一个元素 -
这时如果通过
name=ant.php%00.jpg
截断,后缀还是php,无法通过后面in_array
检查只00截断,无法通过,后缀仍是php -
所以
save_name
不能置空,让file=save_name
,然后为了绕过后面的检查,将save_name
修改为数组,%00
记得urldecode修改save_name 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// file传入的时save_name数组,绕过了打断 if (!is_array($file)) { $file = explode('.', strtolower($file)); } // save_name最后一个元素时jpg,绕过了后缀检查 $ext = end($file); $allow_suffix = array('jpg','png','gif'); if (!in_array($ext, $allow_suffix)) { $msg = "禁止上传该后缀文件!"; } else { // 取出了save_name的第一个和最后一个元素组合成新文件名 // 新文件名file_name=upload-20.php%00.jpg // move_uploaded_file时就会发生截断 $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 = "文件上传失败!"; } }
-