0x01 前言

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

0x02 目录及版本

目录结构

目录名称 用途
attach OA附件文件存放目录
bin Apache、PHP、Zend等主程序及配置文件,服务配置程序等
data5 MySQL数据库文件目录
logs Apache等日志文件目录
MyAdmin 通达OA的MySQL管理工具
mysql5 MySQL主程序文件
nginx Nginx Web应用服务
tmp 临时文件目录
webroot 通达OA的WEB根目录(PHP程序目录)

版本信息

1、/inc/expired.php

2、/inc/reg_trial.php

3、/inc/reg_trial_submit.php

0x03 漏洞-任意文件删除

前提条件:

  • 版本号:= V11.6

/module/appbuilder/assets/print.php

<?php

$s_tmp = __DIR__ . "/../../../../logs/appbuilder/logs";
$s_tmp .= "/" . $_GET["guid"];

if (file_exists($s_tmp)) {
    $arr_data = unserialize(file_get_contents($s_tmp));
    unlink($s_tmp);
    $s_user = $arr_data["user"];
}
else {
    echo "未知参数";
    exit();
}

审计代码可以发现unlink函数中的存在变量$s_tmp,溯源变量$s_tmp

$s_tmp开始值为魔术常量__DIR__拼接字符串/../../../../logs/appbuilder/logs,魔术常量__DIR__指向当前执行的PHP脚本所在的目录。

1、例如web路径为C:\wwwroot\webroot\

2、此处魔术常量__DIR__即为C:\wwwroot\webroot\module\appbuilder\assets

3、拼接后的$s_tmp值为
C:\wwwroot\webroot\module\appbuilder\assets/../../../../logs/appbuilder/logs

然后$s_tmp拼接了GET请求参数guid导致了变量可控。下面只利用file_exists函数判断了文件是否存在然后将变量$s_tmp带入了unlink函数中进行了执行,从而造成了任意文件删除漏洞。

漏洞演示

删除/module/appbuilder/assets/目录下文件test.txt

?guid=../../../webroot/module/appbuilder/assets/test.txt

0x04 漏洞-任意用户文件上传

前提条件:

  • 后台权限
  • 版本号:< V11.7

/general/data_center/utils/upload.php

if ($action == "upload") {
    if ($filetype == "xls") {
            code
        }
    }
    else if ($filetype == "img") {
            code
    }
    else {
        code
    }

    @unlink($_FILES["FILE1"]);
}

当我们设置$action为upload,$filetype不为xls和img时,程序来到了else{}代码块。

$uploaddir = MYOA_ATTACH_PATH . "/data_center/attachment/";

在else{}代码块中,首先定义了$uploaddir变量用来存放上传目录路径。

if (!is_dir(MYOA_ATTACH_PATH . "/data_center/attachment")) {
    if (!is_dir(MYOA_ATTACH_PATH . "/data_center")) {
        mkdir(MYOA_ATTACH_PATH . "/data_center");
    }

    mkdir(MYOA_ATTACH_PATH . "/data_center/attachment");
}

然后检查了上传目录文件夹是否存在,不存在就创建。

if (isset($from_rep)) {
    code
}
else {
    $s_n = $_FILES["FILE1"]["name"];

    if ($s_n[0] != "{") {
        $s_n = $repkid . "_" . $s_n;
    }

    if (move_uploaded_file($_FILES["FILE1"]["tmp_name"], $uploaddir . $s_n)) {
    }
}

接着检查变量$from_rep是否设置,这里我们不传入变量$from_rep,让程序执行逻辑进入else {}代码块,$s_n变量存放了传入的文件名,然后判断了文件名第一位是否为字符串{,不是就将传入的变量$repkid与文件名进行拼接。最后将其带入到move_uploaded_file函数中移动到指定位置。

0x05 组合拳

/general/data_center/utils/upload.php中程序包含了inc/auth.inc.php进行权限认证。

include_once "inc/auth.inc.php";

利用任意文件删除漏洞删除inc/auth.inc.php

?guid=../../../webroot/inc/auth.inc.php

即可前台上传文件获取到服务器权限。

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖