Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行( 二 )



Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

文章插图
在初始化了 OgnlValueStack对象后,会对OgnlValueStack对象进行依赖注入 。
Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

文章插图
这个时候会调用
com.opensymphony.xwork2.ognl.OgnlValueStack$setOgnlUtil将黑名单添加进来赋值给OgnlValueStacksecurityMemberAccess对象
Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

文章插图
这里需要注意的是由于 OgnlUtil默认为singleton单例模式,因此全局的OgnlUtil实例都共享着相同的设置 。如果利用OgnlUtil更改了设置项(excludedClasses、excludedPackageNames、
excludedPackageNamePatterns
)则同样会更改_memberAccess中的值 。
为什么改了 OgnlUtil的值以后_memberAccess的值也会改变呢?
首先上面说过了全局的 OgnlUtil实例都共享着相同的设置 。然后因为SecurityMemberAccess类的excludedClasses等属性都是集合类型
Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

文章插图
Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

文章插图
而在java中集合赋值时传递的是一个引用,我们对集合做的任何操作都会影响到它赋值过的变量 。所以在解析Ognl表达式时,当 OgnlUtilexcludedClasses等安全属性被清空时,_memberAccess对象的excludedClasses等安全属性也直接随之被清空了 。
Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

文章插图
 
漏洞修复不把报错的信息放到
LocalizedTextUtil.findText方法中去,从而保证报错的content-type不会进行OGNL表达式解析 。
2.5.10.1版本修改:
https://github.com/apache/struts/commit/b06dd50af2a3319dd896bf5c2f4972d2b772cf2b
2.3.32版本修改:
https://github.com/apache/struts/commit/352306493971e7d5a756d61780d57a76eb1f519a
Struts2漏洞系列之「S2-045」上传数据异常导致的OGNL表达式执行

文章插图




推荐阅读