【漏洞分析】Struts2高危漏洞S2-048分析

CIOAge
Struts2高危漏洞S2-048分析

[[196467]]


本次漏洞触发点在:

org.apache.struts2.s1.Struts1Action.execute() 方法中,如下图所示。

http://p5.qhimg.com/t01eedf939f4b2b3670.png

org.apache.struts2.s1.Struts1Action 类为一个 Wrapper 类,用于将 Struts1 时代的 Action 包装成为 Struts2 中的 Action,以让它们在 struts2 框架中继续工作。
 

在 Struts1Action 的 execute 方法中,会调用对应的 Struts1 Action 的 execute 方法(***个红色箭头处)。在调用完后,会检查 request 中是否设置了 ActionMessage,如果是,则将会对 action messages 进行处理并回显给客户端。处理时使用了 getText 方法,这里就是漏洞的触发点。所以漏洞的触发条件是:在 struts1 action 中,将来自客户端的参数值设置到了 action message 中。

在官方提供的 Showcase 中,就存在漏洞,如下图:

 http://p0.qhimg.com/t01b70b1741ca58d61c.png

getText 方法的主要作用就是实现网站语言的国际化,它会根据不同的 Locale 去对应的资源文件里面获取相关文字信息(这些文件信息一般保存在 .properties 文件中),这些文字信息往往会回显至客户端。

Action messages 会通过 getText 方法最终进入 com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage(String, Locale, ValueStack, Object[], String) 方法,如下:

http://p7.qhimg.com/t0135e5e8fdaa871d13.png


 

此方法会将 action message 传入 com.opensymphony.xwork2.util.TextParseUtil.translateVariables(String, ValueStack)。com.opensymphony.xwork2.util.TextParseUtil.translateVariables(String, ValueStack) 方法主要用于扩展字符串中由 ${} 或 %{} 包裹的 OGNL 表达式,这里也就是 OGNL 的入口,随后 action message 将进入 OGNL 的处理流程,漏洞被触发。


 

关于 POC

 


1
暂不公布


 

总结

 


该漏洞触发需要非默认插件 struts2-struts1-plugin
 

需要手动寻找程序中将客户端参数值添加入 action message 的点

责任编辑:吴金泽 来源: 安全客
相关推荐

2017-07-14 13:51:19

2013-07-18 15:09:27

2017-07-17 11:00:53

2016-04-29 10:58:13

2013-07-19 09:36:04

struts2struts2漏洞

2013-07-18 15:57:42

2012-12-18 16:18:06

2013-07-18 13:11:07

2017-03-08 22:23:02

2016-06-08 10:09:24

2013-07-22 10:45:56

2013-07-18 10:06:54

2016-03-22 12:37:45

Struts2Struts2漏洞漏洞检测

2013-05-22 10:28:19

2013-07-24 10:35:02

2017-09-12 07:54:32

2012-12-18 16:38:26

2013-07-24 14:06:48

2012-08-30 09:48:02

Struts2Java

2009-06-08 16:44:00

struts2 ogn

51CTO技术栈公众号