近日,wordpress发布一个安全升级补丁,修复了一个WordPress核心中的远程代码执行漏洞。代码修改细节可以参考wordpress团队于Dec 13, 2018提交的代码。据漏洞披露者文中所介绍,这个漏洞在WordPress核心中被发现已经超过6年。

漏洞简介

1、此漏洞是由目录遍历以及本地文件包含两部分组成。

2、想要利用此漏洞,需要在目标WordPress站点上拥有至少作者权限访问帐户。

漏洞分析

这里主要分析CVE-2019-8943这处漏洞

首先看下目录遍历漏洞

首先上传一张图片

img

图片会被wordpress保存至wp-content/uploads目录,但与此同时,在wp_postmeta表中仍然会有该图片信息的记录,如下图

img

在图片被编辑时

img

会向wordpress后台发送如下post请求,如下图

img

在处理post参数的过程中,有如下一处代码

img

可以看到if条件中有一个方法:update_post_meta

img

这个方法的作用是基于POST ID更新POST元字段,也就是说通过。$post_ID, $field, $value来更新数据库中的信息 以下图为例

img

此例中

$post_ID:4 $field: _wp_attached_file $value: 2019/02/Chrysanthemum-e1550648854385.jpg

123 $post_ID:4 $field: _wp_attached_file$value: 2019/02/Chrysanthemum-e1550648854385.jpg

在正常的修改图片操作中,$postarr[meta_input]值会为空,但是可以构造payload使得篡改数据库中对应value的操作得以实现。

发送payload

img

此时,$postarr[meta_input]中的key与value被遍历取出,数据库中内容被篡改

img

到此截止,我们已经成功的篡改了数据库中关于此图片文件的_wp_attached_file值,但是也是仅仅更改了数据库中的记载,文件系统中存储的实际文件名没有改变,对应的仍然是grq.jpg

接下来要进行的是目录穿越,向其他目录写入这个jpg文件

目录穿越漏洞位于wp_crop_image方法中

img

这个方法是用来剪裁图片。

需要注意的是,在wordpress中,如果直接在页面中点开一张图片,进行剪裁操作,如下图这样

img

是根本不会调用wp_crop_image方法的。

这里一定要注意,我就是在这里被坑了很久

如果想触发漏洞,调用wp_crop_image方法,那么需要自己构造数据包。

当我们对图片进行剪裁变换等操作时,正常的数据包如下

img

可以看到action=image-editor,

看下位于wp-admin\admin-ajax.php中的$core_actions_post数组

img

显而易见,想调用wp_crop_image方法,那action要为crop-image

构造数据包如下

img

既然已经成功的进入了wp_coce_Image()方法,再来看看这个目录穿越是如何执行的。

当调用该函数时,函数首先调用get_attached_file方法中

img

get_attached_file方法通过id 寻找存在数据库中 _wp_attached_file字段的value如下图。

img

这里需要提醒的是,_wp_attached_file字段中的内容我们已经通过之前步骤成功改为我们的payload,然后get_attached_file方法会将_wp_attached_file字段中的内容拼接$uploads[‘basedir’]作为图片的路径返回,这个路径会类似如下形式

img

C:\wamp64\www\wordpress4/wp-content/uploads/2019/022019/02/grq.jpg?../../evil.jpg

在得到了图片地址后

首先,wordpress将会直接加载这个地址,但显而易见,文件系统中根本无法找到这个文件。

当该方法失败后,WordPress将尝试从它自己的服务器下载图像。

如下图,在wp_get_attachment_url方法中

img

这时候的下载链接如下

http://127.0.0.1/wordpress4/wp-content/uploads/2019/02/grq.jpg?../../evil.jpg

该URL由wp-content/uploads目录和由_wp_attached_file条目所提供的文件名组成

当http协议解析这个url时,grq.jpg后面的内容会被忽略,也就是说,可以正常找到并访问该图,如下图

img

接下来,wp_coce_Image()方法会将此文件保存,但是在保存时,并没有对传入的参数进行校验,导致了目录穿越的产生

首先,先通过mkdir建立目录

img

其次,通过$editor->save将文件保存到生成目录中

img

此时我们通过构造的payload修改数据库中内容,使得其如下图形式

img

那么最终会在themes\currentactivetheme目录中生成我们的jpg

例如cropped-evil.jpg,因为是通过剪裁后的图片,会有一个cropped前缀

接下来就是代码执行部分

WordPress的主题位于wp-content / themes目录中并为不同的案例提供模板文件。正常情况下,是无法通过web方式访问、写入此目录。但是截止此时,我们通过目录穿越,已经可以将我们的恶意图像文件插入此目录。然后通过加载这个themes,即可执行恶意构造好的图片payload,这个漏洞详情可CVE-2019-6977。 影响范围WordPress before 4.9.9 and 5.x before 5.0.1

img

影响范围

WordPress before 4.9.9 and 5.x before 5.0.1