java中的接口是类吗
278
2022-10-05
structs高危漏洞在低版本修复(可选的高危漏洞补丁)
Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用某些tag等情况下可能存在OGNL表达式注入漏洞,从而造成远程代码执行,风险极大。
由于我们的应用structs版本低,jdk的版本也低,如果要升级到最新版本,不仅structs要升级,spring,jdk都需要升级,影响比较大,所以我们考虑直接参考最新版修复漏洞的方法,在老版本上进行修复。
漏洞基本原理
漏洞描述
Some of the tag's attributes could perform a double evaluation if a developer applied forced OGNL evaluation by using the %{...} syntax. Using forced OGNL evaluation on untrusted user input can lead to a Remote Code Execution and security degradation.
在struts的标签属性中,如果开发者使用了%{},就会evaluate里面的语句,这个执行过程是服务端struts代码执行的。
例如
The value of key "foo1" is
不使用%:
使用%:
运行结果如下:
he value of key "foo1" is bar1 不使用%:#foobar['foo1'] 使用%:bar1
里面的值如果是用户输入的,可能还会有%{}的语句,这时候会有递归的evaluate,就有可能有一些恶意语句在服务端执行。
修复方案
官方修复方案
Avoid using forced OGNL evaluation on untrusted user input, and/or upgrade to Struts 2.5.26 which checks if expression evaluation won't lead to the double evaluation.
如果我们没有在jsp中使用%{},就不会受到影响。 如果使用了,可以升级到2.5.26,它的修改就是checks if expression evaluation won't lead to the double evaluation.
但是我们没法升级到2.5.26,只能考虑在2.3.5上修复,所以参考源码修改老版本。
我们具体看一下代码修改了什么地方,在github的2.5.25->2.2.26记录中,关于这个漏洞的修复的commit message是”Avoids recursion in tags”,就是避免tag中递归,一共改了3个文件。
第一个文件:Component.java
这个completeExpressionIfAltSyntax函数,是判断是否开启了表达式功能,如果开启了,就加上%{},接下来就会执行表达式。
比如%{#foobar['foo1']},在传入这个函数的时候,已经去掉了%{},在这个函数里,如果发现开启了表达式功能,就再添加%{},然后evaluate。
现在加了一个条件,如果里面含有%{},就跳过,不再执行,因为会造成二次evaluate。同时新增了一个判断输入的表达式是否有嵌套的函数recursion,在下面的类里使用。
这个也主要是判断了一下是不是有递归,如果有递归,则不会evaluate,同时,把一些属性从Object改成了String,这是因为下面的一个修改。
这个类是UIBean的父类,它的修改是把属性从Object改成了String,为什么要修改成String,是因为在下面的函数中,如果属性是一个表达式,并且开启了表达式功能,会先evaluate一下,而evaluate的返回值是Object。修改后,不再对动态属性做evaluate了,只能是一个String的字面值。
在2.3.5上打补丁
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~