代码审计 | 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 密钥存储历史演变
-
5.0版本之前:
- 密钥存储在数据库
bairong_Config表的SettingsXML字段 - 8位随机字符串生成
- 结合SQL注入漏洞可获取密钥
- 密钥存储在数据库
-
5.x版本:
- 密钥硬编码在
./SiteFiles/Configuration/Configuration.config - 固定值:
vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5
- 密钥硬编码在
-
6.0+版本:
- 密钥存储在Web根目录的
Web.config - 随机生成:
SecretKey = StringUtils.GetShortGuid()
- 密钥存储在Web根目录的
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)
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的身份认证机制存在多个历史安全缺陷,主要围绕密钥管理和认证逻辑展开。通过深入理解其认证流程和加密机制,可以更好地发现和防范潜在的安全风险。建议开发者关注密钥安全、加强权限验证,并定期进行安全审计。