看我如何利用Drupal漏洞并通过恶意图片实现一键RCE

时间:2022-06-23
本文章向大家介绍看我如何利用Drupal漏洞并通过恶意图片实现一键RCE,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

近期,Drupal发布了两个针对7.x和8.x版本的关键漏洞修复补丁。攻击者可以利用这两个漏洞来实现远程代码执行,但他们首先要将恶意图片上传至远程服务器,并通过一系列伪造链接来欺骗已认证的网站管理员来帮助他们实现代码执行。虽然这种方式比较“曲折”,但这也已经足够了。

漏洞利用演示视频

这两个漏洞编号分别为ZDI-19-130和ZDI-19-291,将这两个漏洞组合使用后,攻击者将能够实现一键式代码执行。在账户注册的过程中,攻击者可以将嵌入了恶意代码的图片以头像的形式上传,也可以在论坛的评论区上传。已禁用用户注册和用户评论功能的Drupal网站不会受到这种攻击的影响,请广大网站管理员尽快将自己的Drupal站点升级为最新版本。

其中,ZDI-19-130是一个PHP反序列化漏洞,该漏洞将允许攻击者利用网站管理员来实现远程代码执行,而ZDI-19-291是一个持久型XSS漏洞,攻击者可以利用该漏洞强迫网站管理员发送恶意请求,并触发漏洞ZDI-19-130。

关于ZDI-19-130的利用原理可以参考Thomas在今年Black Hat上的演讲【白皮书】,或参考Thomas在BSidesMCR上的 演讲内容。简而言之,这是一种通过Phar文件触发PHP反序列化漏洞的一种新方法,PHP Phar文件的元数据会以PHP序列化对象的形式存储,针对Phar文件的文件操作会触发服务器在已存储的元数据上执行反序列化-unserialization()操作,并最终导致远程代码执行。

漏洞ZDI-19-291则是Drupal在处理已上传文件的文件名过程中存在的一个漏洞,该漏洞与PCRE-Perl兼容的正则表达式有关。当用户上传文件时,Drupal会使用PRCE来修改文件名,以避免文件名重复。但是如果多次上传文件,Drupal就会删除文件的扩展名,并导致攻击者可以上传任意HTML文件。

漏洞分析

攻击第一阶段:ZDI-19-291

这份PHP代码段可以用来测试Drupal的部分源码:

https://github.com/drupal/drupal/blob/def290c1fe41805a419e006bb120db85755201e3/core/includes/file.inc#L775

根据源码的注释,下面这段代码会尝试删除文件名中值小于0x02的ASCII控制字符,并将其替换成下划线(‘_‘)。代码中的’/u’表示PHP引擎会将PCRE表达式以及相关字符串以UTF-8编码进行处理:

攻击第一阶段测试结果:

其中,xFF字节已经失效,x80字节没有有效的起始字节,PHP抛出了一个“PREG_BAD_UTF8_ERROR”错误,$basename变量被设置为了NULL。

在Drupal源码中,执行完pregreplace()后不会进行错误检查。当一个带有无效UTF-8字符文件名的图片上传至Drupal两次时,该函数将会使用$destination,也就是’’.$counter++的结果。

这样一来,攻击者就可以通过用户注册功能向Drupal网站上传一个GIF图片,然后Drupal会用以下方式存储图片:

/sites/default/files/pictures/<YYYY-MM>/_0

而不是默认存储方式:

/sites/default/files/pictures/<YYYY-MM>/profile_pic.gif

虽然应用会对上传图片的属性进行检测,但添加“GIF”或“.gif”字样已经可以满足检测条件了。

另一种方法是通过评论编辑器上传恶意GIF文件。这种情况下,图片会被存储至/sites/default/files/inline-images/_0。但是,攻击者在评论某篇文章之前注册一个用户账号。

攻击者将恶意GIF/HTML文件上传至Drupal服务器之后,可以欺骗浏览器将文件以HTML页面的形式呈现出来:

此时,攻击者将可以在目标Drupal站点上实现持久化XSS攻击了。通过利用这种漏洞,攻击者将能够强迫拥有管理员权限的用户发送攻击第二阶段的恶意请求。

可执行PoC:

https://github.com/thezdi/PoC/blob/master/Drupal/drupal_xss_rce.zip

漏洞利用-第二阶段:ZDI-19-130

ZDI-19-130是一个反序列化漏洞,可以通过/admin/config/media/file-system节点的file_temporary_path请求参数来触发。攻击者还可以指定“phar://”流封装器来让file_temporary_path请求参数指向攻击者上传至Drupal服务器的恶意Phar文档。

下面的system_check_directory()函数是表单回调函数,负责处理用户请求。根据我们的研究,“!is_dir($directory)”可以直接让PHP触发针对Phar文档中元数据的反序列化操作。通过POP链利用技术,攻击者将能够使用专门制作的Phar文档来在Web服务器中实现任意代码执行。

漏洞利用-第二阶段:Polyglot文件

在利用ZDI-19-130之前,我们需要上传一个Phar文档,我们可以在用户注册阶段将JPEG/Phar Polyglot文件以用户头像的形式上传。下面给出的是一个JPEG/PharPolyglot文件样本,它会执行cat /etc/passwd命令,并利用漏洞ZDI-19-130。

Phar文档跟JAR文件很像,它是一个组件包集合文件。在我们的漏洞利用场景中,使用的是基于TAR的Phar文档。

为了创建Polyglot文件,攻击者需要选择一个JPEG图片向量。基于TAR的恶意Phar文档需要存储在JPEG文件开头的JPEG注释域中。需要注意的是,我们需要修复TAR文件的校验码,否则TAR文件会崩溃。

* 参考来源:thezdi,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM