近日,wordpress发布一个安全升级补丁,修复了一个WordPress核心中的远程代码执行漏洞。代码修改细节可以参考wordpress团队于Dec 13, 2018提交的代码。据漏洞披露者文中所介绍,这个漏洞在WordPress核心中被发现已经超过6年。
https://github.com/WordPress/WordPress/commit/7bd776bdb3f496898bba46959066c2c4aa8723d1#diff-c3d5c535db5622f3b0242411ee5f9dfd
1、此漏洞是由目录遍历以及本地文件包含两部分组成。
2、想要利用此漏洞,需要在目标WordPress站点上拥有至少作者权限访问帐户。
这里主要分析CVE-2019-8943这处漏洞
首先看下目录遍历漏洞
首先上传一张图片
图片会被wordpress保存至wp-content/uploads目录,但与此同时,在wp_postmeta表中仍然会有该图片信息的记录,如下图
在图片被编辑时
会向wordpress后台发送如下post请求,如下图
在处理post参数的过程中,有如下一处代码
可以看到if条件中有一个方法:update_post_meta
这个方法的作用是基于POST ID更新POST元字段,也就是说通过。$post_ID, $field, $value来更新数据库中的信息 以下图为例
此例中
$post_ID:4 $field: _wp_attached_file $value: 2019/02/Chrysanthemum-e1550648854385.jpg
在正常的修改图片操作中,$postarr[meta_input]值会为空,但是可以构造payload使得篡改数据库中对应value的操作得以实现。
发送payload
此时,$postarr[meta_input]中的key与value被遍历取出,数据库中内容被篡改
到此截止,我们已经成功的篡改了数据库中关于此图片文件的_wp_attached_file值,但是也是仅仅更改了数据库中的记载,文件系统中存储的实际文件名没有改变,对应的仍然是grq.jpg
接下来要进行的是目录穿越,向其他目录写入这个jpg文件
目录穿越漏洞位于wp_crop_image方法中
这个方法是用来剪裁图片。
需要注意的是,在wordpress中,如果直接在页面中点开一张图片,进行剪裁操作,如下图这样
是根本不会调用wp_crop_image方法的。
这里一定要注意,我就是在这里被坑了很久
如果想触发漏洞,调用wp_crop_image方法,那么需要自己构造数据包。
当我们对图片进行剪裁变换等操作时,正常的数据包如下
可以看到action=image-editor,
看下位于wp-admin\admin-ajax.php中的$core_actions_post数组
显而易见,想调用wp_crop_image方法,那action要为crop-image
构造数据包如下
既然已经成功的进入了wp_coce_Image()方法,再来看看这个目录穿越是如何执行的。
当调用该函数时,函数首先调用get_attached_file方法中
get_attached_file方法通过id 寻找存在数据库中 _wp_attached_file字段的value如下图。
这里需要提醒的是,_wp_attached_file字段中的内容我们已经通过之前步骤成功改为我们的payload,然后get_attached_file方法会将_wp_attached_file字段中的内容拼接$uploads[‘basedir’]作为图片的路径返回,这个路径会类似如下形式
C:\wamp64\www\wordpress4/wp-content/uploads/2019/022019/02/grq.jpg?../../evil.jpg
在得到了图片地址后
首先,wordpress将会直接加载这个地址,但显而易见,文件系统中根本无法找到这个文件。
当该方法失败后,WordPress将尝试从它自己的服务器下载图像。
如下图,在wp_get_attachment_url方法中
这时候的下载链接如下
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后面的内容会被忽略,也就是说,可以正常找到并访问该图,如下图
接下来,wp_coce_Image()方法会将此文件保存,但是在保存时,并没有对传入的参数进行校验,导致了目录穿越的产生
首先,先通过mkdir建立目录
其次,通过$editor->save将文件保存到生成目录中
此时我们通过构造的payload修改数据库中内容,使得其如下图形式
那么最终会在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
WordPress before 4.9.9 and 5.x before 5.0.1