关于Apache Struts2 S2-057远程代码执行漏洞分析
作者:CQITer小编 时间:2018-08-28 21:05
Apache Struts框架是一个基于 Java Servlets,JavaBeans, 和 JavaServer Pages (JSP)的Web应用框架的开源项目,Struts基于Model-View-Controller (MVC)的设计模式,可以用来构件复杂的Web应用。它允许我们分解一个应用程序的商业逻辑、控制逻辑和表现逻辑的代码,使它的重用性和维护性更好。Struts框架是Jakarta工程的一部分,由Apache软件基金会管理。
天融信阿尔法实验室将为你带来Apache Struts2 S2-057远程代码执行漏洞分析~
一、 漏洞描述当struts.mapper.alwaysSelectFullNamespace设置为true,并且package标签页以及result的param标签页的namespace值的缺失,或使用了通配符时可造成namespace被控制,最终namespace会被带入OGNL语句执行,从而产生远程代码执行漏洞。
1. 受影响的系统版本Apache Struts 2.3 – Struts 2.3.34
Apache Struts 2.5 – Struts 2.5.16
2. 漏洞编号CVE-2018-11776
二、环境搭建1.下载:
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()方法。



