一、content-type绕过
contenent-type
有些上传模块,会对http的类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务器是通过ent-type判断类型,content-type在客户端可被修改,则此文件上传也有被绕过的风险!
源代码分析
upload-labs pass-02
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
}
}
关键代码
if (($_FILES['upload_file']['type'] == 'image/jpeg') ||
($_FILES['upload_file']['type'] == 'image/png') ||
($_FILES['upload_file']['type'] == 'image/gif'))
在后端检测了上传文件的content-type是不是图片格式,也就是说,我们前面用的删掉前端函数,直接上传方式是用不了的,我们需要发送数据包中的content-type为image/png
绕过方式
①修改脚本后缀,上传,抓包中修改后缀(因为上传的就是图片,所以content-type就是image/png)
②直接上传脚本,抓包中直接修改conent-type
尝试绕过
还是先清空前面上传的文件
尝试上传test.php
①修改后缀上传
可以看到content-type就是image/png,这时候我们直接修改后缀即可
上传成功
②直接上传脚本修改content-type
修改content-type 为 image/png
上传成功
二、黑名单绕过
黑名单
上传模块,有时候会加入黑名单限制,在上传文件的时候获取后缀名,再把后缀名与程序中黑名单进行检测,如果后缀名在黑名单的列表内,将禁止文件上传
代码分析
upload-labs pass03
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
$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)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
}
}
分析一下代码,其中$deny_ext是一个数组,里面存放着需要被检测的后缀名,即黑名单
$file_ext进行处理提取后缀名并转为小写
in_array($file_ext, $deny_ext)
判断$file_ext是否在$deny_ext中,即后缀名是否在黑名单中
后缀名不在黑名单中时,才进行上传操作
绕过方法
尝试其他的后缀名,如该题屏蔽了asp、aspx、php、jsp,我们可以使用如asa、cer、ashx、phtml文件,但要确保服务器可以执行该类型文件
这里屏蔽的asp 那asa cer cdx 大概率是可以使用的,如果网站允许.net执行ashx可以代替aspx
在不同的中间件中有特殊的情况,有点apache版本会默认开启AddType application/x-httpd-php .php .php3 .phtml,将后缀名为phtml、php3的文件解析成php文件
尝试绕过
我们尝试将脚本文件改为phtml后缀上传
上传成功访问一下
这啥都没有啊
查看一下配置文件
可以看到这里没有默认开启,而是被注释掉了,导致我们上传的文件无法被执行
我查阅了一下其他大佬的通关秘籍,发现这里都是直接把这个注释打开,那咱也打开
重启phpstudy再次访问
可以看到成功访问到了!
版权归原作者 白帽Chen_D 所有, 如有侵权,请联系我们删除。