c1ay's blog

通达OA任意用户登录

字数统计: 593阅读时长: 2 min
2020/04/22 Share

通达OA任意用户登录

漏洞分析

分析文章:https://mp.weixin.qq.com/s/yJuLhC1GxkMbGL0mRORIoA

本地测试版本:2017、v11.3,这两个版本,奇怪的是,在这两个版本的源码当中,都没有找到分析文章当中对CODE_LOGIN.$CODEUID进行判断的那块代码

mark

漏洞位置:

logincheck_code.php
mark

这里$UID可控,当$_POST['UID']为1时,会直接从数据库USER表查询查询系统管理员的信息,然后直接将结果直接赋值给$_SESSION变量,获取系统管理员登录权限(缺少对CODE_LOGIN.$CODEUID的判断,导致直接POST传入UID=1即可获取系统管理员登录权限)

mark

漏洞利用

1
2
3
4
5
6
xxx/logincheck_code.php
POST:UID=1
之后访问xxx/general/index.php即可获取系统管理员权限

mark

mark

mark

漏洞检测

访问xxx/logincheck_code.php,若返回{"status":1,"msg":"","url":"general\/index.php?isIE=0"}的信息,基本可以确定存在漏洞
mark

影响范围还是挺大的,当进入后台后,可以在后台数据库管理的位置通过general_log获取网站的webshell

网站根目录的获取:系统管理->系统参数设置->OA服务设置

2020.4.24补充

终于下载到了通达OAv11.4版本:下载链接

查看漏洞位置logincheck_code.php,对比之前分析的v11.3和2017版本,可以看到增加了对CODE_LOGIN.$CODEUID的判断:
mark

$login_codeuid = TD::get_cache("CODE_LOGIN" . $CODEUID);不存在或者为空时,会输出{"status":0,"msg":"参数错误","url":"general\/index.php?isIE=0"}并退出程序,所以这里如果想登录,除了需要POST传入UID=1以外,还需要传入CODEUID

全局查找CODE_LOGIN,在general/login_code.php当中,程序通过$login_codeuid = getUniqid();生成了CODE_LOGIN存入了缓存并输出
mark

这里就可以通过直接访问general/login_code.php获取缓存当中的CODE_LOGIN,通过获取到的CODE_LOGIN绕过logincheck_code.php的判断,获取系统管理员的登录权限

v11.4版本漏洞检测及利用

直接访问logincheck_code.php,如果返回{"status":0,"msg":"\u53c2\u6570\u9519\u8bef\uff01","url":"general\/index.php?isIE=0"},则说明有可能存在漏洞

请求/general/login_code.php,获取codeuid
mark

访问logincheck_code.php,POST传入UID=1和CODEUID=获取到的codeuid,即可获取系统管理员的登录权限
mark

mark

CATALOG
  1. 1. 通达OA任意用户登录
    1. 1.0.1. 漏洞分析
    2. 1.0.2. 漏洞利用
    3. 1.0.3. 漏洞检测
    4. 1.0.4. 2020.4.24补充
    5. 1.0.5. v11.4版本漏洞检测及利用