Dotcms SI-62 任意文件上传 (CVE-2022-26352)
作者:h1ei1@白帽汇安全研究院
漏洞简介
Dotcms dotCMS是美国dotCMS(Dotcms)公司的一套内容管理系统(CMS)。该系统支持RSS订阅、博客、论坛等模块,并具有易于扩展和构建的特点。DotCMS对上传的文件名过滤不严格导致目录穿越,攻击者可以将一个特殊的.jsp 文件上传到dotCMS 的webapp/ROOT 目录,从而允许远程执行代码。
环境搭建
参考官网docker-compose.yml案例:https://www.dotcms.com/run/demo 和远程调试设置 https://www.dotcms.com/docs/latest/docker-image-configuration-options,如下(采用22.02版本以及远程调试端口8000)
version: '3.5'
networks:
db_net:
es_net:
volumes:
cms-shared:
dbdata:
esdata:
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.1
environment:
- cluster.name=elastic-cluster
- discovery.type=single-node
- data
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xmx1G "
ports:
- 9200:9200
- 9600:9600
volumes:
- esdata
networks:
- es_net
dotcms:
image: dotcms/dotcms:22.02
environment:
"CATALINA_OPTS": '-Xmx1g '
"DB_ba se_URL": "jdbc:postgresql://db/dotcms"
"DB_USERNAME": 'dotcmsdbuser'
"DB_PASSWORD": 'password'
"DOT_ES_AUTH_BASIC_PASSWORD": 'admin'
"DOT_ES_ENDPOINTS": 'http://elasticsearch:9200'
"DOT_INITIAL_ADMIN_PASSWORD": 'admin'
#"CUSTOM_STARTER_URL": 'https://repo.dotcms.com/artifactory/libs-release-local/com/dotcms/starter/20211201/starter-20211201.zip'
"CMS_JAVA_OPTS": ' -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000'
depends_on:
- elasticsearch
- db
volumes:
- cms-shared
#- {license_local_path}/license.zip:/data/shared/assets/license.zip
networks:
- db_net
- es_net
ports:
- "8080:8080"
- "8443:8443"
- "8000:8000"
db:
image: postgres:13
command: postgres -c 'max_connections=400' -c 'shared_buffers=128MB'
environment:
"POSTGRES_USER": 'dotcmsdbuser'
"POSTGRES_PASSWORD": 'password'
"POSTGRES_DB": 'dotcms'
volumes:
- dbdata
networks:
- db_net
漏洞分析
参考漏洞通告https://www.dotcms.com/security/SI-62,可知漏洞位于com.dotcms.rest.ContentResource
文件,并且接口为/api/content
,该/api
接口的路径处理是用@Path
注解来处理。
通过查找文件上传相关函数(使用一些关键字uopload、multipart等),发现multipartPUTandPOST
函数负责处理POST和PUT相关请求。
进入到multipartPUTandPOST
函数内,在遍历上传文件内容部分会根据Content-Type来选择不同的处理方式,比如下图的json,调用processJSON()
函数。
漏洞点位于processFile()
函数处理的过程中,进入函数可以看到使用filename获取上传的文件名,tmpFolder获取目录位置和随机的uuid拼接,最后再直接拼接到一起,没有做任何特殊处理,显然可以使用../../的filename进行目录穿越,实现在任意位置保存文件。
漏洞修复
https://github.com/dotCMS/core/pull/21792/files
使用FileUtil.sanitizeFileName()
对文件名处理
本文为白帽汇原创文章,如需转载请注明来源:https://nosec.org/home/detail/5007.html
最新评论