Pass-19 /.绕过
弄了一会,没思路,解析漏洞都给关了,黑名单似乎也没有什么好办法了,先看源码吧
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = $_POST['save_name'];
$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);
if(!in_array($file_ext,$deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
}else{
$msg = '上传出错!';
}
}else{
$msg = '禁止保存为该类型文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
有一个新函数之间没见过的,pathinfo
,去查了下。
这里也没有什么其他的问题,就是要利用这个黑名单来完成绕过了。查了其他的writeup
后,发现move_uploaded_file()
还有这么一个特性,会忽略掉文件末尾的/.
。而代码中的file_name
是用户可控的,这就给了我们可以利用的地方,上传一个图片马,将保存名字改为upload-19.php/.
。
上传后,拿到图片地址。
直接访问地址即可,访问地址时,后面的/.
加不加都可以,服务器后面是没有这个/.
的,而且在Linux
中也可以成功执行,是最新的 ,这里更正一下,这里不应该是最新的解析漏洞,这里仅仅应该是绕过了黑名单而已。apache
解析漏洞CVE-2017-15715