Apache Struts2 S2-053 (CVE-2017-12611)

2017-09-07T00:00:00
ID SSV:96425
Type seebug
Reporter Root
Modified 2017-09-07T00:00:00

Description

0x00 基本信息

  • 漏洞编号:S2-053(CVE-2017-12611)
  • 漏洞影响:远程代码执行
  • 影响版本:Struts 2.0.1 -Struts 2.3.33, Struts 2.5 - Struts 2.5.10
  • 漏洞修复:升级至最新版本

0x01 环境搭建

先用struts-2.3.33搭一个freemarker的简单项目(官方推荐的min-lib中就带了freemarker-2.3.22.jar,不用再额外去找了),就用漏洞公告里给的那个写法

运行后,未发现效果

表着急,我们用的是hidden,看看源代码

根据经验,应该是二次解析造成的漏洞,验证一下

0x02 构造POC

简单分析下,熟悉struts2的同学应该可以想到了,struts2的invocation会在跑遍一圈interceptor之后,进行execute result 而我们项目中配置的result的type是freemarker,因此会这个流程会交到freemarkerresult手里,它会把对应的ftl模板拿出来各种处理 这里会进行第一次解析,标签value属性的值将会变成我们传入的%{100-3},当然其中还有ognl进行get value的过程,先不细讲了 之后标签处理结束前会回调给uibean,它end的时候肯定需要计算一下参数值,才能得到真正输出到浏览器上的值啦,这就会产生第二次解析 POC 可以构造,有几个要注意的地方: 1. struts2现在在解析ognl的时候,已经不允许直接使用eval和sequence类型的表达式了,可以参考近期的其他几个洞; 2. 输出(当然你不输出的话就不用管了)

POC详情

0x03 复现验证

再输出一下whoami