Struts2 S2-059 漏洞分析

E安全
8月前   科技领域达人
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文件
Hello World
根据漏洞详情,可以知道问题出现在标签解析时,因此我们从org.apache.struts2.views.jsp.ComponentTagSupport的doStartTag方法开始跟进,这里会对jsp标签进行解析,标签不同this对应的标签对象也不同,所有的标签对象在org.apache.struts2.views.jsp包下。这里是标签,对应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版本;
通过安恒信息相关产品对该漏洞检测与防御;
关于我们
注:本文由E安全编译报道,转载请注原文地址
https://www.easyaq.com
推荐阅读:
伊朗黑客组织Oilrig在攻击中利用DNS-over-HTTPS协议
澳大利亚政府公布新的网络安全战略
BluBracket更新了代码安全套件 增加被盗和泄漏检测功能
Facebook被视为安全风险最高的在线平台
安恒信息再登全球Black Hat大会,公布蓝牙漏洞窃取Android用户隐私研究
▼点击“阅读原文” 查看更多精彩内容
喜欢记得打赏小E哦!
分享好友
分享好友
更多精彩内容进入 [科技频道]