Tomcat-Struts2漏洞复现详解

在开始实验struts2漏洞之前,我们先来了解下该漏洞的历史,Struts2是apache项目下的一个web 框架,我们先来了解下他的架构

从一个高水平角度看,Struts2 是一个MVC拉动的(或MVC2)框架,Struts2 的模型-视图-控制器模式是通过以下五个核心部分进行实现的:

  • 操作(Actions)

  • 拦截器(Interceptors)

  • 值栈(Value Stack)/OGNL

  • 结果(Result)/结果类型

  • 视图技术

而Struts2 与传统的MVC框架略有不同,因为它由Action扮演模型的角色,而不是控制器,虽然这样会有一些重叠。

上图描述了Struts2 高级系统架构下的模型、视图及控制器。控制器是通过Struts2 分派servlet过滤器以及拦截器进行实现,模型是通过Actions进行实现,而视图则是结果类型和结果的结合。值栈和OGNL提供共同的路线、链接以及与其他组件之间的集成。

除了上述部分,还有许多组件相关的信息。web应用程序组件、Actions组件、拦截器组件、结果组件等等。

这些是Struts2 MVC模式的体系结构概述,在随后的章节中,我们将详细了解各个部分。

请求生命周期

通过上述图片的描述,我们可以依照下面几点解释在Struts2 中用户的请求生命周期:

  • 用户发送一个资源需求的请求到服务器(例如:

    页面)。

  • 核心控制器查看请求后确定适当的动作。

  • 使用验证、文件上传等配置拦截器功能

  • 执行选择的动作来完成请求的操作。

  • 另外,如果需要的话,配置的拦截器可做任何后期处理。

  • 最后,由视图显示结果并返回给用户。

节选自(w3cschool | 原文:https://www.w3cschool.cn/struts_2/struts_architecture.html)

说白了就一框架

看了那么多,我们来了解下struts2的漏洞,在2013年6月底发布的Struts 2.3.15版本被曝出存在重要的安全漏洞,Struts使用的Jakarta解析文件上传请求包不当,当远程攻击者构造恶意的Content-Type,可能导致远程命令执行。实际上在default.properties文件中


,struts.multipart.parser的值有两个选择,分别是jakarta和pell(另外原本其实也有第三种选择cos)。其中的jakarta解析器是Struts 2框架的标准组成部分。默认情况下jakarta是启用的,所以该漏洞的严重性需要得到正视。

影响范围

Struts 2.3.5 – Struts 2.3.31

Struts 2.5 – Struts 2.5.10

详情请参考文章:

https://www.freebuf.com/articles/web/31039.html

https://www.freebuf.com/vuls/120451.html

https://www.freebuf.com/vuls/128668.html

https://help.aliyun.com/noticelist/articleid/20273580.html

看到这你肯定想知道如何修复,很简单,升级就完事了,没必要在源码上自作聪明。 


漏洞浮现

禁止非法应用,出事后果自负

为了更好地模拟实验,我准备了一台虚拟机并做了内网穿透,配置如下

操作系统:CentOS7

开放端口:8008,8081

安装服务:Tomcat7,Struts2.3.,Apache2

公网地址:http://struts2.icecliffs.cn/ (已关闭)

环境搭建我就不用多说了吧,都懂,实在不会百度或者docker自己安装,软件包可以参考北京理工大学的镜像站:http://mirror.bit.edu.cn/web/
简单编写一个action的helloWorld模板,action是struts2的一个动作,要一个一个写的,导包和写模块困扰了我一段时间,经过一番折磨,整出来了一个helloworld模块,现在网站目录如下

root@zqx#: tree

├── error.jsp
├── example
│ ├── HelloWorld.jsp
│ ├── Login.jsp
│ ├── Menu.jsp
│ ├── Missing.jsp
│ ├── Register.jsp
│ └── Welcome.jsp
├── index.html
├── META-INF
│ ├── LICENSE.txt
│ ├── MANIFEST.MF
│ ├── maven
│ └── NOTICE.txt
└── WEB-INF
├── classes
├── lib
├── src
└── web.xml
用poc跑一下
发现漏洞直接getshell

 

点赞

发表评论

电子邮件地址不会被公开,只有你知道( ̄▽ ̄)"