#3 楼 @hooopo Struts 之前都有好几波远程执行命令了,就和 Rails 3 的时候好几波 SQL 注入一样...估计这地方有设计缺陷,再挖掘一下可能还可以来个一两波
Java 其实是动态语言,Java 的运行期和动态语言真没啥差别,但是编译器却要假装成静态语言的样子。(刚才没想到还有 gcj 这种实现)
Struts 不安全不代表 Rails 就安全
看 struts 的 version notes
http://struts.apache.org/release/2.3.x/docs/version-notes-23141.html
OGNL eval expressions has been disabled by default.
http://struts.apache.org/development/2.x/docs/version-notes-23142.html
OGNL evaluation for included URL parameters has been dropped
http://struts.apache.org/development/2.x/docs/version-notes-23143.html
Whitelisting of actions' names was introduced and double evaluation of OGNL expression was removed.
果然都是出在 OGNL 里的。OGNL 难道还不是动态语言?
http://commons.apache.org/proper/commons-ognl/index.html
这个地方之前就被爆出好几次远程执行漏洞的,比如
http://blog.o0o.nu/2012/01/cve-2011-3923-yet-another-struts2.html
@hooopo 可以继续深入挖掘一下,Struts 2 就只能淘汰掉 OGNL 了
我当年玩 webwork2 的时候,就觉得 OGNL 迟早出事,特别是那个 ParametersInterceptor,虽然自动创建对象,自动匹配对象属性赋值了,但危险性比 Rails 的 AR 的 update_attributes 还要高。
#9 楼 @greatghoul 一个前提安全不安全是相对的。拿‘动态语言不安全’这个论点来讲,其实含义是静态语言安全。struts 的漏洞说明静态语言也不安全。于是静态比动态安全的说法就不成立了。