0x00 判断是什么限制
先上传一个shell试一下是什么报错,一般来说我们可以根据报错去判断这个上传漏洞是黑名单还是白名单限制,一般来说,显示只能jpg,png等文件上传的多为白名单上传漏洞,如果是显示后缀名不合法的话,那么有可能是黑名单漏洞。
从报错来看,大概是白名单。当然,并不能很肯定,我们查看一下源码去判断是什么限制:
$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '文件类型不正确,请重新上传!'; } } else { $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!'; } }
从上面的代码可以看出,它是根据文件类型去判断的,即Content-Type限制,我们可以抓一下包看一下。
所谓Content-Type限制就是:有些上传模块,会对 http 的类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败 。因为服务端是通过 content-type 判断类型,content-type 在客户端可被修改。则此文件上传也有可能被绕过的风险。
0x01 绕过限制上传文件
在发现是content-type限制之后,我们抓包修改一下类型头再重新发送即可,content-type的相应名称在https://www.runoob.com/http/http-content-type.html中可以看到。
根据源码我们可以看出,将content-type修改为:image/png 即可。
修改之后我们进行发送尝试,回到靶场发现文件上传成功后,我们就可以试着用蚁剑连接一下,判断是否被清除,并为下一步进行打算。
0x02 总结
Content-Type类型是比较简单的一种,当然,upload-labs的前几关都是比较基础的绕过方法,慢慢掌握好,以后实战的时候才不会束手无策,当然,代码基础也要打牢,不然有的时候上传漏洞的代码都看不懂。
本文作者为J1angL1,转载请注明。