WordPress 5.0.0远程代码执行漏洞预警
在2019年2月19日,国外安全人员在博客中的披露了一则Wordpress 5.0.0版本远程代码执行漏洞。该漏洞本质上是由一个目录遍历漏洞以及一个本地文件包含漏洞组合利用而导致的一个远程代码执行漏洞。当攻击者获取到WordPress站点具有一定访问权限的账户后,即可利用该漏洞在底层服务器上执行任意PHP代码,从而实现完全远程接管服务器的目的。
WordPress组件介绍
WordPress是使用PHP语言开发的CMS系统,是网络上最受欢迎的CMS之一,也是一款个人博客系统。根据w3tech的资料显示,约有30%的网站在使用它,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站或者使用自己的博客。
WordPress官方支持中文版,同时有爱好者开发的第三方中文语言包,如wopus中文语言包。WordPress拥有成千上万个各式插件和不计其数的主题模板样式。
漏洞描述
WordPress 5.0.0远程代码执行漏洞产生的背景是利用WordPress文件上传的一个特性。当WordPress上传一张图片时,首先这张图片会被放置到uploads目录下(wp-content/uploads),同时WordPress还将创建对数据库中图像的内部应用,以来跟踪上传文件的源信息,例如图像的上传时间或者图像的所有者。该源信息将会被作为PostMeta条目存储在数据库中。这些信息都被保存在wp_postmeta表中,数据是以键值对形式保存。如下图:
如果之后用户需要修改或者使用对应ID的文件,WordPress将查找匹配的_wp_attached_file源条目并使用它的值以便在wp-content/uploads目录中查找到该文件。
该漏洞通过对Post Meta条目的路径遍历以及利用WordPress主题库进行本地文件包含,最终覆盖掉一个特定的Post Meta条目,可以实现将原本文件的Post Meta绑定到一个恶意文件上,导致远程代码执行漏洞。
漏洞分析
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. 最终利用本地文件包含来实现远程代码执行
根据之前的路径遍历,我们可以利用主题系统的本地文件包含来最终实现远程代码执行。每个WordPress主题只是一个位于WordPress目录中的wp-content/themes目录,为不同的案例提供模板文件。例如,如果博客的访问者想要查看博客帖子,则WordPress会在当前活动主题的目录中查找一个post.php文件。如果它找到了对应模板,那将包含该模板。
为了添加额外的自定义层,可以为某些帖子选择自定义模板。为此,用户必须将数据库中的Post Meta条目的_wp_page_template设置为自定义文件名。这里唯一的限制是要包含的文件必须位于当前活动主题的目录中。
通常,用户对于当前活动主题的目录无法访问此目录,也无法上传该文件。但是,通过使用上述路径遍历,就可以将恶意制作的图像植入当前使用的主题的目录中。然后攻击者可以创建一个新帖子也使用上述的路径遍历错误,最终能够够更新 Post Meta条目中的_wp_attached_file,以便可以包含该图片。通过将PHP代码注入图片,攻击者就可以远程执行任意代码。
影响范围
目前据统计,在全球范围内对互联网开放Wordpress网站的资产数量多达12833569台,其中归属中国地区的受影响资产数量为18万以上。
目前受影响的WordPress版本:
Wordpress 5.0.0
修复建议
Wordpress官方已经在 WordPress 5.0.1更新了安全补丁,用户可以更新至WordPress 5.0.1之后的版本:
https://wordpress.org/download/
参考链接
https://blog.ripstech.com/2019/wordpress-image-remote-code-execution/
在2019年2月19日,国外安全人员在博客中的披露了一则Wordpress 5.0.0版本远程代码执行漏洞。该漏洞本质上是由一个目录遍历漏洞以及一个本地文件包含漏洞组合利用而导致的一个远程代码执行漏洞。当攻击者获取到WordPress站点具有一定访问权限的账户后,即可利用该漏洞在底层服务器上执行任意PHP代码,从而实现完全远程接管服务器的目的。
WordPress组件介绍
WordPress是使用PHP语言开发的CMS系统,是网络上最受欢迎的CMS之一,也是一款个人博客系统。根据w3tech的资料显示,约有30%的网站在使用它,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站或者使用自己的博客。
WordPress官方支持中文版,同时有爱好者开发的第三方中文语言包,如wopus中文语言包。WordPress拥有成千上万个各式插件和不计其数的主题模板样式。
漏洞描述
WordPress 5.0.0远程代码执行漏洞产生的背景是利用WordPress文件上传的一个特性。当WordPress上传一张图片时,首先这张图片会被放置到uploads目录下(wp-content/uploads),同时WordPress还将创建对数据库中图像的内部应用,以来跟踪上传文件的源信息,例如图像的上传时间或者图像的所有者。该源信息将会被作为PostMeta条目存储在数据库中。这些信息都被保存在wp_postmeta表中,数据是以键值对形式保存。如下图:
如果之后用户需要修改或者使用对应ID的文件,WordPress将查找匹配的_wp_attached_file源条目并使用它的值以便在wp-content/uploads目录中查找到该文件。
该漏洞通过对Post Meta条目的路径遍历以及利用WordPress主题库进行本地文件包含,最终覆盖掉一个特定的Post Meta条目,可以实现将原本文件的Post Meta绑定到一个恶意文件上,导致远程代码执行漏洞。
漏洞分析
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在编辑图像时要查找的文件。这一点将导致稍后的路径遍历。 copyright 无奈人生
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. 最终利用本地文件包含来实现远程代码执行
根据之前的路径遍历,我们可以利用主题系统的本地文件包含来最终实现远程代码执行。每个WordPress主题只是一个位于WordPress目录中的wp-content/themes目录,为不同的案例提供模板文件。例如,如果博客的访问者想要查看博客帖子,则WordPress会在当前活动主题的目录中查找一个post.php文件。如果它找到了对应模板,那将包含该模板。
为了添加额外的自定义层,可以为某些帖子选择自定义模板。为此,用户必须将数据库中的Post Meta条目的_wp_page_template设置为自定义文件名。这里唯一的限制是要包含的文件必须位于当前活动主题的目录中。
通常,用户对于当前活动主题的目录无法访问此目录,也无法上传该文件。但是,通过使用上述路径遍历,就可以将恶意制作的图像植入当前使用的主题的目录中。然后攻击者可以创建一个新帖子也使用上述的路径遍历错误,最终能够够更新 Post Meta条目中的_wp_attached_file,以便可以包含该图片。通过将PHP代码注入图片,攻击者就可以远程执行任意代码。
影响范围
目前据统计,在全球范围内对互联网开放Wordpress网站的资产数量多达12833569台,其中归属中国地区的受影响资产数量为18万以上。
目前受影响的WordPress版本:
Wordpress 5.0.0
修复建议
Wordpress官方已经在 WordPress 5.0.1更新了安全补丁,用户可以更新至WordPress 5.0.1之后的版本:
https://wordpress.org/download/
参考链接
https://blog.ripstech.com/2019/wordpress-image-remote-code-execution/
copyright 无奈人生