一、漏洞简介
CVE-2017-5638 是 Apache Struts2 中的一个远程命令执行漏洞,攻击者可以通过构造特定的 HTTP 请求头,利用Struts的 OGNL 表达式解析机制,在服务器端执行任意代码。
二、漏洞触发场景
漏洞存在于 Struts2 的 Jakarta Multipart Parser 组件中,当服务器解析 HTTP 请求时,会对某些请求头进行OGNL解析,例如 Content-Type
请求头。
漏洞关键代码
LocalizedMessage buildErrorMessage(Throwable e, Object[] args) {
String errorKey = "struts.messages.upload.error." + e.getClass().getSimpleName();
return new LocalizedMessage(this.getClass(), errorKey, args);
}
上述过程中,Struts2 会尝试使用 OGNL 解析 errorKey
,攻击者若插入恶意OGNL代码即可执行。
三、攻击示例分析
攻击者发送恶意 HTTP 请求:
POST /upload.action HTTP/1.1
Host: vulnerable-server
Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(@java.lang.Runtime@getRuntime().exec('whoami'))}
Payload核心解释:
%{}
: OGNL表达式标记。- 绕过安全限制并执行Java运行时命令。
四、实际攻击链路
- 构造恶意请求远程执行命令。
- 上传WebShell,持续控制服务器。
- 横向移动获取更多权限。
- 数据外传与泄露。
五、漏洞修复方案
修复代码示例:
String errorKey = "struts.messages.upload.error." + StringEscapeUtils.escapeJava(e.getClass().getSimpleName());
修复措施原理:避免OGNL解析,采用字符串转义。
六、关键反思
- 漏洞管理流程需及时。
- 权限控制必须合理。
- 安全监控系统需正常运作。
七、企业安全建议 checklist
事项 | 实施情况(✅/❌) |
---|---|
定期检查第三方库版本与漏洞更新 | |
使用自动化工具追踪漏洞 | |
落实WAF规则过滤常见攻击 | |
严格实施最小权限原则 | |
定期安全培训与演练 | |
静态代码分析(SAST) 库博静态代码分析工具 |