freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

通达OA任意文件上传和文件包含漏洞导致RCE详细代码审计分析及Poc构造复现
木子 2020-03-19 11:03:23 2026712

Author:Ja0k@SecurityCN

2020-03-19-10-22-41.png

一、事件背景

近日,通达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

2020-03-18-14-03-16.png

根据通达官方的修复说明,需要替换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' 的调用

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

    $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无效。

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

2020-03-18-15-22-49.png

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

2020-03-18-16-12-32.png

我们看下关于文件后缀名的获取方式,是通过strrpos 函数获取.最后一次出现的位置开始到后面的3个字符串,不能为php其实黑名单有很多种方式绕过,比如上传后缀名为.phtml.cpt 等都可以绕过

补丁2:ispirit/interface/gateway.php 文件包含漏洞

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

gateway.php.png
通读修复之前的代码发现,整个流程为foreach循环解析$json,如果$key键等于字符串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 版本 为例2020-03-18-17-49-34.png

第1个漏洞的Poc的构造需要满足四个条件: P非空、DEST_UID非空且为数字、UPLOAD_MODE为1或2或3、ATTACHMENT的filename后缀名不能为php最后构造的Payload如下2020-03-19-09-41-20.png上传了1个文件名为a.phtml的php文件 绕过黑名单检测路径为 attach/im/2003/72566742.a.phtm 但该目录不在webroot下不能直接执行webshell,才需要利用后面的文件包含漏洞跨目录解析

2020-03-19-09-35-20.png
最后RCE成功,有一点需要提醒下,通达OA开启了 disable_funcation 功能 很多常见的命令执行函数如 exec、eval、system等都被禁止了,需要bypass想学习绕过的可以参考: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

# web安全 # 漏洞分析 # php代码审计
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 木子 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
SecurityCN
漏洞复现专栏
木子 LV.3
这家伙太懒了,还未填写个人描述!
  • 11 文章数
  • 6 关注者
活动 | YSRC 六一&端午节活动,双倍&三倍奖励及推荐新人奖等你来!
2023-05-06
[漏洞复现]Apache Druid 远程代码执行漏洞 (CVE-2021-25646)
2021-02-02
CVE-2020-1948Apache Dubbo 反序列化RCE漏洞分析
2020-06-29