从防护角度看Struts2历史漏洞,需要结合漏洞成因、攻击手法和防御体系进行系统性防护。以下是分阶段的防护建议:
Struts2历史漏洞主要集中于以下层面: 1. OGNL表达式注入(如S2-045、S2-061):攻击者通过恶意OGNL表达式实现RCE。 2. 默认配置缺陷(如S2-057):未严格校验namespace或action路径。 3. 标签库处理缺陷(如S2-029):UI标签解析时未过滤用户输入。 4. 依赖库漏洞(如XWork、Jakarta):间接引入的安全风险。
及时更新版本
禁用动态方法调用
在struts.xml
中配置:
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
严格限制文件上传
对上传文件类型、内容、路径进行白名单校验,避免S2-046类漏洞。
OGNL表达式沙箱
通过struts.ognl.expressionMaxLength
限制表达式长度,禁用危险方法:
struts.ognl.expressionMaxLength=200
struts.ognl.disallowClassFieldAccess=true
全局输入校验
使用Struts2拦截器或框架层过滤器(如Spring MVC的@Valid
)对参数强校验。
关闭开发模式
生产环境禁用devMode
:
<constant name="struts.devMode" value="false" />
限制访问权限
使用Web服务器(如Nginx)限制/struts/*
路径的访问。
最小化依赖
移除不必要的插件(如REST插件),通过Maven排除高危依赖:
<exclusions>
<exclusion>
<groupId>org.apache.struts.xwork</groupId>
<artifactId>xwork-core</artifactId>
</exclusion>
</exclusions>
漏洞扫描
#application
、@java.lang.Runtime
)。WAF规则
配置Web应用防火墙规则拦截特征(示例规则):
SecRule REQUEST_URI "@contains struts" "id:1001,deny,msg:'Struts2 OGNL Attack'"
补丁热修复
若无法立即升级,使用官方临时补丁(如S2-045的StaticContentLoader
替换方案)。
漏洞:S2-059(CVE-2019-0230)
- 修复方案:
1. 升级至Struts 2.5.20+。
2. 在JSP中强制转义用户输入:
jsp
<s:property value="%{escape(userInput)}" escapeHtml="true"/>
通过以上措施,可显著降低Struts2应用被历史漏洞攻击的风险,但长期建议逐步迁移至更安全的框架体系。