struts2-052漏洞学习笔记

  • 了解漏洞
  1. struts2是什么?

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

MVC:是一种思想,是一种模式,将软件分为 Model模型、View视图、Controller控制器 

 

  1. struts2-052是什么漏洞?

2017年9月5日,Apache Struts官方发布最新的安全公告称,Apache Struts 2.5.x的REST插件存在远程代码执行高危漏洞,漏洞编号为CVE-2017-9805(S2-052),受影响的版本为Struts 2.5 - Struts 2.5.12。攻击者可以通过构造恶意XML请求在目标服务器上远程执行任意代码。漏洞的成因是由于使用XStreamHandler反序列化XStream实例的时候没有执行严格的过滤导致远程代码执行。

  • 分析漏洞原理

在目录/struts-2.3.33/src/plugins/rest/src/中找到问题插件rest的源代码

在/main/resources/struts-plugin.xml配置了很多的bean,这些bean按照content-type进行分类,并唯一指定一个具体的Handler。这些Handler都实现了ContentTypeHandler接口。从下图源码中可以看出,这个ContentTypeHandler实际上是按照Content-type的不同,将请求的数据丢给指定的子类进行处理,其中红圈为漏洞所在子类:

进入目录/struts-2.3.33/src/plugins/rest/src/main/java/org/apache/struts2/rest/handler找到问题子类的源代码:

这里实际上就是对XML和java对象之间进行转化,这里面的 toObject方法触发了漏洞——反序列化XStream实例的时候没有执行严格的过滤。

结合以上两个情况,如果我们拦截住提交数据的请求包,将其对应的ContentType直接改为 application/xml,则ContentTypeHandler按照Content-type,很自然的就把这个包分发给了XStreamHandler这个类来处理,然而这个类没有进行任何校验,直接进行了转换,所以服务器就会直接执行我们编写的任意xml代码。

  • 漏洞的重现和利用
  1. 搭建漏洞环境:
  1. 安装apache-tomcat-7.0.82和struts-2.3.33:

直接使用wget命令在官网下载源码包,解压安装即可:

  1. 进入到struts 的apps(我的是/home/flurry/struts-2.3.33/apps)目录,把struts2-rest-showcase.war文件放到tomcat的webapps目录(我的是/home/flurry/apache-tomcat-7.0.82/webapps):

  1. 进入到tomcat的bin目录(我的是/home/flurry/apache-tomcat-7.0.82/bin),启动tomcat:

  1. 打开浏览器,访问http://127.0.0.1:8080/struts2-rest-showcase,出现以下页面:

  1. 设置浏览器网络代理(8080端口已被tomcat占用,改用8088端口,并把不使用代理的localhost以及127.0.0.1删掉):

  1. 打开burpsuite,,设置proxy(保证与浏览器的设置一致):

  1. 点击浏览器界面里的edit:

  1. burpsuite里点击drop,浏览器进入下一界面,点击submit,burpsuite里点击drop,抓住一个包:

  1. 点击action,把这个包发送到repeater:

  1. 在repeater中编辑content-type值为application/xml,把最下面的请求换成写好的payload,然后点击Go,服务器会返回Error,如下图所示:

Payload代码如下所示,其中核心部分为红圈圈出来的部分:

<command>

<string>/usr/bin/touch</string>

<string>/tmp/test</string>

</command>

等价于命令touch /tmp/test,会在tmp目录下创建一个叫test的文件,查看tmp目录,发现有test文件,测试成功:

使用openvas扫描:

找到该漏洞的nvt:

分析源码可知,首先确定系统(windows或者linux),针对不同的系统定义了command命令:ping一下本机

然后获取主机地址,将文件中写好的payload写入请求包

将请求包发送给主机,分析得到的回复,如果执行了命令command,则说明存在漏洞:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值