代码审计-MetInfo 6.0.0 sql注入漏洞

博客分析了app\\system\\message\\web\\message.class.php文件中的SQL注入漏洞。变量直接拼接在SQL语句中,虽有过滤函数但可绕过。通过寻找定义IN_ADMIN常量的入口,分析调用流程,满足特定条件可构造GET请求注入,还给出数据库中符合条件的参数。

首先漏洞存在于app\system\message\web\message.class.php文件中,变量{$_M[form][id]} 直接拼接在SQL语句中,且验证码检测函数是在SQL语句查询之后,这也就造成了我们可以无视验证码检测函数,进行SQL注入。具体问题函数代码如下:

$met_fd_ok=DB::get_one("select * from {$_M[table][config]} where lang ='{$_M[form][lang]}' and  name= 'met_fd_ok' and columnid = {$_M[form][id]}");

这行中$_M[form][id]}没有被单引号保护拼接在sql语句中,存在安全隐患。我们跟跟踪这个变量看是否有过滤操作。

首先这个类的基类是web

跟进web类,没有对用户传入的数据进行过滤等操作,却初始化了common类

我们继续看看common

common类初始化时调用了表单过滤的函数load_form()

此函数中又调用了过滤SQL注入的函数sqlinsert

那我们来看看这个sqlinsert函数过滤了什么

可以看到sqlinsert函数对sleep关键字进行了处理,但是我们还是可以使用MYSQL中的benchmark函数轻松绕过。当然我们本文绕过的姿势不是用函数绕过这个函数,而是让代码不执行这个过滤的函数来达到绕过。

我们回到daddslashes函数里:

daddslashes()定义在app/system/include/function/common.func.php第51行,对传递的参数进行addslashes()操作。这里注意,在else语句中,如果之前定义了IN_ADMIN常量,进行trim(addslashes(sqlinsert($string)))操作,反之则进行trim(addslashes($string))。

 

之前所述的安全隐患点为int型,所以addslashes()函数没有作用,所以这里主要是要绕过sqlinsert(),需要寻找到定义过IN_ADMIN常量的入口。

这里通过搜索找到了admin/index.php,文件第5行定义了IN_ADMIN常量。接着看从admin/index.php入口文件如何调用add()函数的,index.php定义了4个常量,并且包含了app/system/entrance.php。

进入app/system/entrance.php,38-44行,入口文件没有定义M_TYPE,这里会设置M_TYPE常量为system;54-59行,由于定义了M_TYPE为system,进行设置PATH_OWN_FILE常量为PATH_APP.M_TYPE.'/'. M_NAME.'/'.M_MODULE.'/',其中M_NAME、M_MODULE均可控。88-99行包含app/system/include/class/load.class.php,并调用了module()方法。

由于调用module()方法时缺省了参数,因此$path、$modulename、$action均有之前定义的常量赋值,然后再调用_load_class()方法。_load_class()方法可以引用并实例化一个类,

 

 

action为空的时候,只引用文件。当action为new时候,会实例化这个类。当action为do开头时候,会实例化类,并执行这个方法。


 

那么到这里我们理一下条件:

要想包含app/system/message/web/message.class.php文件,需要满足

M_NAME = $_GET['n'] = message;

M_MODULE = $_GET['m'] = web;

M_CLASS = $_GET['c'] = message;

要想调用add(),必须实例化类并执行方法,但这里限定只能实例化并执行do开头的方法。这里找到了message.class.php中的domessage(),它调用了add()方法。

 

在调用add()方法前,需要满足$this->check_field();,这里发现只要抓取正常的留言参数填充就可以了,验证码的判断是在add()方法中执行完漏洞语句之后。

为了实现布尔注入而不是时间盲注,需要正常时$met_fd_ok的值不为空,从而绕过46行判断,弹出"验证码错误",而异常时$met_fd_ok值为空,弹出"反馈已关闭"。

在数据库中执行一下存在漏洞的SQL语句,看看符合条件的id参数有哪些,满足的columnid有42和44

mysql> select * from met_config where name = 'met_fd_ok' and lang='cn';

+-----+-----------+-------+--------------+----------+---------+------+

| id  | name      | value | mobile_value | columnid | flashid | lang |

+-----+-----------+-------+--------------+----------+---------+------+

| 470 | met_fd_ok | 1     |              |       44 |       0 | cn   |

| 490 | met_fd_ok | 1     |              |       42 |       0 | cn   |

+-----+-----------+-------+--------------+----------+---------+------+

最终可以构造如下GET请求注入,注入点为id:

admin/index.php?m=web&n=message&c=message&a=domessage&action=add&lang=cn¶137=1¶186=1@qq.com¶138=1¶139=1¶140=1&id=42 and 1=1
sqlmap.py -u "192.168.5.172/admin/index.php?m

=web&n=message&c=message&a=domessage&action=add&lang=cn¶137=1¶186=1@qq.com¶138=1¶139=1¶140=1&id=42"

最后附上一个思维导图,更好理解逻辑

 

转载于:https://www.cnblogs.com/-qing-/p/10892022.html

### 关于 Metinfo 6 SQL 注入漏洞的影响范围 Metinfo 的多个版本均受到影响,具体包括但不限于以下版本: - **Metinfo 6.1.0** 版本存在高危的 SQL 注入漏洞,可能导致攻击者伪造恶意 SQL 语句并执行数据库操作[^1]。 - **Metinfo 6.1.3** 版本同样受影响,其原因在于未对某些参数进行充分的安全过滤,允许上传路径被伪造,并可能插入恶意代码或特殊字符[^4]。 - **Metinfo 6.2.0** 同样暴露出类似的 SQL 注入风险,表明此问题在早期版本中普遍存在。 需要注意的是,尽管上述提到的具体版本已确认存在问题,但由于 Metinfo 系统架构相似性较高,其他相近版本也可能潜在受威胁,因此建议全面排查所有低于当前稳定版的旧版本。 ### 漏洞成因分析 漏洞的核心问题是由于程序未能有效验证用户输入数据的有效性和合法性所致。例如,在处理 `id` 参数时,如果缺乏严格的正则表达式校验或其他形式的数据清洗机制,则容易让攻击者构造特定条件下的查询字符串来操控底层 MySQL 数据库的行为[^3]。另外,文件上传功能中的路径控制不当也是引发此类安全隐患的重要原因之一。 ### 解决方案概述 针对以上描述的情况,以下是几种推荐采取的技术措施: #### 方法一:更新至最新补丁版本 官方通常会在发现问题之后尽快发布修正后的软件包或者热修复补丁。对于 Metinfo 用户而言,应立即升级到厂商已经发布的安全性增强型新版本(如适用的话),因为这些更新往往包含了针对最近报告出来的各种缺陷所做的改进工作成果。不过请注意查看发行说明文档以了解确切支持哪些先前遇到过的错误修复情况[^2]。 #### 方法二:手动修改源码实现防护逻辑 当无法即时迁移到较新的发行版上时,可以通过调整现有应用程序内部结构来自行缓解部分危险状况的发生几率。比如可以在接收外部请求之前增加一层额外的身份认证流程;或者是重新设计那些易受侵害的功能模块——像前面提及的文章里所讨论的例子那样,加强对于传入变量值类型的判断力度,拒绝任何不符合预期模式的内容进入后续运算环节之中。 下面给出一段简单的 PHP 脚本来演示如何强化 ID 验证过程: ```php function sanitize_input($data){ $clean_data = htmlspecialchars(trim($data), ENT_QUOTES, 'UTF-8'); return mysqli_real_escape_string($connection,$clean_data); } if(isset($_GET['id'])){ $safe_id=sanitize_input($_GET['id']); }else{ die('Invalid Request!'); } ``` 这段代码片段展示了基本的数据净化方法论,它先去除掉多余的空白符并通过 HTML 实体转换防止 XSS 攻击向量潜伏其中,接着再调用 MySQLi 扩展函数进一步转义可能存在威胁性的单引号等符号组合,从而大大降低了遭受传统手段实施的成功率。 #### 方法三:部署 Web 应用防火墙 (WAF) 除了依赖前端应用层面上做出改变之外,还可以考虑引入专门用于抵御网络层面各类常见攻击方式的产品服务作为辅助防线的一部分。现代 WAF 设备能够识别多种异常行为特征并将它们拦截下来阻止到达目标主机前就完成处置动作,这对于保护老旧系统免遭新兴威胁尤为有用。 ### 结束语 综上所述,解决 Metinfo 6 中存在的 SQL 注入隐患需要综合运用多方面的技术和管理策略才能达到最佳效果。不仅要及时跟踪供应商动态获取必要的技术支持资料指导本地环境改造作业顺利完成外,还应当建立健全定期审查制度确保长期维持较高的整体防御水平状态不变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值