WordPress 5.0.0 远程代码执行漏洞安全通告

发布时间 2019-02-21

漏洞编号和级别


CVE编号:暂无,危险级别:高危, CVSS分值:官方未评定


影响范围


受影响版本: 

WordPress 5.0.0


漏洞概述


2月19日,国外安全人员在博客中公开了WordPress中存在的一个远程代码执行漏洞,该漏洞已经在WordPress core中隐藏了6年未被发现。


该漏洞本质上是由一个目录遍历漏洞以及一个本地文件包含漏洞组合利用而导致的一个远程代码执行漏洞。


当攻击者获取到WordPress站点author及以上权限的账户后,即可利用该漏洞在底层服务器上执行任意PHP代码,从而实现完全远程接管服务器的目的。


因WordPress 4.9.9和5.0.1其他安全补丁所致,文件包含漏洞仅有5.0.0单一版本可利用,而路径遍历漏洞仍可使用且当前仍未打补丁。任何安装了此插件的WordPress站点都会错误地处理Post Meta条目,这样仍然可以进行利用。


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


漏洞细节


1. 漏洞核心原理-“Post Meta”的条目可以被覆盖


在WordPress 4.9.9 之前的版本以及WordPress  5.0.1之前的版本,WordPress文件上传产生的Post Meta的所有条目皆可被修改,并且他们的value值可以任意重置。当一张图片被更新的时候,将会调用/wp-admin/include/post.php中edit_post()函数。



我们可以通过edit_post()函数向数据库注入任意Post Meta条目。由于系统未对Post Meta条目的修改进行检测,因此攻击者可以更新_wp_attached_file元条目并将其设置为任何值。这不会重命名任何文件,它只会更改WordPress在编辑图像时要查找的文件。这一点将导致稍后的路径遍历。


2. 通过修改“Post Meta”的来实现路径遍历


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



该函数将图像的ID带到crop($attachment_id)中,并从数据库中获取相应的Post Meta条目_wp_attached_file的值。由于之前edit_post()存在的缺陷,$src_file可以设置为任何值。由于缺陷edit_post(),$src_file可以设置为任何值。


在下一步中,WordPress必须确保图像实际存在并加载它。WordPress有两种加载给定图像的方法。第一种是简单地查找目录中Post Meta条目中_wp_attached_file提供的文件名wp-content/uploads。


如果该方法失败,WordPress将尝试从其自己的服务器下载图像作为后备。为此,它将生成一个下载URL,该URL包含wp-content/uploads目录的URL 和存储在Post Meta条目中_wp_attached_file的文件名。


举一个具体的例子:如果存储在Post Meta条目中_wp_attached_file 的值是evil.jpg,那么WordPress将首先尝试检查文件wp-content/uploads/evil.jpg是否存在。


如果没有,它会尝试从以下URL下载文件:


https://targetserver.com/wp-content/uploads/evil.jpg


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


WordPress将简单地将上传目录和URL与$src_file的用户输入连接起来。一旦WordPress成功加载了有效图像wp_get_image_editor(),它将裁剪图像。



裁剪结束后,WordPress会将裁剪后的图像保存回文件系统(无论是否下载)。生成的文件名将是$src_file由get_post_meta()攻击者控制的返回文件。对结果文件名字符串进行的唯一修改是在文件的基本名称加前缀cropped-。为了遵循示例evil.jpg,生成的文件名将是cropped-evil.jpg。


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


最后使用save()方法将其最终写入文件系统。该save()方法还不对给定的文件名执行路径遍历检查。



3. 实现RCE


综上,可以确定哪个文件被加载到图像编辑器中(因未进行处理)。但是,如果文件不是有效图像,图像编辑器将会抛出异常。故而,只能在上传目录之外裁剪图像。


那么如果未找到所需图像,WordPress会尝试下载,这就导致了RCE。



设置_wp_attached_file为evil.jpg?shell.php,这将导致对以下URL发出HTTP请求:https://targetserver.com/wp-content/uploads/evil.jpg?shell.php。此请求将返回有效的图像文件,因为?在此上下文中忽略了所有内容。生成的文件名将是evil.jpg?shell.php。


虽说save()图像编辑器的方法不会检查是否存在路径遍历,但它会将正在加载的图像的mime类型的扩展名附加到生成的文件名中。在这种情况下,结果文件名将是evil.jpg?cropped-shell.php.jpg。这使得新创建的文件再次无害。


但是,仍可以通过使用诸如的Payload将生成的图像植入任何目录evil.jpg?/../../evil.jpg。


4. 利用主题目录中的路径遍历-本地文件包含


根据之前的路径遍历,我们可以利用主题系统的本地文件包含来最终实现远程代码执行。每个WordPress主题只是一个位于WordPress目录中的wp-content/themes目录,为不同的案例提供模板文件。例如,如果博客的访问者想要查看博客帖子,则WordPress会在当前活动主题的目录中查找一个post.php文件。如果它找到了对应模板,那将包含该模板。


为了添加额外的自定义层,可以为某些帖子选择自定义模板。为此,用户必须将数据库中的Post Meta条目的_wp_page_template设置为自定义文件名。这里唯一的限制是要包含的文件必须位于当前活动主题的目录中。



通常,用户对于当前活动主题的目录无法访问此目录,也无法上传该文件。但是,通过使用上述路径遍历,就可以将恶意制作的图像植入当前使用的主题的目录中。然后攻击者可以创建一个新帖子也使用上述的路径遍历错误,最终能够更新Post Meta条目中的_wp_attached_file,以便可以包含该图片。通过将PHP代码注入图片,攻击者就可以远程执行任意代码。


修复建议


Wordpress官方已经在 WordPress 5.0.1更新了安全补丁,用户可以更新至WordPress 5.0.1之后的版本:https://wordpress.org/download/


参考链接


https://blog.ripstech.com/2019/wordpress-image-remote-code-execution/