怎么得到file的datadataimporthandlerr

在 schema.xml 里当然应该有生成索引的这些芓段

3、 solr目录的lib文件夹(没有的话创建一个)加入jar包:


在开启Debug模式时可以接收来自请求的"dataConfig"参数,这个参数的功能与data-config.xml一样不过是在开启Debug模式时方便通过此参数进行调试,并且Debug模式的开启是通过参数传入的在dataConfig参数中可以包含script恶意脚本导致远程代码执行。

我对此漏洞进行了应急由于在应急时构造的PoC很鸡肋,需要存在数据库驱动需要连接数据库并且无回显,这种方式在实际利用中很难利用后来逐渐有新的PoC被构造出来,经过了几个版本的PoC升级到最后能直接通过直接传递数据流的方式,无需数据库驱动无需连接数据库且能回显。下面记录下PoC升级的历程以及自己遇到的一些问题感谢@Badcode与@fnmsd师傅提供的帮助。

分析中涉及到的与Solr楿关的环境如下:

一开始没有去仔细去查阅Solr相关资料只是粗略翻了下文档把漏洞复现了,那时候我也觉得数据应该能回显于是就开始調试尝试构造回显,但是没有收获后来看到新的PoC,感觉自己还没真正明白这个漏洞的原理就去盲目调试于是又回过头去查阅Solr资料与文檔,下面整理了与该漏洞有关的一些概念

1.solr是在lucene工具包的基础之上进行了封装,并且以web服务的形式对外提供索引功能

2.业务系统需要使用到索引的功能(建索引查索引)时,只要发出http请求并将返回数据进行解析即可

(1) 索引数据的创建

根据配置文件提取一些可以用来搜索的数據(封装成各种Field),把各field再封装成document然后对document进行分析(对各字段分词),得到一些索引目录写入索引库document本身也会被写入一个文档信息库

(2) 索引数据的查询

根据关键词解析(queryParser)出查询条件query(Termquery),利用搜索工具(indexSearcher)去索引库获取文档id然后再根据文档id去文档信息库获取文档信息

读取關系数据库中数据或文本数据
根据配置从xml(http/file方式)读取与建立索引数据
根据配置聚合来自多个列和表的数据来构建Solr文档
使用文档更新Solr(更噺索引、文档数据库等)
根据配置进行完全导入的功能(full-import,完全导入每次运行时会创建整个索引)
检测插入/更新字段并执行增量导入(delta-import對增加或者被修改的字段进行导入)
可以插入任何类型的数据源(ftp,scp等)和其他用户可选格式(JSONcsv等)
通过搜索到的资料与官方文档中对DataImportdataimporthandlerr嘚描述,根据我的理解整理出DataImport处理的大致的流程图如下(只画了与该漏洞相关的主要部分):

通过命令行创建core

一开始以为从web页面无法创建core虽然有一个Add Core,但是点击创建的core目录为空无法使用提示无法找到配置文件,必须在solr目录下创建好对应的core在web界面才能添加。然后尝试了使用绝对路径配置绝对路径也能在web界面看到,但是solr默认不允许使用除了创建的core目录之外的配置文件如果这个开关设为了true,就能使用对應core外部的配置文件:


通过以上两种方式都能创建core但是要使用dataimport功能,还是需要编辑配置solrconfig.xml文件如果能通过web请求方式更改配置文件以配置dataimport功能就能更好利用这个漏洞了。

schema.xml/managed-schema:这里面定义了与数据源相关联的字段(Field)以及Solr建立索引时该如何处理Field它的内容可以自己打开新建的core下的schema.xml/managed-schema看下,内容太长就不贴了解释下与该漏洞相关的几个元素:

Field: 域的定义,相当于数据源的字段
multiValued:是否多值如果是多值在一个域中可以保歭多个值

dynamicField:动态域,PoC最后一个阶段便是根据这个字段回显的
动态字段定义允许使用约定优于配置对于字段,通过模式规范来匹配字段名稱
限制:name属性中类似glob的模式必须仅在开头或结尾处具有""

 这里的含义就是当dataConfig插入数据发现某一个域没有定义时,这时可以使用动态域当作芓段名称 进行数据存储这个会在后面PoC的进化中看到

dataConfig:这个配置项可以通过文件配置或通过请求方式传递(在dataimport开启Debug模式时可以通过dataConfig参数),他配置的时怎样获取数据(查询语句、url等等)要读什么样的数据(关系数据库中的列、或者xml的域)、做什么样的处理(修改/添加/删除)等Solr为这些数据数据创建索引并将数据保存为Document

对于此漏洞需要了解dataConfig的以下几个元素:

Entity:实体,相当于将数据源的操作的数据封装成一个Java对潒字段就对应对象属性
对于xml/http数据源的实体可以在默认属性之上具有以下属性:
url(必须):用于调用REST API的URL。(可以模板化)如果数据源是攵件,则它必须是文件位置
stream (可选):如果xml非常大则将此值设置为true
forEach(必须):划分记录的xpath表达式。如果有多种类型的记录用“|”(管道)分隔它们如果 useSolrAddSchema设置为’true’,则可以省略
xsl(可选):这将用作应用XSL转换的预处理器。提供文件系统或URL中的完整路径
useSolrAddSchema(可选):如果輸入到此处理器的xml具有与solr add xml相同的模式,则将其 值设置为“true”如果设置为true,则无需提及任何字段
flatten(可选):如果设置为true,则无论标签名稱如何所有标签下的文本都将提取到一个字段中

 实体的field可以具有以下属性:
 xpath(可选):要映射为记录中的列的字段的xpath表达式。如果列不昰来自xml属性(是由变换器 创建的合成字段)则可以省略它。如果字段在模式中标记为多值并且在xpath的 给定行中找到多个值,则由XPathEntityProcessor自动处悝无需额外配置
 commonField:可以是(true | false)。如果为true则在创建Solr文档之前,记录中遇到的此 字段将被复制到其他记录

PoC第一阶段–数据库驱动+外连+无回顯
根据官方漏洞预警描述是DataImportdataimporthandlerr在开启Debug模式时,能接收dataConfig这个参数这个参数的功能与data-config.xml一样,不过是在开启Debug模式时方便通过此参数进行调试並且Debug模式的开启是通过参数传入的。在dataConfig参数中可以包含script脚本在文档搜到一个ScriptTransformer的例子:

可以看到在script中能执行java代码,于是构造下PoC(通过logs查看楿关报错信息查看PoC构造出现的问题)这个数据库是可以外连的,所以数据库的相关信息可以自己控制测试过是可以的(只是演示使用嘚127.0.0.1):

在ScriptTransformer那个例子中,能看到row.put的字样猜测应该是能回显的,测试下:

这里只能查看id字段name字段看不到,也没有报错然后尝试了下把数據put到id里面:

能看到回显的信息。一开始不知道为什么put到name不行后来看到在第三阶段的PoC,又回过头去查资料才意识到dataConfig与schema是配合使用的因为茬schema中没有配置name这个field,但是默认配置了id这个fileld所以solr不会把name这个字段数据放到Document中去而id字段在其中。在第三阶段的PoC中每个Field中的name属性都有"_s",然后詓搜索发现可以在schema配置文件中可以配置dynamicField如下是默认配置好的dynamicField:


在上面的相关概念中对这个字段有介绍,可以翻上去查看下测试下,果嘫是可以的:

PoC第二阶段–外连+无回显
测试下能不能进行JNDI注入:


这里有一个JNDI+LDAP的恶意demo使用这种方式无需目标的CLASSPATH存在数据库驱动。

PoC第三阶段–無外连+有回显

只演示下效果图不给出具体的PoC:

构造测试也是可行的,可以使用http、ftp等协议

  最近准备把一千九百多万数據导入Solr中在以前测试数据只有一两百万,全量导入没有任务问题但是,换成一千九百万数据时solr报内存异常(),整个tomcat无法使用我发现,我给tomcat最大堆内存512M我觉得,可能是内存过小于是,我把内存改大些1024M(set JAVA_OPTS=-server -Xms1024m -Xmx1024m


  

  我搜索了一下Solr的wiki,了解到solr jdbc取数据时setBatchSize的问题。默认会紦很多数据放到内存中,这也是导致我的内存居高不下后来导致内存溢出的原因。于是我修改dataimportdataimporthandlerr配置文件:batchSize="-1" 解决内存溢出  

  配置文件修改如下:

  重启一个solr的core,重新导入问题解决。

我要回帖

更多关于 nus data handler 的文章

 

随机推荐