通达oa2019服务器性能提升,通达OA 2019漏洞分析

通达OA 2019漏洞分析

0x01 概述

该漏洞被黑产利用,用于投放勒索病毒,根据厂商补丁,进行相关漏洞分析工作。

0x02 漏洞分析

任意文件上传

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

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

1

2

3

4

5

6

7

8$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”] 搞定,这里也不多赘述了。

1

2

3

4

5

6

7$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 函数进行处理,这里的文件上传的 name 为name="ATTACHMENT"

1

2

3

4

5

6

7

8if (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 这个方法针对上传的文件名进行判断。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15function 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文件。

1

2

3

4

5

6

7

8

9

10

11function 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;

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15if ($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 上传之后,这里可以看到1436405170|shell.jpg这个内容,那么它对应的文件名是1436405170.shell.jpg

db28b8b0834eddbb2a1c64be3e2954a8.png

然后尴尬的事情发生了,上传的文件即使不能是PHP也不在web目录下,它的路径是/attach/im/2003/filename。

7a24a64eaf2c82535a971cfc5797f774.png

文件包含

也就是说上面的漏洞要达到RCE的目的,还需要一个文件包含,包含点从补丁上找找,是这个ispirit/interface/gateway.php。

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

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

27if ($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一下,整个过程非常的简单。

230c716b42f897a0dd462793227fe450.png

0x03 漏洞修复

修复的话,到这里下补丁就好了,这套系统漏洞贼多,有兴趣的可以看看,代码是PHP zend 5.4加密的,百度一下就能解开了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值