欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

S2-057漏洞原作者自述:如何利用自动化工具发现5个RCE

来源:本站整理 作者:佚名 时间:2018-08-23 TAG: 我要投稿


2018年4月,我向Apache Struts和Struts安全团队中报告了一个新的远程执行代码漏洞——CVE-2018-11776(S2-057),在做了某些配置的服务器上运行Struts,可以通过访问精心构造的URL来触发漏洞。这一发现是我对Apache Struts的持续安全性研究的一部分。在这篇文章中,我将介绍我发现漏洞的过程以及如何利用以前的漏洞信息来获取Struts内部工作的原理,创建封装Struts特定概念的QL查询。运行这些查询会高亮显示有问题代码的结果。这些工程都托管在GitHub上,后面我们也会向此存储库添加更多查询语句和库,以帮助Struts和其他项目的安全性研究。
 
映射攻击面
许多安全漏洞都涉及了从不受信任的源(例如,用户输入)流向某个特定位置(sink)的数据,并且数据采用了不安全的处理方式——例如,SQL查询,反序列化,还有一些其他解释型语言等等,QL可以轻松搜索此类漏洞。你只需要描述各种source和sink,然后让DataFlow库完成这些事情。对于特定项目,开始调查此类问题的一种好方法是查看旧版本软件的已知漏洞。 这可以深入了解你想要查找的source和sink点。
这次漏洞发现过程中,我首先查看了RCE漏洞S2-032(CVE-2016-3081),S2-033(CVE-2016-3687)和S2-037(CVE-2016-4438)。 与Struts中的许多其他RCE一样,这些RCE涉及不受信任的输入被转为OGNL表达式,允许攻击者在服务器上运行任意代码。 这三个漏洞特别有意思,它们不仅让我们对Struts的内部工作机制有了一些了解,而且这三个漏洞实际上是一样的,还修复了三回!
这三个问题都是远程输入通过变量methodName作为方法的参数传递的造成的OgnlUtil::getValue().

这里proxy有ActionProxy的类型,它是一个接口。 注意它的定义,除了方法getMethod()(在上面的代码中用于赋值的变量methodName)之外,还有各种方法,如getActionName()和getNamespace()。 这些方法看起来像是会从URL返回信息,所以我就假设所有这些方法都可能返回不受信任的输入。 (后面的文章中,我将深入研究我对这些输入来自何处的调查。)
现在使用QL开始对这些不受信任的源进行建模:

 
识别OGNL的 sink点
现在我们已经识别并描述了一些不受信任的来源,下一步是为sink点做同样的事情。 如前所述,许多Struts RCE涉及将远程输入解析为OGNL表达式。 Struts中有许多函数最终将它们的参数作为OGNL表达式; 对于我们在本文中开始的三个漏洞,使用了OgnlUtil :: getValue(),但是在漏洞S2-045(CVE-2017-5638)中,使用了TextParseUtil :: translateVariables()。 我们可以寻找用于执行OGNL表达式的常用函数,我感觉OgnlUtil :: compileAndExecute()和OgnlUtl :: compileAndExecuteMethod()看起来更有戏。
我的描述:

 
第一次尝试
现在我们已经在QL中定义了source和sink,我们可以在污点跟踪查询中使用这些定义。 通过定义DataFlow配置来使用DataFlow库:

这里是我使用之前定义的isActionProxySource和isOgnlSink。
注意一下,我这里重载了isAdditionalFlowStep,这样它可以允许我包含污染数据被传播的额外步骤。 比如允许我将特定于项目的信息合并到流配置中。 例如,如果我有通过某个网络层进行通信的组件,我可以在QL中描述那些各种网络端的代码是什么样的,允许DataFlow库跟踪被污染的数据。
对于此特定查询,我添加了两个额外的流程步骤供DataFlow库使用。 第一个:

它包括跟踪标准Java库调用,字符串操作等的标准QL TaintTracking库步骤。第二个添加是一个近似值,允许我通过字段访问跟踪污点数据:

也就是说如果将字段赋了某个受污染的值,那么只要两个表达式都由相同类型的方法调用,对该字段的访问也将被视为污染。看下面的例子:

从上面看出,bar()中this.field的访问可能并不总是受到污染。 例如,如果在bar()之前未调用foo()。 因此,我们不会在默认的DataFlow :: Configuration中包含这个步骤,因为无法保证数据始终以这种方式流动,但是,对于挖漏洞,我觉得加上这个很有用。在后面的帖子中,我将分享一些类似于这个的其他流程步骤,这些步骤对于找bug很有帮助,但由于类似的原因,默认情况下是不包含这些步骤的。
 
初始结果和细化查询
我在最新版本的源代码上跑了一下QL,发现因S2-032,S2-033和S2-037仍然被标记了。 这些漏洞明明已经被修复了,为什么还是会报问题呢?

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载