S2-052 远程代码执行漏洞检测与利用

2024-03-14 00:10

本文主要是介绍S2-052 远程代码执行漏洞检测与利用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

调试环境搭建

使用官方的rest-sample即可,下载2.5.12版本的源码https://github.com/apache/struts/archive/STRUTS_2_5_12.zip,然后将apps下面的rest-showcase源码脱下来。

Eclipse中新建一个maven工程,web.xml,pom.xml和struts.xml如下:

pom.xml

<!-- struts2依赖包 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.12</version>
</dependency>
<!-- struts restful 依赖包 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.5.12</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-rest-plugin</artifactId>
<version>2.5.12</version>
</dependency>

struts.xml(src/main/resources/下)


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- Overwrite Convention -->
<constant name="struts.convention.action.suffix" value="Controller"/>
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<constant name="struts.convention.default.parent.package" value="rest-default"/>
<constant name="struts.convention.package.locators" value="action"/>
<constant name="struts.convention.result.path" value="/WEB-INF/"/>
</struts>

其他的action文件、jsp文件复制过来到maven工程的对应目录即可,右键启动项目,然后浏览器可以访问到:http://127.0.0.1:8080/struts2-052/orders,说明调试环境搭建成功。

漏洞分析

根据该漏洞发现者文章https://lgtm.com/blog/apache_struts_CVE-2017-9805所述,是一个叫ContentHandler的东西有问题。

在2.5.12源码中搜索这个字符串:

在struts-plugin.xml配置了很多的bean,这些bean按照content-type进行分类,并唯一指定一个具体的Handler。这些Handler都实现了ContentTypeHandler接口。

从API DOC上描述

Handles transferring content to and from objects for a specific content type

来看,这个ContentTypeHandler实际上是按照Content-type的不同,将请求的数据丢给指定的子类进行处理,具体是怎么处理的呢,以XStreamHandler为例:

这里实际上就是把XML和java对象之间进行转化,比较专业的词汇叫“marshal“和”“unmarshal”。从以往的例子看,这种情况导致的命令执行也不是一次两次了,json转换库如fastjson,jackson都有过漏洞,

这次换成了Struts2里的XML的对象转换。其实就是XStreamHandler的toObject方法中触发了漏洞,我们就先在这行代码下断点,执行poc之后,会发现断点生效了。

我们来看看调用函数流程信息:

在Restful模式下,对Action的路由处理是使用Rest系列的代码,这里是ContentTypeInterceptor类调用的XStreamHandler方法。我们来看看上层代码中的intercept方法:

首先是从HttpServletRequest里判断ContentType,可以很清晰的看到,通过ContentType将request的字节流分发给对应的Handler进行处理。当ContentType为application/xml的时候,

很自然的就分发给了XStreamHandler这个类来处理,这个类没有进行任何校验,直接进行了转换。我们可以用marsshalsec工具来生成payload。

(1)下载源码https://github.com/mbechler/marshalsec

(2)maven编译 mvn clean package -DskipTests

(3)去target目录下找到jar文件,执行:
 

java -cp marshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.XStream ImageIO "calc" > 1.txt

然后将这段XML用POST发给struts2-rest,当然,ContentType要设置为xml的,然后就可以触发了。当命令中有空格时,提交多个<string>节点即可。

后话

关于如何从XML到命令执行的过程,实际上是Moritz Bechler大神的一个paper,https://github.com/mbechler/marshalsec/blob/master/marshalsec.pdf,这个paper随着marshalsec工具发布。

这里只分析Struts2的漏洞原因,关于XML->RCE过程,大家可以仔细阅读这个paper进行深入了解。
 

参考

https://lgtm.com/blog/apache_struts_CVE-2017-9805

 

这篇关于S2-052 远程代码执行漏洞检测与利用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/806660

相关文章

修复已被利用的高危漏洞! macOS Sequoia 15.6.1发布

《修复已被利用的高危漏洞!macOSSequoia15.6.1发布》苹果公司于今日发布了macOSSequoia15.6.1更新,这是去年9月推出的macOSSequoia操作... MACOS Sequoia 15.6.1 正式发布!此次更新修复了一个已被黑客利用的严重安全漏洞,并解决了部分中文用户反馈的

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译