【发布时间】:2012-04-25 03:39:55
【问题描述】:
我偶然发现了一篇文章Open source library with vulnerabilities。
这篇文章指出 “Spring 表达式语言 (SpEL) 可以通过 HTTP 参数提交被利用,这将允许攻击者获取敏感的系统数据、应用程序和用户 cookie。”
请问有人能详细说明一下吗?
【问题讨论】:
我偶然发现了一篇文章Open source library with vulnerabilities。
这篇文章指出 “Spring 表达式语言 (SpEL) 可以通过 HTTP 参数提交被利用,这将允许攻击者获取敏感的系统数据、应用程序和用户 cookie。”
请问有人能详细说明一下吗?
【问题讨论】:
Aspect Security 的发现是在 2013 年 1 月发现的,但 SpringSource 发布的修复是在 2011 年首次发现时提供的。 Aspect Security 的 Dan Amdio 告知 SpringSource 远程代码执行的可能性。
SpringSource 在 2012 年 12 月 6 日更新了我们的安全报告,其中包含 Aspect Security 的发现 - 但原始公告中列出的修复/缓解措施仍然适用:http://support.springsource.com/security/cve-2011-2730
此漏洞仅影响 Spring Framework 版本:
• 3.0.0 到 3.0.5 -- 升级到 3.0.6 可以解决问题。 • 2.5.0 到 2.5.6.SEC02(社区版本)——在此处升级到 2.5.6.SEC03 可以解决问题。 • 2.5.0 到 2.5.7.SR01(订阅客户)- 在此处升级到 2.5.7.SR02 可以解决问题。
此问题已在未来的所有版本中得到修复 - SpringFramework 的当前版本为 3.2,于 2012 年 12 月发布。
谢谢,
-Pieter (SpringSource)
【讨论】:
查看您链接到的文章可能引用的此 Aspect Security/Minded Security evaluation of SpEL (google docs link)(针对 SpEL 的特定情况)。
它们描述了某些 spring JSP 标记如何对 EL 表达式进行双重评估。在这些情况下,用户可能会以 SpEL 的形式向服务器提交数据,例如作为请求参数,值为${bean.val}(URL 编码)
http://...?exp=$%7Bbean.val%7D
在 JSP 页面中,表达式 ${param.exp} 将被解析为文本 ${bean.val},它本身是安全的。但是,如果该表达式位于 spring JSTL 标记的属性中,则可以再次评估该解析值,例如在spring:message 标签中:
<spring:message message="${param.exp}" />
将导致值${bean.val} 传递给spring:message 标记,该标记将评估bean.getVal() 方法。因此,我们现在有了客户端提交并在服务器上运行的代码。
【讨论】: