当前位置: 首页 > news >正文

别再让Solr 5.x-8.3.1成为突破口:手把手复现CVE-2019-17558并配置安全加固

Solr安全实战:从CVE-2019-17558漏洞验证到企业级防护体系构建

当企业搜索服务突然成为攻击者的跳板时,运维团队的每一秒都价值千金。2019年曝光的Velocity模板注入漏洞(CVE-2019-17558)至今仍在影响大量未升级的Solr实例,攻击者仅需发送特制请求就能在服务器上执行任意命令。本文将带您深入漏洞本质,不仅演示验证方法,更构建从应急响应到长效防护的完整解决方案。

1. 漏洞深度解析与技术验证

1.1 漏洞形成机制剖析

Velocity模板引擎原本是Solr用于动态生成响应内容的工具,但当params.resource.loader.enabled配置开启时,攻击者可以注入恶意模板代码。其本质是Java反射机制被滥用:

// 恶意模板中的关键代码片段 #set($rt=$x.class.forName('java.lang.Runtime')) #set($chr=$x.class.forName('java.lang.Character')) #set($ex=$rt.getRuntime().exec('whoami'))

影响版本范围

  • Apache Solr 5.0.0 至 8.3.1
  • 默认配置下需手动开启危险参数才可触发

1.2 企业环境验证方案

建议使用隔离的测试环境进行验证,以下是安全验证步骤:

  1. 核心发现(需替换实际地址):

    curl "http://solr-server:8983/solr/admin/cores?indexInfo=false&wt=json"
  2. 配置检查(以demo核心为例):

    GET /solr/demo/config HTTP/1.1 Host: solr-server:8983

    重点关注响应中的:

    { "queryResponseWriter": { "velocity": { "params.resource.loader.enabled": "false" } } }
  3. 无害化验证命令(推荐使用无害命令):

    GET /solr/demo/select?q=test&wt=velocity&v.template=custom&v.template.custom=%23set(...省略编码后的date命令...) HTTP/1.1

注意:实际验证时应使用date等无害命令替代原文中的hostname,避免生产环境影响

2. 紧急加固与配置优化

2.1 立即生效的防护措施

通过以下API即时关闭危险参数(示例使用curl):

curl -X POST -H "Content-Type: application/json" -d '{ "update-queryresponsewriter": { "name": "velocity", "params.resource.loader.enabled": "false" } }' http://solr-server:8983/solr/demo/config

关键参数对照表

参数名称安全值风险值作用
params.resource.loader.enabledfalsetrue禁用外部模板加载
solr.resource.loader.enabledfalsetrue禁用资源加载器
template.base.dir空或受控目录/限制模板目录

2.2 网络层防护策略

结合企业防火墙实施纵深防御:

  1. 访问控制列表

    # iptables示例(需根据实际调整) iptables -A INPUT -p tcp --dport 8983 -s 10.0.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 8983 -j DROP
  2. WAF规则示例(适用于ModSecurity):

    <SecRule REQUEST_URI "/solr/.*select.*wt=velocity" "phase:1,deny,id:10001" SecRule ARGS_GET:v.template.custom "@contains java.lang.Runtime"

3. 版本升级与迁移方案

3.1 升级路径规划

版本选择建议

  • 当前版本 ≤ 7.0 → 升级至 8.11.2+
  • 7.x/8.x → 升级至最新8.11.x或9.x

平滑升级步骤

  1. 备份关键数据:

    # 备份配置 tar -czvf solr_config_backup.tar.gz /opt/solr/server/solr/*/conf # 备份索引 curl "http://localhost:8983/solr/admin/collections?action=BACKUP&name=pre_upgrade"
  2. 使用Solr内置的滚动重启:

    bin/solr restart -c -z zoo1:2181 -p 8983

3.2 升级后验证清单

  1. 核心功能测试:

    # 索引测试 curl -X POST -H 'Content-Type: application/json' \ -d '[{"id":"test1","title":"upgrade test"}]' \ "http://localhost:8983/solr/gettingstarted/update?commit=true" # 查询测试 curl "http://localhost:8983/solr/gettingstarted/select?q=*:*"
  2. 安全配置复核:

    grep -r "params.resource.loader.enabled" /opt/solr/server/solr/

4. 构建企业级Solr安全体系

4.1 安全监控方案

日志监控关键指标

  • 异常的Velocity模板请求
  • 频繁的config API调用
  • 非常规的Java类加载

Prometheus监控示例

scrape_configs: - job_name: 'solr' metrics_path: '/solr/admin/metrics' static_configs: - targets: ['solr-server:8983']

4.2 长效安全机制

  1. 定期安全审计脚本

    import requests from urllib.parse import quote def check_solr_vulnerability(url): test_cmd = quote("#set($x='')...省略编码后的date命令...") try: resp = requests.get(f"{url}/select?q=test&wt=velocity&v.template.custom={test_cmd}") return "Dec 2023" not in resp.text # 检查无害命令响应 except: return False
  2. 安全配置基线

    <!-- solrconfig.xml安全片段 --> <queryResponseWriter name="velocity" class="solr.VelocityResponseWriter"> <str name="template.base.dir">${solr.install.dir:}/restricted_templates</str> <bool name="params.resource.loader.enabled">false</bool> <bool name="solr.resource.loader.enabled">false</bool> </queryResponseWriter>

在电商平台的实际运维中,我们曾通过自动化监控发现某业务线Solr集群每小时遭受超过200次漏洞探测请求。通过及时关闭危险参数并升级版本,成功在攻击者得手前完成防护。建议企业建立季度性的搜索服务安全评审机制,将配置检查纳入持续交付流水线。

http://www.rkmt.cn/news/1486223.html

相关文章:

  • 新版游戏账号与游戏币交易平台搭建全攻略
  • 从一道BUU SQL题看Web安全:实战中如何发现隐藏的SQL注入点(以backend/content_detail.php为例)
  • 欧氏TSP最短环的几何构造法:从凸包到Delaunay确定性求解
  • 保姆级教程:用ArcGIS Pro给地理坐标DEM算坡度,从数据准备到结果验证全流程
  • 用Python从零实现一个运动学自行车模型(附完整代码与可视化)
  • 星域社区全端源码功能实测与效果展示
  • 保姆级教程:用Qt 6.2.1的MaintenanceTool安装QtCharts模块(避坑MinGW编译器匹配)
  • Vue项目接入微信扫码登录,用vue-wxlogin插件5分钟搞定(附完整配置流程)
  • 2026年铝镁锰板支座主流生产厂家发展现状分析(附核心数据) - 多才菠萝
  • 从Qt自带Demo到实战:快速上手QtCharts,5分钟画出你的第一个动态折线图
  • 沈阳市三菱重工空调维修师傅电话|各区金牌师傅,靠谱选欧米到家 - 欧米到家
  • 现代C++从零实现卷积层:内存布局、SIMD优化与数值稳定
  • AppWeb 7.0.3认证绕过漏洞复现:一个‘空密码’引发的安全血案(CVE-2018-8715)
  • 保姆级教程:在Win10/Win11上搞定Libero Soc v11.9安装与证书配置(附百度网盘链接)
  • Moviepy搭配OpenCV实战:如何把静态旅游照片变成动态灯光秀短视频?
  • AI Coding 如何影响交付链路重构:写代码更快了,为什么人反而觉得更累了?
  • 从RS-232到Modbus:手把手教你为你的工控项目选择最佳波特率(含避坑指南)
  • 抖音无水印下载终极指南:3分钟快速批量保存视频的完整教程
  • 手动Ghost备份与恢复全攻略
  • PowerPC 603e多处理器系统:软件实现缓存一致性与同步机制详解
  • 高阶财务思维长什么样?财务高手是怎么思考业务的?
  • 2026年Q2防护型投入液位计源头厂家TOP10 - 仪表人叶工
  • UVa 424 Integer Inquiry
  • 长春发动机维修优选:本地门店测评与避坑全指南 - 百航
  • 红河哈尼族彝族自治州2026年黄金回收白银回收铂金回收 5 家高性价比门店实地测评盘点 - 三大殿
  • 如何免费解锁Wand专业版功能:开源增强工具终极指南
  • 不止于编译:用VS2019的类设计器可视化剖析ZLToolKit的模块架构
  • 手把手教你用STM32CubeIDE实现PMSM的EKF无感FOC(附代码避坑点)
  • 2026最新教程:PDF怎么另存为JPG?WPS、电脑自带工具、微信小程序3种方法详解 - 软件小管家
  • 在树莓派上利用NXP EdgeLock SE05x实现硬件级安全与TPM 2.0功能