通达OA任意用户登录
漏洞分析
分析文章:https://mp.weixin.qq.com/s/yJuLhC1GxkMbGL0mRORIoA
本地测试版本:2017、v11.3,这两个版本,奇怪的是,在这两个版本的源码当中,都没有找到分析文章当中对CODE_LOGIN.$CODEUID
进行判断的那块代码
漏洞位置:
logincheck_code.php
这里$UID
可控,当$_POST['UID']
为1时,会直接从数据库USER表查询查询系统管理员的信息,然后直接将结果直接赋值给$_SESSION
变量,获取系统管理员登录权限(缺少对CODE_LOGIN.$CODEUID
的判断,导致直接POST传入UID=1即可获取系统管理员登录权限)
漏洞利用
|
|
漏洞检测
访问xxx/logincheck_code.php,若返回{"status":1,"msg":"","url":"general\/index.php?isIE=0"}
的信息,基本可以确定存在漏洞
影响范围还是挺大的,当进入后台后,可以在后台数据库管理的位置通过general_log获取网站的webshell
网站根目录的获取:系统管理->系统参数设置->OA服务设置
2020.4.24补充
终于下载到了通达OAv11.4版本:下载链接
查看漏洞位置logincheck_code.php,对比之前分析的v11.3和2017版本,可以看到增加了对CODE_LOGIN.$CODEUID
的判断:
当$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
存入了缓存并输出
这里就可以通过直接访问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
访问logincheck_code.php,POST传入UID=1和CODEUID=获取到的codeuid,即可获取系统管理员的登录权限