MKCMS代码审计小结
字数 1523 2025-08-25 22:58:34
MKCMS V6.2 代码审计与漏洞分析教学文档
0x00 系统概述
MKCMS 是一款开源影视CMS系统,版本6.2存在多个安全漏洞。本教学文档将详细分析这些漏洞的原理、利用方式及修复建议。
0x01 全局过滤分析
文件路径: /system/library.php
- 系统使用
addslashes()对所有输入参数进行转义 - 注意点:
$_SERVER变量未被过滤,可能存在安全隐患
0x02 验证码重用漏洞
文件路径: /admin/cms_login.php
漏洞原理
- 验证码比较逻辑:
if($_SESSION['verifycode'] != $_POST['verifycode']) {
alert_href('验证码错误','cms_login.php');
}
- 验证码仅在
/system/verifycode.php中赋值 - 当验证码错误时,通过JS跳转刷新页面
- 使用Burp Suite等工具不解析JS,可绕过验证码刷新机制
漏洞利用
- 使用Burp Suite截获请求
- 重复使用同一验证码进行暴力破解
- 验证码形同虚设
修复建议
- 每次验证后无论成功与否都应重置验证码
- 增加验证码使用次数限制
- 使用更安全的验证码机制
0x03 前台SQL注入漏洞
漏洞1: /ucenter/repass.php
漏洞原理:
$username = stripslashes(trim($_POST['name']));
$email = trim($_POST['email']);
$query = mysql_query("select u_id from mkcms_user where u_name='$username' and u_email='$email'");
- 全局使用
addslashes()转义 - 但此处使用
stripslashes()去除了转义 - 导致SQL注入漏洞
利用方式:
- 构造恶意用户名或邮箱参数
- 使用SQLMap自动化检测:
sqlmap -u "http://target/ucenter/repass.php" --data="name=test&email=test" --level=3
漏洞2: /ucenter/active.php
漏洞原理:
$verify = stripslashes(trim($_GET['verify']));
$query = mysql_query("select u_id from mkcms_user where u_question='$verify'");
SQLMap检测结果:
[INFO] GET parameter 'verify' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable
[INFO] GET parameter 'verify' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
漏洞3: /ucenter/reg.php
漏洞原理:
$username = stripslashes(trim($_POST['name']));
$query = mysql_query("select u_id from mkcms_user where u_name='$username'");
修复建议
- 统一输入过滤机制,避免部分参数去除转义
- 使用预处理语句(PDO)替代直接拼接SQL
- 对特殊字符进行严格过滤
- 最小化数据库操作权限
0x04 任意用户密码找回漏洞
文件路径: /ucenter/repass.php
漏洞原理
- 仅验证用户名和邮箱匹配:
$query = mysql_query("select u_id from mkcms_user where u_name='$username' and u_email='$email'");
- 验证通过后直接重置密码:
$password = mt_rand(10000, 99999);
$query = mysql_query("update mkcms_user set u_pwd='$password' where u_name='$username'");
- 密码范围仅90000种可能(10000-99999)
漏洞利用
- 结合验证码重用漏洞
- 暴力破解重置后的密码
- 可在短时间内枚举所有可能密码
修复建议
- 增加密码重置令牌机制
- 限制密码重置频率
- 使用更复杂的临时密码生成算法
- 强制用户在首次登录后修改密码
0x05 备份文件路径可猜解
文件路径: /admin/cms_backup.php
漏洞原理
- 备份文件路径固定:
$filename = "../backupdata/" . DATA_NAME . ".sql";
DATA_NAME默认为movie- 备份文件可直接访问:
/backupdata/movie.sql
漏洞利用
- 直接访问备份文件下载数据库
- 可能包含敏感信息如管理员凭证
修复建议
- 随机化备份文件名
- 限制备份目录访问权限
- 增加身份验证机制
- 对备份文件进行加密
0x06 前台文件上传漏洞
文件路径: /editor/php/upload_json.php
漏洞原理
- 允许上传的文件类型:
$ext_arr = array(
'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'),
'flash' => array('swf', 'flv'),
'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),
'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2', '7z'),
);
- 通过
dir参数控制上传类型 - 可上传HTML等可能包含XSS的文件
漏洞利用
示例请求:
POST /editor/php/upload_json.php?dir=file HTTP/1.1
Host: localhost
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryni3BwmVzIUwKfSSC
------WebKitFormBoundaryni3BwmVzIUwKfSSC
Content-Disposition: form-data; name="imgFile"; filename="1.jpg.html"
Content-Type: application/octet-stream
11111111
------WebKitFormBoundaryni3BwmVzIUwKfSSC
Content-Disposition: form-data; name="upload"
Send
------WebKitFormBoundaryni3BwmVzIUwKfSSC--
修复建议
- 严格限制可上传文件类型
- 对上传文件内容进行检查
- 存储上传文件时重命名
- 设置适当的文件权限
0x07 综合安全建议
-
输入验证:
- 统一输入过滤机制
- 避免使用
stripslashes()去除转义 - 对特殊字符进行严格过滤
-
会话安全:
- 加强验证码机制
- 实现CSRF防护
-
数据库安全:
- 使用预处理语句
- 最小化数据库账户权限
-
文件安全:
- 限制敏感文件访问
- 加强上传文件验证
-
密码安全:
- 使用强密码策略
- 实现安全的密码重置机制
-
日志与监控:
- 记录安全相关操作
- 实现异常行为监控
通过全面修复这些漏洞,可显著提升MKCMS系统的安全性。建议开发者参考OWASP等安全标准进行全面的安全加固。