WordPress 5.0.0远程代码执行

释放双眼,带上耳机,听听看~!

点击上方“凌天实验室”可订阅哦!



本文详细介绍了路径遍历和本地文件包含漏洞的组合如何导致WordPress核心中的远程代码执行。这个漏洞在WordPress核心中持续了6年多。


影响



在目标WordPress站点上获得至少具有作者权限的帐户访问权限的攻击者可以在底层服务器上执行任意PHP代码,从而导致完全远程接管。我们向WordPress安全团队发送了有关WordPress核心中另一个漏洞的详细信息,该漏洞可使攻击者准确地访问当前未修复的任何WordPress站点。


谁受到影响?


4.9.9和5.0.1版本中的另一个安全补丁使本文中解释的漏洞不可利用。但是,路径遍历仍然是可能的,并且当前是未修补的。任何安装了插件的WordPress站点如果处理不正确的post meta条目,都会使开发成为可能。在过去的WordPress安全月准备期间,我们已经看到有数百万活动安装的插件会犯这种错误。


根据WordPress的下载页面,超过33%的网站使用该软件。考虑到插件可能会重新引入这个问题,并考虑到过时的站点等因素,受影响的安装数量仍然是数百万。


技术分析


我们领先的sast解决方案rips在3分钟内通过单击按钮自动检测到路径遍历和本地文件包含漏洞。然而,乍一看,这些漏洞似乎不可利用。事实证明,利用这些漏洞更为复杂,但也是可能的。



背景-WordPress图像管理


当图像上载到WordPress安装时,首先将其移动到上载目录(wp content/uploads)。WordPress还将在数据库中创建对图像的内部引用,以跟踪元信息,如图像所有者或上载时间。


此元信息在数据库中存储为发布元条目。每个条目都是一个键/值对,分配给一个特定的ID。



在本例中,图像已被分配为post_id 50。如果用户希望在将来使用或编辑具有所述ID的图像,WordPress将查找匹配的wp_附加的文件元条目并使用其值,以便在wp content/uploads目录中找到该文件。


核心问题-可以覆盖发布的元条目


WordPress4.9.9和5.0.1之前的这些后置元条目的问题在于,可以修改任何条目并将其设置为任意值。

当图像被更新(例如,它的描述被更改)时,将调用edit_post()函数。此函数直接作用于$_post数组。



可以看到,可以注入任意的后置元条目。由于没有对修改的条目进行检查,攻击者可以更新wp_附加的文件元条目并将其设置为任何值。这不会以任何方式重命名文件,只会更改WordPress在编辑图像时要查找的文件。这将导致稍后的路径遍历。


通过修改的post meta进行路径遍历


路径遍历发生在wp_crop_image()函数中,该函数在用户裁剪图像时被调用。


函数获取要裁剪的图像的ID($attachment_id),并从数据库中获取相应的wp_attached_file post meta条目。


记住,由于edit_post()中的缺陷,$SRC_文件可以设置为任何内容。



在下一步中,WordPress必须确保图像确实存在并加载它。WordPress有两种加载给定图像的方法。第一种方法是简单地查找wp content/uploads目录(下一个代码段的第2行)中的wp-attached-file-post元条目提供的文件名。


如果该方法失败,WordPress将尝试从自己的服务器下载图像作为回退。为此,它将生成一个下载URL,包含wp content/uploads目录的URL和存储在wp-attached-file-post-meta条目(第6行)中的文件名。


举一个具体的例子:如果存储在wp_-attached_file post meta entry中的值是evil.jpg,那么Wordpress将首先尝试检查文件wp content/uploads/evil.jpg是否存在。否则,它将尝试从以下URL下载文件:https://targetserver.com/wp-content/uploads/evil.jpg。


尝试下载图像而不是在本地查找图像的原因是,当访问URL时,某个插件会动态生成图像。


请注意,这里不进行任何消毒。WordPress只需将上传目录和URL与$SRC_文件用户输入连接起来。


一旦WordPress通过wp_get_image_editor()成功加载了一个有效的图像,它将剪切该图像。



然后,裁剪后的图像被保存回文件系统(不管它是否被下载)。得到的文件名将是由攻击者控制的get_post_meta()返回的$SRC_文件。对生成的文件名字符串所做的唯一修改是,文件的基名称前面加上了裁剪(下一个代码段的第4行)。要遵循evil.jpg的示例,生成的文件名将被裁剪为cropped-evil.jpg。


然后,wordpress通过wp_mkdir_p()(第6行)在结果路径中创建任何还不存在的目录。


然后使用图像编辑器对象的save()方法将其最终写入文件系统。save()方法也不对给定的文件名执行路径遍历检查。



这个想法


到目前为止,我们已经讨论了可以确定将哪个文件加载到图像编辑器中,因为没有执行任何清理检查。但是,如果文件不是有效的图像,则图像编辑器将引发异常。第一个假设可能是,只有在上载目录之外才能裁剪图像。


但是,如果没有找到wordpress试图下载图像,则会导致远程代码执行漏洞。



我们的想法是将“wp”附加的文件设置为evil.jpg?shell.php,这将导致对以下URL发出HTTP请求:https://targetserver.com/wp-content/uploads/evil.jpg?PHP。此请求将返回一个有效的图像文件,因为在?在此上下文中被忽略。生成的文件名将是evil.jpg?PHP。


但是,尽管图像编辑器的save()方法不针对路径遍历攻击进行检查,但它会将要加载的图像的mime类型的扩展附加到结果文件名中。在这种情况下,得到的文件名将是evil.jpg?裁剪的shell.php.jpg。这将使新创建的文件再次无害化。


但是,仍然可以使用一个有效载荷(如evil.jpg)将生成的图像植入任何目录。/../../evil.jpg.邪恶。


利用主题目录中的路径遍历-lfi


每个WordPress主题只是位于WordPress的wp content/themes目录中的一个目录,并为不同的情况提供模板文件。例如,如果博客访问者想要查看博客文章,WordPress会在当前活动主题的目录中查找post.php文件。如果找到模板,它将包含()。


为了添加额外的自定义层,可以为某些日志选择自定义模板。为此,用户必须将数据库中的“wp页面”模板post meta条目设置为这样的自定义文件名。这里唯一的限制是要包含()的文件必须位于当前活动主题的目录中。


通常,无法访问此目录,也无法上载任何文件。但是,通过滥用上述路径遍历,可以将恶意制作的图像植入当前使用主题的目录中。然后,攻击者可以创建一个新的日志,并滥用相同的bug,使他能够更新wpu附加的u文件发布元条目,以便包括()图像。通过向图像中注入PHP代码,攻击者随后获得任意远程代码执行。


绘制恶意图像-gd与imagick


WordPress支持两个PHP图像编辑扩展:gd和imagick。它们之间的区别在于imagick不剥离图像的exif元数据,其中可以存储PHP代码。gd压缩它编辑的每个图像,并剥离所有exif元数据。这是GD处理图像的结果。


但是,通过制作包含精心制作的像素的图像,仍然可以进行利用,一旦gd裁剪完图像,这些像素将被翻转,从而导致PHP代码执行。在我们研究php的gd扩展的内部结构时,在libgd中发现了一个可利用的内存损坏缺陷。(CVE-2019-69772)。


时间线



总结


这篇博文详细介绍了WordPress核心中6年多的远程代码执行。由于5.0.1和4.9.9版本中的RIPS报告的另一个漏洞的补丁,它变得不可利用。但是,路径遍历仍然是可能的,如果安装了仍允许覆盖任意post数据的插件,则可以利用路径遍历。由于攻击需要对目标WordPress站点进行某种身份验证,他决定在最初报告漏洞4个月后公开该漏洞。


凌天
实验室

凌天实验室,是安百科技旗下针对应用安全领域进行攻防研究的专业技术团队,其核心成员来自原乌云创始团队及社区知名白帽子,团队专业性强、技术层次高且富有实战经验。实验室成立于2016年,发展至今团队成员已达35人,在应用安全领域深耕不辍,向网络安全行业顶尖水平攻防技术团队的方向夯实迈进。

本篇文章来源于微信公众号凌天实验室: 凌天实验室

人已赞赏
安全教程

Kali Linux 2019.1发布 - 黑客操作系统

2019-10-13 15:19:43

安全教程

GitHub 发布即登顶的渗透教程,做个黑客或安全管理员都随你!

2019-10-13 15:20:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索