大华智慧园区综合管理平台审计
字数 2660 2025-10-01 14:05:52
大华智慧园区综合管理平台安全审计与漏洞分析
1 系统概述
大华智慧园区综合管理平台是由大华技术股份有限公司开发的综合管理解决方案,采用模块化设计和开放式架构,支持云端部署和移动端访问。平台提供园区管理、安全监控和资源优化等功能。
FOFA指纹: "/WPMS/asset/lib/gridster/"
2 项目架构分析
2.1 技术栈特点
- 多项目集成架构,目录结构复杂
- 混合技术框架:
- Struts2二次开发版本
- 传统Spring MVC架构
- 前后端设计:
- 后端Controller处理逻辑
- 前端使用Freemarker模板引擎
- 不同模块有独立web.xml配置
2.2 审计注意事项
- 每个目录下的接口需要单独分析鉴权机制
- 不同架构的接口触发路由存在差异
- 需重点关注各模块的权限验证逻辑
3 鉴权机制深度分析
3.1 face模块鉴权
3.1.1 拦截器配置
在SpringMVCConfig.java中配置了RequestInterceptor拦截器:
// 通过请求头获取登录信息
String token = request.getHeader("token");
String userId = request.getHeader("userId");
String subSystemCode = request.getHeader("subSystemCode");
// 获取请求URL
String url = request.getRequestURI();
// 白名单验证逻辑
for (String excludeUrl : excludeUrls) {
if (PatternMatchUtils.simpleMatch(excludeUrl, url)) {
return true; // 放行
}
}
3.1.2 白名单机制
excludeUrls通过commonApi.getExcludeUrls()方法获取- 配置文件路径:
api.properties - 使用
PatternMatchUtils.simpleMatch进行模糊匹配
3.1.3 绕过技术分析
PatternMatchUtils.simpleMatch方法逻辑:
// 简化的匹配逻辑
if (pattern.indexOf('*') == -1) {
return pattern.equals(str); // 完全匹配
}
// 包含通配符的复杂匹配
// 可利用"/白名单*/../admin/info"构造绕过路径
3.1.4 令牌验证机制
// 构造验证接口
String validateUrl = this.wpmsUrl + "/spi/v1/ses/keep/" + token;
// 令牌有效性验证
CommonResult result = RestTemplateUtil.validToken(validateUrl);
if (result == null || !result.getResult().isSuccess()) {
// 验证失败处理
}
3.2 publishing模块鉴权
3.2.1 Filter配置
在web.xml中配置鉴权Filter,关键逻辑:
// 获取用户信息
String stoken = request.getParameter("stoken");
String userId = request.getParameter("userId");
String userName = request.getParameter("userName");
// 基础验证
if (StringUtils.isNotBlank(stoken) &&
StringUtils.isNotBlank(userId) &&
StringUtils.isNotBlank(userName)) {
// 创建UserToken对象
UserToken userToken = new UserToken();
userToken.setStoken(stoken);
userToken.setUserId(userId);
userToken.setUserName(userName);
// 存储到Session
session.setAttribute("_user_token_", userToken);
}
// URL放行规则:包含"/publishing/publishing/"的路径
if (PatternMatchUtils.simpleMatch("*/publishing/publishing/*", url)) {
chain.doFilter(request, response);
return;
}
3.2.2 文件类型检查
// 文件类型白名单验证
String extension = null;
int dotIndex = url.lastIndexOf('.');
if (dotIndex > -1) {
extension = url.substring(dotIndex + 1);
}
if (fileTypeList.contains(extension)) {
// 放行特定文件类型
}
3.2.3 绕过技术
可尝试构造特殊路径:/publishing/admin/info;.js
3.3 WPMS模块鉴权
3.3.1 三重放行机制
- 静态资源放行(行49)
- URL白名单放行(行56)
- Session令牌验证放行(行62)
// Session令牌检查
Object token = session.getAttribute("_session_custom_token_");
Object clientToken = session.getAttribute("_session_custom_token_client_");
if (token != null || clientToken != null) {
chain.doFilter(request, response);
return;
}
4 SQL注入漏洞分析
4.1 漏洞定位方法
- 搜索MyBatis的
${}拼接写法 - 查找字符拼接(
+,append等)操作
4.2 漏洞点详情
4.2.1 第一处:Material分页查询
- 文件:
publishing_material_mapper.xml - 方法:
getMaterialPageByCombinedCondition - 注入参数:
sortBy,sortOrder - 调用链:
MaterialController.getMaterialPageBySingleConditionmaterialService.getMaterialPageByCombinedCondition
- 参数来源:
ConditionVO对象(String类型)
4.2.2 第二处:Player分页查询
- 文件:
publishing_player_mapper.xml - 方法:
getPlayerPageBySingleCondition - 注入参数:
sortBy,sortOrder - 调用链:
PlayerController.getPlayerPageBySingleConditionplayerService.getPlayerPageBySingleCondition
- 参数来源:
ConditionVO对象(String类型)
4.2.3 第三处:JDBC附件查询
- 文件:
AttachmentDaoImpl.java - 方法:
getAttachmentListBySearchBean - 注入参数:
bean.RecId - 调用链:
AttachmentManagerImpl.clearTmpFileJsonAttachmentAction.clearTempFile
- 路由配置:Struts2参数绑定
5 文件上传漏洞分析
5.1 视频文件上传漏洞
5.1.1 漏洞位置
- 文件:
MaterialController.java - 方法:
addVideoFile
5.1.2 漏洞详情
// 转换Multipart请求
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
// 获取文件数据
MultipartFile file = multipartRequest.getFile("Filedata");
// 构建文件对象
MaterialFile materialFile = buildMaterialFile(file);
// 处理文件上传
materialService.addVideoFile(materialFile);
5.1.3 上传流程
- 获取原始文件名
- 设置目录为
VIDEO - 调用
fileManageService.sendFile - 使用
FileUtil.writeBytes写入文件 - 漏洞特点:文件后缀和内容完全可控
5.2 图片文件上传漏洞
5.2.1 漏洞位置
- 文件:
MaterialController.java - 方法:
addImageFile
5.2.2 漏洞详情
// 转换Multipart请求
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
// 获取文件数据
MultipartFile file = multipartRequest.getFile("file");
// 构建文件对象
MaterialFile materialFile = buildMaterialFile(file);
// 处理文件上传
materialService.addImageFile(materialFile);
5.2.3 上传流程
- 获取原始文件名
- 设置目录为
IMAGE - 调用
fileManageService.sendFile - 使用
FileUtil.writeBytes写入文件 - 漏洞特点:文件后缀和内容完全可控
6 任意文件读取漏洞
6.1 漏洞位置
- 文件:
AttachmentAction.java - 方法:
downloadByUrlAtt
6.2 漏洞详情
// 设置编码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 构建文件路径
String filePath = ... // 从参数获取
// 文件名提取
String name = filePath.substring(filePath.lastIndexOf("/") + 1);
if (name.contains("?")) {
name = name.substring(0, name.indexOf("?"));
}
// 编码转换
filePath = new String(filePath.getBytes("ISO-8859-1"), "UTF-8");
// 文件下载
InputStream fis = new URL(filePath).openStream();
OutputStream fos = response.getOutputStream();
// 设置响应头
response.setHeader("Content-Disposition", "attachment;filename=" + name);
6.3 参数注入点
filePath通过Struts2参数绑定到AttachmentAction- 路由配置允许直接参数传递
7 Fastjson反序列化漏洞
7.1 漏洞位置
- 文件:
SwingCardRecordController.java - 方法:
deleteFtp
7.2 漏洞详情
// 反序列化操作
JSON.parseObject(ftpUrl); // ftpUrl为路由绑定参数
7.3 环境信息
- Fastjson版本:1.2.44(存在通杀漏洞)
- 攻击向量:通过
ftpUrl参数注入恶意JSON数据
8 修复建议
8.1 鉴权机制加固
- 统一鉴权逻辑,避免各模块独立实现
- 使用严格的路径匹配而非模糊匹配
- 加强Token验证机制,避免伪造
8.2 SQL注入防护
- 将MyBatis的
${}写法改为#{}预编译 - 对排序字段等动态参数使用白名单验证
- 避免直接拼接SQL语句
8.3 文件上传安全
- 实施严格的文件类型验证(MIME类型+后缀名)
- 设置文件上传目录不可执行
- 对上传文件进行重命名处理
8.4 反序列化防护
- 升级Fastjson到最新安全版本
- 使用SafeMode防护机制
- 避免直接反序列化用户输入
8.5 文件读取防护
- 实施路径遍历检查
- 限制文件读取目录范围
- 对用户输入进行严格过滤
9 总结
大华智慧园区综合管理平台存在多处安全漏洞,主要集中在权限绕过、SQL注入、文件上传和反序列化等方面。建议立即进行安全加固,特别是统一鉴权机制、修复SQL注入点和文件上传漏洞,以提升系统整体安全性。