Struts2 REST插件远程执行命令漏洞全面分析,WAF支持检测防御

漏洞概述

2017年9月5日,Apache Struts 2官方发布一个严重级别的安全漏洞公告,该漏洞由国外安全研究组织lgtm.com的安全研究人员发现,漏洞编号为CVE-2017-9805(S2-052)。

在一定条件下,攻击者可以利用该漏洞远程发送精心构造的恶意数据包,获取业务数据或服务器权限,存在高安全风险。

漏洞基本信息

当Struts2使用REST插件使用XStream的实例xstreamhandler处理反序列化XML有效载荷时没有进行任何过滤,可以导致远程执行代码,攻击者可以利用该漏洞构造恶意的XML内容获取服务器权限。

利用条件:使用REST插件并在受影响版本范围内。
利用方式:攻击者构建恶意数据包远程利用。

漏洞影响范围:

Struts 2.3.x全系版本(根据实际测试,2.3版本也存在该漏洞)

Struts 2.5 - Struts 2.5.12

如何检测漏洞?

建议运维人员或开发人员尽快关注并资产,可以检查使用了REST插件Struts版本是否在受影响范围内。如果存在,建议您尽快按照以下方式修复漏洞。

如何规避漏洞风险?

目前官方已经发布补丁,建议升级到 Apache Struts2.5.13、Apache Struts 2.3.34版本。

阿里云云盾WAF已发布该漏洞规则,用户可以通过WAF,对利用该漏洞的攻击行为进行检测和防御,最大程度减少安全风险。

漏洞详细分析信息

本次Struts2漏洞起因:一个REST插件struts2-rest-plugin.jar用到了XStreamHandler这个类,这个类对http请求中content-type是application/xml的,调用XStream进行处理,这里先看一下污点传入,如图:


然而漏洞真正存在域XStream中,触发的根本在于javax.imageio.spi.FilterIterator类的next()会调用FilterIterator$Filter的filter(),然后javax.imageio.ImageIO$ContainsFilter的filter()方法中会用反射调用java.lang.ProcessBuilder().start()

利用代码如图所示:

之前github已经公开利用代码,上图代码只不过是攻击者的exp当中的一个payload而已,阿里云安全团队详细分析,主要是利用javax.imageio.ImageIO$ContainsFilter这个内部类,代码如图:

再来看利用代码,如图:

这里用反射将java.lang.ProcessBuilder().start()设置进入ContainsFilter对象里,以待后面漏洞触发时调用

这里用无参的constructor去newInstance对象,生成空对象,然后再用反射去填充对应属性,实际上这里就是对应xml中的每个dom属性,根据代码逻辑阿里云安全团队观察出,这里层层封装最终放到nativeString对象的value属性里,然后继续跟踪代码

最终将上面NativeString的对象放到了HashMap里,

最后对上面return的那个hashMap做toXML序列化,然后就有了今天公开的exploit。下面分析漏洞触发流程,漏洞触发就是fromXML重组对象的过程了,如图:

XStream反序列化的逻辑,实际上是解析XML DOM重组对象的一个过程,如图:

当解析到jdk.nashorn.internal.objects.NativeString这个类的时候,漏洞触发,先看下此时的调用栈,如图:

看到了熟悉的hashCode,这根groovy的反序列化利用类触发逻辑类似。

因为exp代码中我们最终将NativeString对象最终放到了hashMap里然后对hashMap进行序列化,所以当反序列化重组对象的时候,肯定会触发hashCode逻辑。继续跟踪,这里NativeString和Base64Data都属于java未公开的代码,官方未提供源码,不过可以参考openjdk的源码,先看NativeString,如图:

这里value是前面封装的Base64Data的对象,后面进入Base64Data的逻辑,如图:

这里对应依次解析xml中的dataHandler、XmlDataSource的对象,从中取出CipherInputStream的对象,同理依次解析,最终在重组javax.imageio.spi.FilterIterator对象的时候触发漏洞,这里看一下利用代码,如图:


这里cfCons.newInstance(ProcessBuilder.class.getMethod("start"), "foo")被设置为FilterIterator的filter,因为javax.imageio.spi.FilterIterator类的next()会调用FilterIterator$Filter的filter()函数,而此时FilterIterator$Filter正是javax.imageio.ImageIO$ContainsFilter,在javax.imageio.ImageIO$ContainsFilter的filter()下断,代码如图:

这里的method是正是ProcessBuilder().start()方法,此时调用栈如图:

最终触发成功,漏洞复现如下图:

分析总结

阿里云安全团队回顾Struts2 发布的官方安全公告,发现Struts2应该说是当前Java web框架里面存在安全问题最多的。

本次官方漏洞公告对外发出受影响版本为2.5.X全系,但在实际测试过程发现,2.3.X全系版本同样存在此漏洞。

作为安全运维人员和开发人员,我们需要做的就是快速获取漏洞情报,快速响应和处置,把业务风险降到最低。

来源:阿里云安全
原文链接

时间: 2024-09-20 14:36:31

Struts2 REST插件远程执行命令漏洞全面分析,WAF支持检测防御的相关文章

金融安全资讯精选 2017年第七期:Equifax 泄漏 1.43 亿用户数据,Struts2 REST插件远程执行命令漏洞全面分析,阿里云护航金砖五国大会

   [金融安全动态] 美国信用评分公司Equifax 被攻击,泄漏 1.43 亿用户数据.点击查看原文   概要:泄露的信息包括用户社会安全码.驾照信息.生日信息.信用卡数据等.据SEC(U.S. Securities and Exchange Commission)的文件,三位Euifax董事已经售出了"一小部分"所持股票.Equifax 称黑客利用了 Web 应用的漏洞访问了某些文件,Apache Struts 受到的怀疑最多.Apache Struts 项目今年爆出了两个漏洞,

游戏安全资讯精选 2017年 第七期:游戏账号窃取日益猖獗,Struts2 REST插件远程执行命令漏洞全面分析,2017世界物联网博览会IoT安全观点

  [每周游戏行业DDoS态势]     [游戏安全动态] 游戏账号窃取日益猖獗,游戏运维人员如何做好防范?点击查看原文   概要:盗取游戏账号主要目的是获取个人信息在暗网售卖,并且用账号.虚拟货币.虚拟装备来盈利,这也意味着,游戏行业越发达,安全风险也就越高,因为攻击者的盈利空间越大. 作为游戏公司,可定期引导玩家去检查自己的账户密码是否受到数据泄露的影响:如果遇到游戏账号丢失或大面积被窃取,游戏公司需要尽快做好沟通:安全运维人员要随时关注登录游戏的活跃IP,如果遇到IP增加的情况,则需要及时

CVE-2017-9805:Struts2 REST插件远程执行命令漏洞(S2-052) 分析报告

一. 漏洞概述 2017年9月5日,Apache Struts 2官方发布一个严重级别的安全漏洞公告,该漏洞由国外安全研究组织lgtm.com的安全研究人员发现,漏洞编号为CVE-2017-9805(S2-052),在一定条件下,攻击者可以利用该漏洞远程发送精心构造的恶意数据包,获取业务数据或服务器权限,存在高安全风险. 二. 漏洞基本信息 漏洞编号:CVE-2017-9805 漏洞名称: Struts2 REST插件远程执行命令漏洞(S2-052) 官方评级: ** 严重 **漏洞描述: 当S

Win2k IIS 远程执行命令漏洞

iis|执行 涉及程序: 使用双字符处理的win2k系统+ iis 描述: Win2k IIS 可远程执行命令 详细: 由于某些双字节的 win2k 系统在处理某些特殊字符时与英文版本不同,通过这些特殊字符攻击者可绕过 IIS 的目录审计远程访问计算机上的任意文件或执行任意命令: http://www.linux.org.cn/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir+c:\ 这个漏洞是由编码引起的,%c0%af 与 %c1%9c 的编码是

Sun Java Web服务器远程可执行命令漏洞

Sun Java Web服务器远程可执行命令漏洞漏洞发布时间:2000-7-13 17:41:00漏 洞 描 述:在Solaris and Windows NT的Sun Java Web Server默认安装设置下.通过公告版的样板程序的漏洞,可以远程执行任意命令.漏洞测试方法如下:下面的例子将显示如何上载和执行该代码,而在服务器上显示"Hello World".输入下面的JSP代码将打印出"Hello World":<% String s="Hel

linux下使用ssh远程执行命令批量导出数据库到本地_linux shell

前天正在跟前端的同事调试功能.服务器开好,模拟的玩家登录好,就在倒计时.这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据.好吧,我看了一下时间,11:47.心想,跟前端调试完,去吃个饭再午休一下那就下午再给吧.没想对方来一句"就导个数据库而已,要这么久么?",而且还是直接跟我上司说的.我嚓,好吧,我导.可问题来了,平时的统计是由php做的,批量部署这些是由运维做的.服务端完全没有对应的工具.而且服务器是在阿里云上的,数据库的用户是限

ssh如何远程执行命令并自动退出

ssh命令格式如下: usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec] [-O ctl

Linux下非交互式远程执行命令脚本

  Linux下非交互式远程执行命令脚本(比ssh更好的方式) openssh在每台机器上都有,ssh与scp经常出现在我们的生活中. 然而当要管理的机器规模越来越大时,ssh登陆到目标机器进行管理就变得不现实了. 虽然可以直接在ssh后面接命令的方式,进行命令的执行. 但是ssh的严格的权限认证使得我们不得不输入密码,或是建立信任关系,很难去自定义一个特定的认证方式. 基于ssh的这种不足.于是笔者就写了一个jetfire,这个工具.比ssh多的一个重要的功能就是可以自定义认证方式,顺便避免了

Linux Shell远程执行命令(命令行与脚本方式)

shell远程执行: 经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了.一下介绍两种shell命令远程执行的方法. 前提条件: 配置ssh免密码登陆 对于简单的命令: 如果是简单执行几个命令,则: ssh user@remoteNode "cd /home ; ls" 基本能完成常用的对于远程节点的管理了,几个注意的点: 双引号,必须有.如果不加双引号,第二个ls命令在本地执行 分号,两个命令之间用分号隔开 对于脚