Author:Ja0k@SecurityCN
一、事件背景
近日,通达OA在官方论坛发布了紧急通知,提供了针对部分用户反馈遭到勒索病毒攻击的安全加固程序。根据公告,遭受攻击的OA服务器首页被恶意篡改,伪装成OA系统错误提示页面让用户下载安装插件,同时服务器上文件被勒索病毒重命名加密,论坛中有多个用户反馈中招(具体现象为:主页被篡改、站点文件扩展名被修改、并生成一个勒索提示文本文件),论坛地址:http://club.tongda2000.com/forum.php?mod=viewthread&tid=128367&extra=page%3D1
通过在v11.3版本的测试发现全版本的任意文件上传漏洞结合v11版本的文件包含漏洞可以造成远程命令执行,默认为System权限,恶意攻击者可以成功上传Webshell后门,并进一步释放勒索病毒,危害较大。
二、漏洞信息
| 漏洞名称 | 通达OA任意文件上传漏洞 |
|---|---|
| CVE编号 | – |
| 影响范围 | 通达OA 2013/2013增强/2015/2016/2017/v11版本 |
| 威胁等级 | 高危 |
| 公开时间 | 2020年3月13日 |
| 漏洞名称 | 通达OA文件包含漏洞 |
|---|---|
| CVE编号 | – |
| 影响范围 | 通达OA v11版本 |
| 威胁等级 | 高危 |
| 公开时间 | 2020年3月13日 |
三、漏洞分析
3.1 补丁对比
http://www.tongda2000.com/news/673.php
根据通达官方的修复说明,需要替换MYOA\webroot下的文件下载官方发布的所有版本的补丁分析后发现:2013/2013增强/2015/2016/2017版本的补丁只有1个文件ispirit\im\upload.php;v11版本的的补丁文件与此次漏洞相关的有ispirit\im\upload.php 和ispirit/interface/gateway.php 等多个文件,所以v11 版本同时受2个漏洞的影响,其他版本暂不确定。
本次分析以通达v11 版本 为例
- 注意:通达OA的php文件采用的是zend54 加密,可以使用 SeayDzend工具进行解密,工具下载地址见附录
#补丁1: ispirit\im\upload.php 任意文件上传漏洞
对比补丁前后发现 主要是为了修复未登录任意上传文件,有2处更改首先第1处,就是关于登陆验证文件’./auth.php’ 的调用

$time = time();
$sql = 'select * from im_recent where ((from_id = \'' . $_SESSION['LOGIN_UID'] . '\' and to_id = \'' . $DEST_UID . '\') or (from_id = \'' . $DEST_UID . '\' and to_id = \'' . $_SESSION['LOGIN_UID'] . '\')) and type = \'1\'';
$cursor = exequery(TD::conn(), $sql);
if (0 < mysql_num_rows($cursor)) {
$sql1 = 'UPDATE im_recent SET update_time = \'' . $time . '\' WHERE ((from_id = \'' . $_SESSION['LOGIN_UID'] . '\' and to_id = \'' . $DEST_UID . '\') or (from_id = \'' . $DEST_UID . '\' and to_id = \'' . $_SESSION['LOGIN_UID'] . '\')) and type = \'1\'';
exequery(TD::conn(), $sql1);
} else {
$sql2 = 'INSERT INTO im_recent (from_id,to_id,update_time,type) VALUES (\'' . $_SESSION['LOGIN_UID'] . '\',\'' . $DEST_UID . '\',\'' . $time . '\',\'1\')';
exequery(TD::conn(), $sql2);
}
分析完补丁之后我们来整体分析下存在漏洞upload.php 文件的逻辑
1.先判断\$P 参数是否存在调用Session和 auth登录认证,当\$P非空时此处可以绕过auth.php登录验证2.判断\$DEST_UID是否为空;其次如果DEST_UID 中存在有,,则通过intval获取整数值;最后当$DEST_UID=0时,UPLOAD_MODE要为2 否接收方ID无效。


我们看下关于文件后缀名的获取方式,是通过strrpos 函数获取.最后一次出现的位置开始到后面的3个字符串,不能为php,其实黑名单有很多种方式绕过,比如上传后缀名为.phtml,.cpt 等都可以绕过
补丁2:ispirit/interface/gateway.php 文件包含漏洞
通过对比v11.3版本的补丁中gateway.php前后代码发现 第47行后面,增加了对url地址种的..符号的判断,防止用户读取其他目录文件。

url ,则$url={\$key所对应的值},如果$url非空则调用 ,且数据中包含’general/’ or ‘ispirit/’or ‘module/’时,就会调用include_once对$url进行包含。
if ($json) {
$json = stripcslashes($json);
$json = (array) json_decode($json);
foreach ($json as $key => $val ) {
if ($key == "data") {
$val = (array) $val;
foreach ($val as $keys => $value ) {
$keys = $value;
}
}
if ($key == "url") {
$url = $val;
}
}
if ($url != "") {
if (substr($url, 0, 1) == "/") {
$url = substr($url, 1);
}
if ((strpos($url, "general/") !== false) || (strpos($url, "ispirit/") !== false) || (strpos($url, "module/") !== false)) {
include_once $url;
}
}
那么就可以在url中传入../ 进行跨目录,从而可以包含第1个漏洞上传的php文件,造成RCE
四、漏洞复现
*本次复现以通达OAv11.3 版本 为例
第1个漏洞的Poc的构造需要满足四个条件: P非空、DEST_UID非空且为数字、UPLOAD_MODE为1或2或3、ATTACHMENT的filename后缀名不能为php最后构造的Payload如下
a.phtml的php文件 绕过黑名单检测路径为 attach/im/2003/72566742.a.phtm 但该目录不在webroot下不能直接执行webshell,才需要利用后面的文件包含漏洞跨目录解析

https://www.cnblogs.com/-qing-/p/10944118.html
五、修复建议
官方提供了以下可能受到影响的版本的补丁:2013版、2013增强版、2015版、2016版、2017版、V11版本下载地址:
V11版:http://cdndown.tongda2000.com/oa/security/2020_A1.11.3.exe
2017版:http://cdndown.tongda2000.com/oa/security/2020_A1.10.19.exe
2016版:http://cdndown.tongda2000.com/oa/security/2020_A1.9.13.exe
2015版:http://cdndown.tongda2000.com/oa/security/2020_A1.8.15.exe
2013增强版:http://cdndown.tongda2000.com/oa/security/2020_A1.7.25.exe
2013版:http://cdndown.tongda2000.com/oa/security/2020_A1.6.20.exe
六、附录
本次分析及复现的相关工具地址
https://github.com/SecurityCN/Vulnerability-analysis/tree/master/通达OA3月漏洞
参考:
*http://club.tongda2000.com/forum.php?mod=viewthread&tid=128377&extra=page%3D1
*https://www.webshell.cc/6379.html
*https://www.cnblogs.com/-qing-/p/10944118.html
来源:freebuf.com 2020-03-19 11:03:23 by: 木子












