### 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,不用再额外去找了),就用漏洞公告里给的那个写法
![](https://images.seebug.org/1504793276050)
![](https://images.seebug.org/1504793285755)
![](https://images.seebug.org/1504793294494)
运行后,未发现效果
![](https://images.seebug.org/1504793339240)
表着急,我们用的是hidden,看看源代码
![](https://images.seebug.org/1504793382513)
根据经验,应该是二次解析造成的漏洞,验证一下
![](https://images.seebug.org/1504793400313)
### 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详情
![](https://images.seebug.org/1504793460852)
### 0x03 复现验证
![](https://images.seebug.org/1504793485119)
再输出一下whoami
![](https://images.seebug.org/1504793493555)
暂无评论