1. 威客安全首页
  2. 安全资讯

Solr Velocity组件RCE漏洞分析

No.1

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

No.2

环境搭建

solr通过启动的时候加上-a参数,就可以使用额外的 JVM 参数(例如以 -X 开头的参数)启动 Solr,下面开启一下jdwp的远程调试。

solr start -p 8988 -f -a “-Xdebug –

Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8988″

No.3

漏洞分析

可以看到这个 filter 的注释说的,也就说相关路径都会先发送到这个 SolrRequestFilter 进行处理。

Solr Velocity组件RCE漏洞分析

选择在 SolrRequestFilter 的 dofilter 处下个断点,可以看到请求过来了。

Solr Velocity组件RCE漏洞分析

这 dofilter 方法中,这里会先获取我们 web.xml 中的 excludePatterns 的路径进行正则比对。

Solr Velocity组件RCE漏洞分析

代码继续下行,来到这里,跟进 getHttpSolrCall 方法。

Solr Velocity组件RCE漏洞分析

在 getHttpSolrCall 方法中最后的处理结果是返回一个 HttpSolrCall 对象。

Solr Velocity组件RCE漏洞分析

紧接着调用call方法,来到了 HttpSolrCall#call 中。

Solr Velocity组件RCE漏洞分析

跟进 HttpSolrCall#call 中,一直往下走,代码来到了这里,根据 switch 进行选择,这里的 action 是 PROCESS ,所以自然进入 PROCESS 的 case 中进行处理,然后调用this.execute方法来处理 solrRsp 对象。

Solr Velocity组件RCE漏洞分析

跟进 HttpSolrCall#execute 中,首先调用 getCore 方法获取 SolrCore 对象,然后调用 SolrCore#execute 方法。

Solr Velocity组件RCE漏洞分析
Solr Velocity组件RCE漏洞分析

跟进 SolrCore#execute 方法选择在 handler.handleRequest 处下一个断点,为什么会在这里下断点,因为从方法名称来看,这个名称大概会处理我们传入的 request 请求,这里由于我们请求的路径是/solr/test/config实际上是针对这个 config 进行操作,所以这里的handler对象是 SolrConfigHandler 。

Solr Velocity组件RCE漏洞分析
Solr Velocity组件RCE漏洞分析

代码继续下行,来到 RequestHandlerBase 类中,这个类调用this.handleRequestBody来处理。

Solr Velocity组件RCE漏洞分析

而这个 handlerRequestBody 实际上是一个抽象类,也就是solr实际通过自己的路由分发,将不同url请求,转发到不同的 handler 进行处理,这是我的理解,可能存在偏差。

Solr Velocity组件RCE漏洞分析

然后在 SolrConfigHandler#handleRequestBody 中就可以看到一些处理了,由于我们请求的数据类型是json,请求方式POST,所以自然会进入command.handlerPOST进行处理。

Solr Velocity组件RCE漏洞分析

跟进command.handlerPOST,实际上可以看到this.handleCommands方法进行处理的时候overlay对象的值正是我们已经传入的。

Solr Velocity组件RCE漏洞分析

继续跟进 SolrConfigHandler$command 的 handleCommands 方法,这里通过 SolrResourceLoader 类加载资源配置,然后调用 SolrResourceLoader#persistConfLocally 方法针对文件进行操作。

Solr Velocity组件RCE漏洞分析

继续 SolrResourceLoader#persistConfLocally 方法可以看到,获取配置文件路径,写入内容,而写入部分的正是我们通过POST方式上传上来的数据。

Solr Velocity组件RCE漏洞分析
Solr Velocity组件RCE漏洞分析

第一阶段修改配置文件的调用栈如下所示:

persistConfLocally:900, SolrResourceLoader (org.apache.solr.core)handleCommands:504, SolrConfigHandler$Command (org.apache.solr.handler)handlePOST:345, SolrConfigHandler$Command (org.apache.solr.handler)access$100:158, SolrConfigHandler$Command (org.apache.solr.handler)handleRequestBody:136, SolrConfigHandler (org.apache.solr.handler)handleRequest:199, RequestHandlerBase (org.apache.solr.handler)execute:2551, SolrCore (org.apache.solr.core)execute:711, HttpSolrCall (org.apache.solr.servlet)call:516, HttpSolrCall (org.apache.solr.servlet)doFilter:395, SolrDispatchFilter (org.apache.solr.servlet)doFilter:341, SolrDispatchFilter (org.apache.solr.servlet)

当然第二阶段就是通过模版注入,远程代码执行,代码断点还是下到call.call位置。

Solr Velocity组件RCE漏洞分析

跟进 HttpSolrCall#call 中,跟进下图代码中的this.getResponseWriter。

Solr Velocity组件RCE漏洞分析

在HttpSolrCall#getResponseWriter,可以看到实际上循环来到了下图位置,调用的是 SolrCore#getQueryResponseWriter

Solr Velocity组件RCE漏洞分析

而 SolrCore#getQueryResponseWriter 实际上是根据请求参数重的 wt 字段的值去获取reponseWriter 对象,payload中的参数是 velocity ,所以这里最后的返回对象是 VelocityResponseWriter。

Solr Velocity组件RCE漏洞分析
Solr Velocity组件RCE漏洞分析

紧接着代码下行来到下图位置,我们看到 writeResponse 方法处理了我们刚刚的 VelocityResponseWriter对象。

Solr Velocity组件RCE漏洞分析

继续跟进 HttpSolrCall#writeResponse ,代码调用了 writeQueryResponse 方法。

Solr Velocity组件RCE漏洞分析

代码一路下行,会来到 VelocityResponseWriter#write 当中,然而刚开始时候,我只导入了solr-webapp目录下 WEB-INF 中的jar文件,然后就会出现下图中的情况,明明debug断点到了,但是无法打开查看源代码。后面深入看看才发现少导入了两个文件的jar,一个是 dist 目录中的 jar 文件,另一个是contrib/velocity/lib目录下的 Jar 文件。

Solr Velocity组件RCE漏洞分析

继续愉快的debug,跟进 VelocityResponseWriter#write ,首先调用 createEngine 函数处理我们传入的 request 对象。

Solr Velocity组件RCE漏洞分析

跟进 createEngine 函数,这里实例化 SolrParamResourceLoader 类来处理 request 对象。

Solr Velocity组件RCE漏洞分析

这里有个疑问为啥 paramsResourceLoaderEnabled 是true,本质原因就在这之前HttpSolrCall#call方法中通过 getResponseWriter 方法,进一步来到 VelocityResponseWriter#init 方法获取到我们之前第一步修改配置文件的时候写入配置文件中的params.resource.loader.enabled和solr.resource.loader.enabled的结果,所以这里自然是true。

Solr Velocity组件RCE漏洞分析
Solr Velocity组件RCE漏洞分析

跟进 SolrParamResourceLoader 类,这里遍历循环我们payload中的数据,当 name 为 v.template ,我们在payload中的 v.template 的值是 custom ,所以这里实际上是生成了 custom.vm 的恶意 engine 。

Solr Velocity组件RCE漏洞分析

代码回到 createEngine 方法中,这里自然 paramsResourceLoaderEnabled 是true,原因不在细说,上面所过了。

Solr Velocity组件RCE漏洞分析

执行完这两个if之中的 SolrParamResourceLoader 和 SolrVelocityResourceLoader 操作之后,代码回到 VelocityResponseWriter#write 中,调用 VelocityResponseWriter#getTemplate 方法处理刚刚的engine对象,以及我们的request请求对象。

Solr Velocity组件RCE漏洞分析

在 VelocityResponseWriter#getTemplate 方法中回根据我们提交的 v.template 参数获取我们构造的恶意 template 对象。

Solr Velocity组件RCE漏洞分析

最后在调用我们构造好的恶意 template 的 merge 方法,达到命令模版注入的效果。

Solr Velocity组件RCE漏洞分析

实际上模版进入到 template 的 merge 方法,然后及时一些AST解析过程。最后补上核心调用栈:

exec:347, Runtime (java.lang)invoke0:-1, NativeMethodAccessorImpl (sun.reflect)invoke:62, NativeMethodAccessorImpl (sun.reflect)invoke:43, DelegatingMethodAccessorImpl (sun.reflect)invoke:498, Method (java.lang.reflect)doInvoke:506, UberspectImpl$VelMethodImpl (org.apache.velocity.util.introspection)invoke:494, UberspectImpl$VelMethodImpl (org.apache.velocity.util.introspection)execute:198, ASTMethod (org.apache.velocity.runtime.parser.node)execute:304, ASTReference (org.apache.velocity.runtime.parser.node)value:605, ASTReference (org.apache.velocity.runtime.parser.node)value:72, ASTExpression (org.apache.velocity.runtime.parser.node)render:235, ASTSetDirective (org.apache.velocity.runtime.parser.node)render:377, SimpleNode (org.apache.velocity.runtime.parser.node)merge:359, Template (org.apache.velocity)merge:264, Template (org.apache.velocity)write:166, VelocityResponseWriter (org.apache.solr.response)writeQueryResponse:65, QueryResponseWriterUtil (org.apache.solr.response)writeResponse:873, HttpSolrCall (org.apache.solr.servlet)call:582, HttpSolrCall (org.apache.solr.servlet)doFilter:423, SolrDispatchFilter (org.apache.solr.servlet)doFilter:350, SolrDispatchFilter (org.apache.solr.servlet)

No.4

流程图

简单绘制一个流程图,方便后记

Solr Velocity组件RCE漏洞分析

No.5

修复建议

从solr官方网站可以看出,这个插件实际上是一个可选项,这个漏洞本质还是配合solr未授权来达到rce的目的,所以实际上临时解决这个漏洞最优雅的方式应该是加上鉴权。

Solr Velocity组件RCE漏洞分析

加上鉴权后没有问题。

Solr Velocity组件RCE漏洞分析

No.6

招聘启事

安全招聘
————————

公司:安恒信息
岗位:Web安全 安全研究员
部门:安服战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部),广州
岗位剩余编制:3人
工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…

【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案

【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)

【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;


岗位:安全红队武器自动化攻城狮
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.熟练使用Python、java等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3.熟悉OWASP TOP 10常见WEB安全漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
4.在互联网企业有相关安全产品开发经验优先;
5.具备良好的英语文档阅读能力。


简历投递至 strategy@dbappsecurity.com.cn
PS:邮件主题中请注明工作意向城市,岗位要求可通过加分项弥补

设计师

————————

【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。

【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件;
3、有品牌传播、产品设计或新媒体视觉工作经历;

【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽


简历投递至 strategy@dbappsecurity.com.cn

安恒雷神众测SRC运营(实习生)
————————
【职责描述】
1.  负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量;
2.  负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通;
3.  参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等;
4.  积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章;
5.  积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。

【任职要求】 
 1.  责任心强,性格活泼,具备良好的人际交往能力;
 2.  对网络安全感兴趣,对行业有基本了解;
 3.  良好的文案写作能力和活动组织协调能力。


简历投递至 strategy@dbappsecurity.com.cn

安全服务工程师/渗透测试工程师


工作地点:新疆

1、掌握渗透测试原理和渗透测试流程,具备2年以上渗透测试工作经验,能够独立完成渗透测试方案和测试报告;
2、熟悉风险评估、安全评估;
3、熟练掌握各类渗透工具,如Sqlmap、Burpsuite、AWVS、Appscan、Nmap、Metasploit、Kali等;
4、熟练掌握Web渗透手法,如SQL注入、XSS、文件上传等攻击技术;
5、至少熟悉一种编程语言(php/java/python),能够独立编写poc者优先;
6、具有良好的沟通能力和文档编写能力,动手能力强;
7、对工作有热情,耐心、责任心强,具备沟通能力和良好的团队意识;
8、加分项:有安全开发经验/可进行代码审计工作;
9、加分项:有安全和网络相关证书,如CISSP、CISA、CISP 、CCNP、CCIE等认证者;
岗位职责:
1、参与安全服务项目实施,其中包括渗透测试与安全评估,代码审计,安全培训,应急响应;
2、独立完成安全服务项目报告编写,输出安全服务实施报告;

Solr Velocity组件RCE漏洞分析

专注渗透测试技术

全球最新网络攻击技术

END

Solr Velocity组件RCE漏洞分析

原文始发于微信公众号(雷神众测):Solr Velocity组件RCE漏洞分析

本文转为转载文章,本文观点不代表威客安全立场。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

4006-119-120

在线咨询:点击这里给我发消息

邮件:public@jinlongsec.com

工作时间:周一至周五,9:30-18:30,节假日休息

X