代码审计 | SiteServerCMS身份认证机制
字数 1725 2025-08-18 11:39:26

SiteServerCMS身份认证机制深度分析与安全教学文档

一、系统概述

SiteServerCMS是一款开源免费的企业级CMS系统,采用前后端分离架构:

  • 后台管理:默认登录地址 http://IP:Port/SiteServer/pageLogin.cshtml
  • 前台内容(含会员):独立登录系统

二、身份认证机制分析

2.1 登录流程

  • 登录请求通过JSON格式提交到 /api/v1/administrators/actions/login
  • 登录失败会增加失败计数
  • 成功登录后生成accessToken用于后续身份认证

2.2 Cookie认证机制

认证Cookie命名规则为"SS+名称":

public const string AuthKeyUserHeader = "X-SS-USER-TOKEN";
public const string AuthKeyUserCookie = "SS-USER-TOKEN";
public const string AuthKeyAdminHeader = "X-SS-ADMIN-TOKEN";
public const string AuthKeyAdminCookie = "SS-ADMIN-TOKEN";

2.3 accessToken生成过程

var accessToken = AdminApi.Instance.GetAccessToken(adminInfo.Id, adminInfo.UserName, expiresAt);

accessToken使用JWT(JSON Web Token)格式:

  • 算法:HS256
  • 密钥:WebConfigUtils.SecretKey
  • 格式:Base64UrlEncode(header).Base64UrlEncode(payload).Base64UrlEncode(signature)
  • 明文示例:{"typ":"JWT","alg":"HS256"}.{"UserId":1,"UserName":"admin","ExpiresAt":"/Date(1583293343684)/"}.哈希摘要

2.4 加密解密机制

  • 加密方法:TranslateUtils.EncryptStringBySecretKey()
  • 解密方法:TranslateUtils.DecryptStringBySecretKey()
  • 加密算法:DES(默认CBC模式)
  • 密钥处理:16位密钥截取前8位使用
  • 固定IV值:byte[] iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

三、安全漏洞分析

3.1 密钥存储历史演变

  1. 5.0版本之前

    • 密钥存储在数据库bairong_Config表的SettingsXML字段
    • 8位随机字符串生成
    • 结合SQL注入漏洞可获取密钥
  2. 5.x版本

    • 密钥硬编码在./SiteFiles/Configuration/Configuration.config
    • 固定值:vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5
  3. 6.0+版本

    • 密钥存储在Web根目录的Web.config
    • 随机生成:SecretKey = StringUtils.GetShortGuid()

3.2 典型漏洞利用

漏洞1:远程文件下载

  • 路径:./SiteServer.BackgroundPages/Ajax/AjaxOtherService.cs
  • 特点:某些AJAX接口无需权限验证,仅依赖加密字符串认证
  • 利用:获取密钥后构造加密下载链接实现远程文件下载

漏洞2:Cookie构造攻击

攻击条件

  1. 5.x版本使用固定密钥
  2. 前台和后台用户表分离但认证机制相似

攻击步骤

  1. 在前台注册与后台管理员同名的用户
  2. 获取前台用户的SS-USER-TOKEN
  3. 修改Cookie名称为SS-ADMIN-TOKEN
  4. 访问后台管理页面实现越权

漏洞3:ID递增预测

  • 管理员ID通常为1或较小整数
  • 结合前台注册可能获取到低ID用户凭证

四、安全加固建议

  1. 密钥管理

    • 定期更换SecretKey
    • 避免使用硬编码密钥
    • 不同环境使用不同密钥
  2. 认证机制

    • 在accessToken中加入更多验证因素
    • 实现双因素认证
    • 增加登录IP限制
  3. 代码层面

    • 对所有管理接口实施严格权限检查
    • 避免使用固定IV值
    • 升级加密算法(如从DES升级到AES)
  4. 系统配置

    • 限制文件下载功能
    • 实施严格的输入验证
    • 启用WAF防护常见攻击

五、加密算法实现示例(Python)

from Crypto.Cipher import DES
import base64

def encrypt(msg, key, iv):
    pad = 8 - len(msg) % 8
    for i in range(pad):
        msg = msg + chr(pad)
    obj = DES.new(key, DES.MODE_CBC, iv)
    buf = obj.encrypt(msg)
    txt = base64.b64encode(buf).decode()
    # 特殊字符替换
    txt = txt.replace('+','0add0').replace('=','0equals0').replace('&','0and0')
    txt = txt.replace('?','0question0').replace("'",'0quote0').replace('/','0slash0')
    txt = txt + '0secret0'  # v6.x特有后缀
    return txt

# 示例使用
iv = bytes([0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF])
key = "vEnfkn16"[:8].encode()  # 5.x固定密钥前8位
encrypted = encrypt("test", key, iv)

六、总结

SiteServerCMS的身份认证机制存在多个历史安全缺陷,主要围绕密钥管理和认证逻辑展开。通过深入理解其认证流程和加密机制,可以更好地发现和防范潜在的安全风险。建议开发者关注密钥安全、加强权限验证,并定期进行安全审计。

SiteServerCMS身份认证机制深度分析与安全教学文档 一、系统概述 SiteServerCMS是一款开源免费的企业级CMS系统,采用前后端分离架构: 后台管理:默认登录地址 http://IP:Port/SiteServer/pageLogin.cshtml 前台内容(含会员):独立登录系统 二、身份认证机制分析 2.1 登录流程 登录请求通过JSON格式提交到 /api/v1/administrators/actions/login 登录失败会增加失败计数 成功登录后生成 accessToken 用于后续身份认证 2.2 Cookie认证机制 认证Cookie命名规则为"SS+名称": 2.3 accessToken生成过程 accessToken使用JWT(JSON Web Token)格式: 算法:HS256 密钥: WebConfigUtils.SecretKey 格式: Base64UrlEncode(header).Base64UrlEncode(payload).Base64UrlEncode(signature) 明文示例: {"typ":"JWT","alg":"HS256"}.{"UserId":1,"UserName":"admin","ExpiresAt":"/Date(1583293343684)/"}.哈希摘要 2.4 加密解密机制 加密方法: TranslateUtils.EncryptStringBySecretKey() 解密方法: TranslateUtils.DecryptStringBySecretKey() 加密算法:DES(默认CBC模式) 密钥处理:16位密钥截取前8位使用 固定IV值: byte[] iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; 三、安全漏洞分析 3.1 密钥存储历史演变 5.0版本之前 : 密钥存储在数据库 bairong_Config 表的 SettingsXML 字段 8位随机字符串生成 结合SQL注入漏洞可获取密钥 5.x版本 : 密钥硬编码在 ./SiteFiles/Configuration/Configuration.config 固定值: vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5 6.0+版本 : 密钥存储在Web根目录的 Web.config 随机生成: SecretKey = StringUtils.GetShortGuid() 3.2 典型漏洞利用 漏洞1:远程文件下载 路径: ./SiteServer.BackgroundPages/Ajax/AjaxOtherService.cs 特点:某些AJAX接口无需权限验证,仅依赖加密字符串认证 利用:获取密钥后构造加密下载链接实现远程文件下载 漏洞2:Cookie构造攻击 攻击条件 : 5.x版本使用固定密钥 前台和后台用户表分离但认证机制相似 攻击步骤 : 在前台注册与后台管理员同名的用户 获取前台用户的 SS-USER-TOKEN 修改Cookie名称为 SS-ADMIN-TOKEN 访问后台管理页面实现越权 漏洞3:ID递增预测 管理员ID通常为1或较小整数 结合前台注册可能获取到低ID用户凭证 四、安全加固建议 密钥管理 : 定期更换SecretKey 避免使用硬编码密钥 不同环境使用不同密钥 认证机制 : 在accessToken中加入更多验证因素 实现双因素认证 增加登录IP限制 代码层面 : 对所有管理接口实施严格权限检查 避免使用固定IV值 升级加密算法(如从DES升级到AES) 系统配置 : 限制文件下载功能 实施严格的输入验证 启用WAF防护常见攻击 五、加密算法实现示例(Python) 六、总结 SiteServerCMS的身份认证机制存在多个历史安全缺陷,主要围绕密钥管理和认证逻辑展开。通过深入理解其认证流程和加密机制,可以更好地发现和防范潜在的安全风险。建议开发者关注密钥安全、加强权限验证,并定期进行安全审计。