Struts2 S2-059 漏洞分析

  • A+
所属分类:安全文章


[email protected]s7eam

漏洞信息:https://cwiki.apache.org/confluence/display/WW/S2-059

Struts2 会对某些标签属性(比如 id,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x} 且 x 的值用户可控时,用户再传入一个 %{payload} 即可造成OGNL表达式执行。

漏洞复现

本次漏洞复现使用的是S2-045时搭建的漏洞环境,不同环境可能需要使用不同的payload绕过沙盒。影响版本写的是到 Struts 2.5.20 ,但是 2.5.16 之后的沙盒依然没有公开绕过方法。

Struts2 S2-059 漏洞分析

影响范围

Struts 2.0.0 - Struts 2.5.20

漏洞分析

调用栈

Struts2 S2-059 漏洞分析

jsp文件

  1. <%@ page contentType="text/html; charset=UTF-8"%>

  2. <%@ taglib prefix="s" uri="/struts-tags"%>

  3. <html>

  4. <head>

  5. <title>Hello World</title>

  6. </head>

  7. <body>


  8. <s:a id="%{payload}">testurl</s:a>

  9. </body>

  10. </html>

根据漏洞详情,可以知道问题出现在标签解析时,因此我们从 org.apache.struts2.views.jsp.ComponentTagSupport 的 doStartTag 方法开始跟进,这里会对jsp标签进行解析,标签不同 this 对应的标签对象也不同,所有的标签对象在 org.apache.struts2.views.jsp 包下。这里是 <s:a> 标签,对应 org.apache.struts2.views.jsp.ui.AnchorTag 。

Struts2 S2-059 漏洞分析

跟进 this.populateParams() ,也就是 AnchorTag 的 populateParams 方法,该方法是用来对标签属性进行赋值的。不同的标签赋值的属性也不同。

Struts2 S2-059 漏洞分析

父类和子类赋值的属性不同,存在 populateParams 方法的子类标签都会调用父类的 populateParams 方法,因此父类赋值的是通用的标签属性,setID 就在这里。

Struts2 S2-059 漏洞分析

因此我们也可以知道 org.apache.struts2.views.jsp.ui.AbstractUITag 存在 populateParams 方法的子类标签的id属性都受影响。

Struts2 S2-059 漏洞分析

跟进 setID ,这里会进入 findString

Struts2 S2-059 漏洞分析

继续跟进 findString ,看到了熟悉的 TextParseUtil.translateVariables 。前提需要开启 altSyntax 功能,altSyntax 是默认开启的,以及 ComponentUtils.containsExpression 需要返回true。

Struts2 S2-059 漏洞分析

Struts2 S2-059 漏洞分析


ComponentUtils.containsExpression 会判断是否包含${ 和 }

Struts2 S2-059 漏洞分析

最终会执行到 com.opensymphony.xwork2.util.OgnlTextParser#evaluate ,低版本在 com.opensymphony.xwork2.util.TextParseUtil#translateVariables,其实也就是S2-001的流程,这里不过多解释,细节可以看安恒信息安全研究院公众号之前的Struts2漏洞分析文章。


Struts2 S2-059 漏洞分析

最终会在下面执行OGNL表达式解析,返回我们给 action 传入的参数 %{1+1}

Struts2 S2-059 漏洞分析

在S2-001时对此方法进行了修复,加了一个 maxLoopCount 参数来限制递归解析的次数,这里的 maxLoopCount 是1因此我们只能执行一次表达式解析。


Struts2 S2-059 漏洞分析

不过回到 doStartTag ,跟进 a 标签对象的 start 方法


Struts2 S2-059 漏洞分析

一直跟到 org.apache.struts2.components.ClosingUIBean#start ,这里有个 evaluateParams 方法,该方法应该是对属性值中的表达式进行解析的。


Struts2 S2-059 漏洞分析

跟进其中的 this.populateComponentHtmlId(form)

Struts2 S2-059 漏洞分析

可以看到这里会对id属性再次进行表达式解析,前提依然是需要开启了 altSyntax 功能


Struts2 S2-059 漏洞分析

Struts2 S2-059 漏洞分析

进入 findString 之后的流程就和前面的一样了。

需要注意的是表达式必须为 %{} ,${} 是不行的,而网上传的() 包裹的poc不知道是从哪里来的。


Struts2 S2-059 漏洞分析

当然不光id属性,其他的属性也都会在 evaluateParams 方法中进行一次表达式解析。


Struts2 S2-059 漏洞分析

因此可以找找存在漏洞的标签属性还有哪些,id属性可以是因为他的setID方法中多了一个 findString 表达式解析的操作,UIBean 的其他 set 方法是没有这个操作的。


Struts2 S2-059 漏洞分析

不过我们可以看看 org.apache.struts2.views.jsp 下其他标签对象 populateParams 方法中的属性赋值操作,看看还有没有set方法对属性值进行了一次表达式解析即可。


Struts2 S2-059 漏洞分析

漏洞危害方面,该漏洞的利用需要结合应用程序的代码实现,故攻击者可能在拥有源代码的情况下进行分析与利用。

漏洞前置条件

  1. 需要开启 altSyntax 功能

  2. 需要特定标签id属性(其他属性有待寻找)中存在表达式 %{x} 且 x 为用户可控且未经过安全验证,比如 x 为 action 中的属性值。

漏洞检测与防御

  • 升级Struts2 到2.5.22版本;

  • 通过安恒信息相关产品对该漏洞检测与防御;


关于我们

Struts2 S2-059 漏洞分析

人才招聘

一、高级攻防研究员


工作地点:

1.杭州/重庆/上海/北京;


岗位职责:
1.前沿攻防技术研究;
2.负责完成定向渗透测试任务;
3.负责红队工具的研发。

任职要求:
1.三年以上相关工作经验,若满足以下所有条件,则可忽略此要求;
2.熟练掌握Cobalt Strike、Empire、Metasploit等后渗透工具的使用;
3.熟练掌握工作组/域环境下的各种渗透思路、手段;
4.具有大型、复杂网络环境的渗透测试经验;
5.具有独立的漏洞挖掘、研究能力;
6.熟练至少一门开发语言,不局限于C/C++、Java、PHP、Python等;
7.良好的沟通能力和团队协作能力。

加分项:
1.红队工具开发经验;
2.有良好的技术笔记习惯。


感兴趣的小伙伴请联系姜女士,或将简历及想要的职位投送至下方邮箱。(请注明来源“研究院公众号”)

联系人:姜女士
邮箱:[email protected]
手机;15167179002,微信同号

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: