dotCMS是全球知名的基于Java的开源内容管理系统,提供社区版,可免费下载使用。此外还提供企业版,可以按年或月订阅使用。近日发现dotCMS爆出高危漏洞SI-62:
漏洞在 versions 22.03, 5.3.8.10_lts and/or 21.06.7_lts.中完成了修复。在Github中可以找到漏洞issue:
SI-62主要是由于对文件名过滤不严,导致可以通过路径穿越实现任意文件上传GetShell。
有兴趣深入研究的小伙伴请加入我们的漏洞空间站-优质漏洞资源和优质小伙伴聚集地!!
查看`web.xml`,找到一个名为`RESTAPI`的servlet:
对应处理代码位于`ReloadableServletContainer`,使用浏览器发送`/api/`请求,在`ReloadableServletContainer.service`处捕获断点:
进入`Application.handle`函数,调用`process`:
在`ServerRuntime.process`中执行`runInScope`,关键代码在`Run`函数中定义。首先使用`Stages.process`获取API请求对应的`端点(Endpoint)`,然后使用`Apply`函数进行处理:
以`/api/osgi`接口为例,发送`POST`请求后,通过`endpoint`变量可知处理类为`com.dotcms.rest.OSGIResource`:
`OSGIResource`位于`dotcms_22.02_999999.jar`文件中,它基于`javax.ws.rs`框架进行路由映射,其中`@Path`注解为`/osgi`,远程访问路径应为`/api/osgi`:
在jar包同一个路径下有许多其它Endpoint定义:
漏洞位于`com.dotcms.rest.ContentResource`:
其中的`multipartPOST`和`multipartPUT`用于处理POST和PUT请求:
进入`multipartPUTandPOST`函数,第1392行遍历文件上传部分,并根据`Content-Type`的不同,选择不同的处理方式:
处理方式如下:
-
processJSON
-
processXML
-
processForm
-
processMap
-
processFile
SI-62漏洞出现在`processFile`处理过程中:
进入`processFile`函数:
直接提取上传的文件名`filename`,虽然对目录名称通过`UUIDUtil.uuid`进行了随机化处理,但是在生成保存文件名时直接进行了字符串拼接,显然可以通过构造特殊的`filename`实现路径穿越,从而将文件保存到任意可写目录。
回顾前面分析,可以构造`/api/content/…`到达`ContentResource`处理接口:
触发断点:
成功写入:
新增`FileUtil.sanitizeFileName`对文件名进行处理:
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
点关注,不迷路!
更多精彩加入漏洞空间站-优质漏洞资源和优质小伙伴聚集地!
原文始发于微信公众号(且听安全):知识星球上线啦!!!SI-62 dotCMS路径穿越漏洞导致RCE