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

单次点击实现远程代码执行:内容管理框架Drupal恶意图片上传漏洞利用链分析

来源:本站整理 作者:佚名 时间:2019-04-22 TAG: 我要投稿

概述
最近,Drupal发布了一组针对7.x和8.x版本的关键补丁。在更新中,包含对一组漏洞的修复,这些漏洞是我们最初在参与针对该目标的漏洞激励计划时提交的。这些漏洞可以实现代码执行,但前提条件是攻击者必须首先将三个恶意“图像”上传至目标服务器,并诱导经过身份验证的站点管理员点击精心设计的链接来实现代码执行。这并不是一个顺利的漏洞利用途径,因此我们也没有获得TIP的奖项。但是,这些漏洞可以被别有用心的攻击者用来发起有针对性的攻击,因此我们将对这些漏洞进行详细分析。下面是其中一个漏洞的演示视频:
https://youtu.be/GT5LCO7D3SE
通过对两个漏洞的组合利用,可以实现单次点击后的代码执行,这两个漏洞分别是ZDI-19-130以及Sam Thomas发现的ZDI-19-291。通过在注册用户帐户时上传个人资料图片,或者在评论中上传图像,可以轻松实现任意图像上传。当然,禁用用户注册和用户评论的Drupal站点不容易受到这些攻击媒介的影响,但我们还是建议这部分用户将Drupal服务器更新到最新版本。
ZDI-19-130是一个PHP反序列化漏洞,通过利用该漏洞,攻击者可以获取站点Admin权限的远程代码执行。ZDI-19-291是一个持久的XSS漏洞,攻击者可以利用该漏洞来强制向管理员发出恶意请求,从而触发ZDI-19-130漏洞。
ZDI-19-130的漏洞利用原理,是基于Thomas今年早些时候在Black Hat上发表的演讲(PDF),各位读者可以阅读该演讲的白皮书,也可以在这里观看他在BSidesMCR上发表过的同一个Black Hat演讲的视频。在演讲中,Thomas详细介绍了他发现的一个新的载体,通过Phar压缩包触发PHP反序列化漏洞。实质上,PHP Phar压缩包的元数据以PHP序列化对象的形式存储。Phar压缩包上的文件操作可以触发存储的元数据上的unserialization()(反序列化),最终可能导致代码执行。
另一方面,ZDI-19-291是处理上传文件名过程中与Perl兼容的正则表达式(PCRE)相关的漏洞。当用户上传文件时,Drupal使用PRCE对文件名进行修改,以避免名称重复。在过去的8年中,包含PCRE漏洞的提交始终存在于代码库中,并且可能导致Drupal在多次上传时删除文件名的扩展名,从而允许攻击者上传任意HTML文件。
回顾:PHP对象注入起源
早在2009年,也就是iPhone 3GS发布的同一年,Stefan Esser(@i0n1c)就证明PHP反序列化过程容易受到对象注入的影响,并且可以通过类似于ROP的代码重用技术(PDF)来进一步利用。后来,他创造了“面向属性编程”(Property Oriented Programming)(PDF)这一术语。在演示之前,PHP对象反序列化漏洞主要都是拒绝服务漏洞,或者难以利用的内存损坏漏洞。
类似于ROP的首次亮相,POP链的构建需要手工进行,并且过程较为繁琐,没有太多的工具或文献可以用来参考。我所知道的唯一参考资料,就是Johannes Dahse等人在2014年发布的关于自动化POP链生成的优秀文章(PDF)。但遗憾的是,他们从未对外向公众们发布过他们的工具。
回顾:POP漏洞利用商品化
PHP Generic Gadget Chains(PHPGGC)在2017年7月发布了.PHP Generic Gadget Chain库,它可以被认为类似于ysoserial Java反序列化漏洞Payload库。随着PHP框架和库的普及,以及PHP自动加载功能的帮助,PHP反序列化漏洞的利用最终变得非常简单。
漏洞利用:第一阶段(ZDI-19-291)
我们使用下面的PHP代码,来测试Drupal源代码中的一部分。根据源代码中的注释,下面的代码段尝试分离文件名中ASCII控制字符的部分,这部分字符值小于0x20,并用下划线“_”字符替换它们。“/u”模式修饰符使得PHP引擎将PCRE模式和主字符串视为使用了UTF-8编码。据我们推测,该修饰符已经被添加到PCRE模式中,从而确保与UTF-8的兼容性。

大家普遍会认为,UTF-8字符具有两个字节的长度。但与之相反,有效的UTF-8代码点可能是1-4个字节长度。UTF-8旨在向后兼容ASCII字符集。因此,在单字节代码点范围内,ASCII(8位字节0x00到0x7F)和UTF-8定义存在交集。0x80到0xF4之间的八位字节用于多字节UTF-8代码点编码。根据RFC3629中的标准,C0、C1、F5到FF的八位字节值永远不会出现在有效的UTF-8字符串中。
漏洞利用:第一阶段(测试)

如果\xFF字节无效,并且\x80字节没有有效的前导字节,那么PHP将会抛出PREG_BAD_UTF8_ERROR错误,并且每个文档的$basename变量都将设置为NULL。
在Drupal源代码中,在preg_replace()调用之后,不执行任何错误检查。当包含无效UTF-8字符文件名的图像两次上传至Drupal时,该函数将会运行,并将$basename变量松散地视为空字符串。最后,函数返回$destination,它被有效地设置为’_’.$counter++的结果。

有了这个原语之后,攻击者可以通过用户注册功能,将GIF格式的个人资料图片上传至Drupal站点,并导致其扩展名被删除。Drupal现在将会使用如下路径和文件名:
/sites/default/files/pictures//_0
来替换:
/sites/default/files/pictures//profile_pic.gif
尽管对上传的个人资料图片进行了检查,但在带有“.gif”扩展名的HTML文件中添加字符“GIF”,即可满足通过该检查所需的要求。
同时,还有另一种方法能够上传恶意GIF文件,就是评论编辑器。在这种情况下,图像将在/sites/default/files/inline-images/_0中提供。然而,在默认Drupal配置的情况下,攻击者需要在评论的帖子发表之前注册用户帐户。

[1] [2]  下一页

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