Smi1e@Pentes7eam
漏洞信息: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
之后的沙盒依然没有公开绕过方法。
影响范围
Struts 2.0.0 - Struts 2.5.20
漏洞分析
调用栈
jsp文件
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<s:a id="%{payload}">testurl</s:a>
</body>
</html>
根据漏洞详情,可以知道问题出现在标签解析时,因此我们从 org.apache.struts2.views.jsp.ComponentTagSupport
的 doStartTag
方法开始跟进,这里会对jsp标签进行解析,标签不同 this
对应的标签对象也不同,所有的标签对象在 org.apache.struts2.views.jsp
包下。这里是 <s:a>
标签,对应 org.apache.struts2.views.jsp.ui.AnchorTag
。
跟进 this.populateParams()
,也就是 AnchorTag
的 populateParams
方法,该方法是用来对标签属性进行赋值的。不同的标签赋值的属性也不同。
父类和子类赋值的属性不同,存在 populateParams
方法的子类标签都会调用父类的 populateParams
方法,因此父类赋值的是通用的标签属性,setID
就在这里。
因此我们也可以知道 org.apache.struts2.views.jsp.ui.AbstractUITag
存在 populateParams
方法的子类标签的id属性都受影响。
跟进 setID
,这里会进入 findString
继续跟进 findString
,看到了熟悉的 TextParseUtil.translateVariables
。前提需要开启 altSyntax
功能,altSyntax
是默认开启的,以及 ComponentUtils.containsExpression
需要返回true。
ComponentUtils.containsExpression
会判断是否包含${
和 }
最终会执行到 com.opensymphony.xwork2.util.OgnlTextParser#evaluate
,低版本在 com.opensymphony.xwork2.util.TextParseUtil#translateVariables
,其实也就是S2-001的流程,这里不过多解释,细节可以看安恒信息安全研究院公众号之前的Struts2漏洞分析文章。
最终会在下面执行OGNL表达式解析,返回我们给 action
传入的参数 %{1+1}
在S2-001时对此方法进行了修复,加了一个 maxLoopCount
参数来限制递归解析的次数,这里的 maxLoopCount
是1因此我们只能执行一次表达式解析。
不过回到 doStartTag
,跟进 a
标签对象的 start
方法
一直跟到 org.apache.struts2.components.ClosingUIBean#start
,这里有个 evaluateParams
方法,该方法应该是对属性值中的表达式进行解析的。
跟进其中的 this.populateComponentHtmlId(form)
可以看到这里会对id属性再次进行表达式解析,前提依然是需要开启了 altSyntax
功能
进入 findString
之后的流程就和前面的一样了。
需要注意的是表达式必须为 %{}
,${}
是不行的,而网上传的()
包裹的poc不知道是从哪里来的。
当然不光id属性,其他的属性也都会在 evaluateParams
方法中进行一次表达式解析。
因此可以找找存在漏洞的标签属性还有哪些,id属性可以是因为他的setID方法中多了一个 findString
表达式解析的操作,UIBean
的其他 set
方法是没有这个操作的。
不过我们可以看看 org.apache.struts2.views.jsp
下其他标签对象 populateParams
方法中的属性赋值操作,看看还有没有set方法对属性值进行了一次表达式解析即可。
漏洞危害方面,该漏洞的利用需要结合应用程序的代码实现,故攻击者可能在拥有源代码的情况下进行分析与利用。
漏洞前置条件
-
需要开启
altSyntax
功能 -
需要特定标签id属性(其他属性有待寻找)中存在表达式
%{x}
且x
为用户可控且未经过安全验证,比如x
为action
中的属性值。
漏洞检测与防御
-
升级Struts2 到2.5.22版本;
-
通过安恒信息相关产品对该漏洞检测与防御;
关于我们
人才招聘
一、高级攻防研究员
工作地点:
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,微信同号
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论