0x00 判断文件上传限制
首先上传一个php文件尝试一下能否上传,可以发现,网页弹出的是不允许xxx上传,证明是黑名单限制,但是并没有全部限制完,那么我们这时候可以选择大小写绕过,或者同类型文件如phtml,php3这种类型的文件进行绕过。当然,我们还需要再去检查一下代码看一下有没有其他限制。
$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 . '文件夹不存在,请手工创建!'; } }
从代码里面我们可以看出来,大小写绕过是不行的,因为其中strtolower函数将我们的文件后缀名全部改为了小写,因此不能使用大小写绕过,我们尝试一下同类型文件名解析。
在 iis 里 asp 禁止上传了,可以上传 asa cer cdx 这些后缀,如在网站里允许.net执行 可以上传 ashx 代替 aspx。如果网站可以执行这些脚本,通过上传后门即可获取 webshell。在不同的中间件中有特殊的情况,如果在 apache 可以开启 application/x-httpd-php,在 AddType application/x-httpd-php .php .phtml .php3中,后缀名为 phtml 、php3 均被解析成 php 。有的 apache 版本默认就会开启。上传目标中间件可支持的环境的语言脚本即可,如.phtml、php3。
那么我们绕过就比较简单了,查找一下网站/靶场的中间件,然后根据相应中间件进行一下判断用哪些同类型文件进行解析绕过。
0x01 绕过文件上传限制
根据中间件进行操作判断,这里靶场中间件的服务器是apache的,那么我们就可以尝试一下php3和phtml解析为php进行一次绕过,我们先将shell文件后缀名改为php3尝试一下。
我们可以看出,将后缀改为php3的话是能够成功上传的,那么我们尝试一下使用蚁剑进行连接,如果成功那么就可以进行后续操作。
可以看出成功上传,并且php3也被成功解析为php文件,可以进行连接。
0x02 总结
我们在文件上传的时候如果碰到黑名单限制,但是并没有将同类型的限制的话,我们可以尝试一下寻找中间件的解析漏洞,尝试上传同类型文件,之后进行连接尝试。
本文作者为J1angL1,转载请注明。