通达OA任意文件上传并利用文件包含导致远程代码执行漏洞分析
字数 1351 2025-08-25 22:58:20

通达OA任意文件上传及文件包含漏洞分析与利用

漏洞概述

通达OA系统存在一个组合漏洞,攻击者可以通过绕过身份验证实现任意文件上传,再结合文件包含漏洞最终导致远程代码执行。该漏洞影响多个版本的通达OA系统。

漏洞分析

文件上传漏洞

漏洞入口

文件上传功能位于 /ispirit/im/upload.php,关键代码如下:

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

绕过身份验证的条件

  1. 必须提供 P 参数且不为空
  2. 通过 P 参数控制 session,绕过 auth.php 的身份验证

文件上传参数要求

$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();
}
  1. DEST_UID 参数不能为空
  2. DEST_UID 需要是0-9开头的任意字符串
  3. 如果 DEST_UID=0,则 UPLOAD_MODE 必须为2

文件上传处理

上传功能通过 upload() 函数实现(位于 utility_file.php 第1665行),最终调用 add_attach() 函数(第1854行)处理附件。

文件存储路径

文件存储路径由以下部分组成:

  1. $SYS_ATTACH_PATH_ACTIVE 定义在 utility_file.php 第403行
  2. 实际路径为 $ROOT_PATH . "../attach/"(定义在 td_config.php
  3. 最终路径格式:$PATH/$YM/$ATTACH_ID.$ATTACH_FILE

文件包含漏洞

漏洞入口

文件包含功能位于 /ispirit/interface/url.php(或其他类似文件),关键代码如下:

if ($json) {
    $json = stripcslashes($json);
    $json = (array) json_decode($json);
    
    foreach ($json as $key => $val) {
        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;
        }
    }
    exit();
}

利用条件

  1. 提供 json 参数,包含有效的JSON数据
  2. JSON数据中必须包含 url
  3. url 值必须包含 general/ispirit/module/ 路径

漏洞利用步骤

组合利用方式

  1. 绕过身份验证上传文件

    • /ispirit/im/upload.php 发送POST请求
    • 包含参数:
      • P: 任意非空值(用于绕过身份验证)
      • DEST_UID: 0-9开头的字符串(如"1")
      • UPLOAD_MODE: 1/2/3
      • ATTACHMENT: 恶意文件
  2. 获取上传文件路径

    • 上传成功后,服务器返回包含文件部分路径的响应
    • 完整路径需要结合 $ROOT_PATH 和返回的部分路径构造
  3. 利用文件包含执行代码

    • 向包含漏洞的接口发送请求
    • 包含 json 参数,指向上传的恶意文件
    • 示例JSON: {"url":"attach/路径/恶意文件"}

防御措施

  1. 文件上传修复

    • 严格验证上传文件的类型和内容
    • 实现完整的身份验证机制,不可仅依赖session_id
    • 限制上传文件的可执行权限
  2. 文件包含修复

    • 避免动态包含用户可控的文件路径
    • 如果需要动态包含,应严格限制包含路径范围
    • 实现文件包含的白名单机制
  3. 系统层面

    • 及时更新官方补丁
    • 限制服务器目录访问权限
    • 监控异常文件操作

参考资源

免责声明

本文仅用于安全研究和教育目的,未经授权不得用于非法用途。使用本文所述技术造成的任何后果由使用者自行承担。

通达OA任意文件上传及文件包含漏洞分析与利用 漏洞概述 通达OA系统存在一个组合漏洞,攻击者可以通过绕过身份验证实现任意文件上传,再结合文件包含漏洞最终导致远程代码执行。该漏洞影响多个版本的通达OA系统。 漏洞分析 文件上传漏洞 漏洞入口 文件上传功能位于 /ispirit/im/upload.php ,关键代码如下: 绕过身份验证的条件 必须提供 P 参数且不为空 通过 P 参数控制 session,绕过 auth.php 的身份验证 文件上传参数要求 DEST_UID 参数不能为空 DEST_UID 需要是0-9开头的任意字符串 如果 DEST_UID=0 ,则 UPLOAD_MODE 必须为2 文件上传处理 上传功能通过 upload() 函数实现(位于 utility_file.php 第1665行),最终调用 add_attach() 函数(第1854行)处理附件。 文件存储路径 文件存储路径由以下部分组成: $SYS_ATTACH_PATH_ACTIVE 定义在 utility_file.php 第403行 实际路径为 $ROOT_PATH . "../attach/" (定义在 td_config.php ) 最终路径格式: $PATH/$YM/$ATTACH_ID.$ATTACH_FILE 文件包含漏洞 漏洞入口 文件包含功能位于 /ispirit/interface/url.php (或其他类似文件),关键代码如下: 利用条件 提供 json 参数,包含有效的JSON数据 JSON数据中必须包含 url 键 url 值必须包含 general/ 、 ispirit/ 或 module/ 路径 漏洞利用步骤 组合利用方式 绕过身份验证上传文件 向 /ispirit/im/upload.php 发送POST请求 包含参数: P : 任意非空值(用于绕过身份验证) DEST_UID : 0-9开头的字符串(如"1") UPLOAD_MODE : 1/2/3 ATTACHMENT : 恶意文件 获取上传文件路径 上传成功后,服务器返回包含文件部分路径的响应 完整路径需要结合 $ROOT_PATH 和返回的部分路径构造 利用文件包含执行代码 向包含漏洞的接口发送请求 包含 json 参数,指向上传的恶意文件 示例JSON: {"url":"attach/路径/恶意文件"} 防御措施 文件上传修复 严格验证上传文件的类型和内容 实现完整的身份验证机制,不可仅依赖session_ id 限制上传文件的可执行权限 文件包含修复 避免动态包含用户可控的文件路径 如果需要动态包含,应严格限制包含路径范围 实现文件包含的白名单机制 系统层面 及时更新官方补丁 限制服务器目录访问权限 监控异常文件操作 参考资源 漏洞发现者GitHub: https://github.com/jas502n/OA-tongda-RCE 官方补丁:建议联系通达OA官方获取最新安全更新 免责声明 本文仅用于安全研究和教育目的,未经授权不得用于非法用途。使用本文所述技术造成的任何后果由使用者自行承担。