声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
0x01 通告
0x02 漏洞分析
从通告中来看,漏洞应该和DIH功能中的某个功能有关系,翻一翻DataImportHandler的手册,找到了疑似漏洞触发点,下面的代码功能是 ScriptTransformer 。
<dataConfig>
<script><![CDATA[
function CategoryPieces(row) {
var pieces = row.get('category').split('/');
var arr = new java.util.ArrayList();
for (var i=0; i<pieces.length; i++) {
arr.add(pieces[i]);
}
row.put('categorypieces', arr);
row.remove('category');
return row;
}
]]></script>
<document>
<entity name="e" pk="id" transformer="script:CategoryPieces" query="select * from X">
.... </entity>
</document></dataConfig>
先去翻翻这个功能实现的代码,这里简单看看一些关键代码,代码jar包似乎就告诉我这个漏洞原因是什么了,我们看到了 javax.script.ScriptEngine; 。
Java从java 6开始就有一个能够解析javascript的引擎,我们可以看到小例子:
ζ jjs jjs> print("Hello World"); Hello World
当然这个JavaScript也是可以支持实例化相关java类,执行相关类的作用。
换到java代码实现是这样的。
import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;import javax.script.ScriptException;public class NashornEngineTest { public static void main(String[] args) throws ScriptException { ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); String js ="var clzz= new java.lang.ProcessBuilder(\"/Applications/Calculator.app/Contents/MacOS/Calculator\");print(clzz);clzz.start()"; engine.eval(js); }}
看到下面的代码解析js是不是感觉和上面那部分代码很眼熟。大概的解析流程通过 initEngine 处理传入的JavaScript 代码,然后在解析 JavaScript 代码的时候导致解析 Java 代码,达到命令执行的目的。
0x03 漏洞复现
在Dataimport处填入payload
修复方案
值得注意的是,官方给出的临时修复方案并不能缓解漏洞,当把相应index core的配置文件置为空时,dataimport的时候只是获取不到默认的配置,但是依然能够通过这个接口发送PoC,漏洞也依然能够触发,解决办法是把相应配置文件中的dataimport requestHandler全部注释并重启Solr服务器,或者选择升级才能彻底关闭这个接口缓解漏洞。