先用struts-2.3.33搭一个freemarker的简单项目(官方推荐的min-lib中就带了freemarker-2.3.22.jar,不用再额外去找了),就用漏洞公告里给的那个写法
运行后,未发现效果
表着急,我们用的是hidden,看看源代码
根据经验,应该是二次解析造成的漏洞,验证一下
简单分析下,熟悉struts2的同学应该可以想到了,struts2的invocation会在跑遍一圈interceptor之后,进行execute result
而我们项目中配置的result的type是freemarker,因此会这个流程会交到freemarkerresult手里,它会把对应的ftl模板拿出来各种处理
这里会进行第一次解析,标签value属性的值将会变成我们传入的%{100-3},当然其中还有ognl进行get value的过程,先不细讲了
之后标签处理结束前会回调给uibean,它end的时候肯定需要计算一下参数值,才能得到真正输出到浏览器上的值啦,这就会产生第二次解析
POC 可以构造,有几个要注意的地方:
POC详情
再输出一下whoami