freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课
FreeBuf+小程序

FreeBuf+小程序

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

国内领先的互联网安全新媒体,同时也是爱好者们交流与分享安全技术的社区

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

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

本文作者:, 属于FreeBuf原创奖励计划,未经许可禁止转载

# web安全 # 漏洞分析 # php代码审计
被以下专栏收录,发现更多精彩内容
+ 收入我的专栏
评论 按时间排序

登录/注册后在FreeBuf发布内容哦

相关推荐
  • 0 文章数
  • 0 评论数
  • 0 关注者
登录 / 注册后在FreeBuf发布内容哦