Apache Struts2在开启动态方法调用(Dynamic Method Invocation)的情况下,攻击者使用REST插件调用恶意表达式可以远程执行代码。此漏洞编号为CVE-2016-3087,定名为S2-033。本文对该漏洞进行了技术分析并给出了相应的防护方案。
影响范围影响的版本
Struts 2.3.20 – Struts 2.3.28 (不包括 2.3.20.3和 2.3.24.3)。
不受影响的版本
Struts 2.3.20.3、 2.3.24.3 或者 2.3.28.1。
漏洞分析经过对Apache Struts2版本进行回溯,发现修复S2-033的代码和S2-032的代码基本相同。
]1 S2-033
根据官方描述修复S2-032漏洞是在Struts 2.3.20.2和2.3.24.2版本中修复,而官方的版本库中却少了这个版本,直接出现了可以修复S2-033漏洞的Struts 2.3.20.3、 2.3.24.3和2.3.28.1等版本,通过代码直接对比,只是在DefaultActionMapper.java文件中加入了对method成员变量的值的一次过滤,cleanupActionName这个方法是在对“action:”滥用的问题进行添加的,禁止了绝大多数的特殊字符。但是在后来的版本变更中忽略了之前的问题,将method也引入了OGNL表达式(Object Graph Navigation Library)。
通过对OGNL表达式的过滤来进行漏洞的修补。
如何检查是否受影响检查Struts2的配置文件struts.xml,确认“struts.enable.DynamicMethodInvocation” 是否为“true”,如为“true”,且版本在受影响版本范围内,则说明受影响,否则不受影响。
防护方案 如果使用受影响的版本,在允许的情况下禁用动态方法调用(Dynamic Method Invocation),修改Struts2的配置文件struts.xml,将struts.enable.DynamicMethodInvocation设置为“false”。 升级到Struts 2.3.20.3、 2.3.24.3 或者 2.3.28.1。