Wordpress 5.0.0 远程代码执行漏洞分析与复现

栏目: 编程工具 · 发布时间: 5年前

内容简介:2月19日,Rips在博客上披露了一个关于Wordpress 5.0.0远程代码执行漏洞(漏洞由三部分构成:当编辑一个POST时会调用

作者:启明星辰ADLab

公众号: https://mp.weixin.qq.com/s/9DMGLOvFJUjq8MaMr9eg6A

一、漏洞介绍

2月19日,Rips在博客上披露了一个关于Wordpress 5.0.0远程代码执行漏洞( https://blog.ripstech.com/2019/wordpress-image-remote-code-execution/ )。该漏洞为CVE-2019-8942和 CVE-2019-8943组合漏洞,漏洞代码在Wordpress核心中已存在了6年。

漏洞由三部分构成:

  • (核心问题)PostMeta可以被覆盖。攻击者可以控制POST中 meta_input 字段的值,从而自由更改 wp_postmeta 表中的 meta_keymeta_value 的值。

  • 更新附件时,攻击者可自由设置对应附件的 _wp_attached_file 的值,并结合裁剪功能实现目录穿越,从而将恶意图片保存到任意目录。

  • 更新文章时,攻击者可以自由设置文章的 _wp_page_template 的值,并结合模板功能实现本地文件包含,从而最终造成代码执行。

二、漏洞分析

2.1 Post Meta覆盖(核心问题)

当编辑一个POST时会调用 edit_post 方法, wp-admin/includes/post.php:208

Wordpress 5.0.0 远程代码执行漏洞分析与复现

此时会将 $_POST 赋值给 $post_data

然后 $post_data 的值又会被带入到 wp_update_post 函数中。

Wordpress 5.0.0 远程代码执行漏洞分析与复现

跟踪 wp_update_post 函数, wp-includes/post.php:3969

Wordpress 5.0.0 远程代码执行漏洞分析与复现

在该函数末尾,都会调用 wp_insert_post 函数,并将$postarr传入到该函数中, wp_insert_post 函数略长,在该函数中有这样一段代码, wp-includes/post.php:3779

Wordpress 5.0.0 远程代码执行漏洞分析与复现

$postarr['meta_input'] 做一个遍历,并将键值都带入到 update_post_meta 函数中,该函数内容如下:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

调用了 update_metadata 函数,对应的 $meta_key$meta_value 都是攻击者可控的。该函数主要功能就是 wp_postmeta 表进行更新和插入。

wp_postmeta 表结构如下:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

通过该函数,攻击者可以自由增加和修改对应 post_idmeta_keymeta_value 的值。

2.2 目录穿越问题

目录穿越问题是以Post Meta覆盖为铺垫的。

wp-admin/includes/ajax-actions.php:3520

Wordpress 5.0.0 远程代码执行漏洞分析与复现

wp_ajax_crop_image 函数中,第一行就传入了一个 $_POST['id'] 参数。

然后还传入了 $_POST['cropDetails'] 参数。都是攻击者可控的。并将这些值带入到了 wp_crop_image 函数中,函数体如下:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

在28行,会进入该if,传入的$src是攻击者可控的,带入到 get_attached_file 函数中,函数体如下:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

调用 get_post_meta 函数,将 wp_postmeta 表里对应的 post_id 字段 meta_key 值为 _wp_attached_filemeta_value 值查询出来并返回。由上文可知,该值是攻击者可以自己覆盖的,是可控的。

回到 wp_crop_image 函数,返回后的值赋值给 $src_file 并判断该文件存在与否。若不存在则调用 _load_image_edit_path 函数,跟踪该函数:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

进入第二个if分支中,调用 wp_get_attachment_url 函数,查看该函数:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

如上图标注的所示,最后形成的是一个url链接。

如果攻击者将 meta_value 更改为 2019/02/evil.jpg#/../../../../../theme-compat/evil.jpg ,最后形成的url就是这样:

http://localhost/wp-content/uploads/2019/02/evil.jpg#/../../../../../theme-compat/evil.jpg

并将这个url层层返回到 wp_crop_image 函数,并带入到了 wp_get_image_editor 函数:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

跟踪该函数:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

其中有一步细节的操作是在 _wp_image_editor_choose 这个函数中:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

Wordpress提供了两种方式来处理图片,Imagick是优先级最高的,GD其次。这个顺序会影响最终环境的利用。

而Imagick和GD对图片也有不同的处理:

  • Imagick不会去除掉图片中的exif部分,所以我们可以将待执行payload代码加入到exif部分。

  • GD会去除图片的exif部分,并且其中的phpcode很难存活。除非通过精心构造一张图片才可以。

在这里我们选择Imagick库,选择好图片处理库之后就返回该库并调用load方法加载URL:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

Wordpress 5.0.0 远程代码执行漏洞分析与复现

这里有一个坑点,就是Imagick处理类的load函数中调用的是readImage函数,但在高版本的Imagick上该函数不支持远程图片链接,因此我采用Imagick-6.9.7来复现,环境如下图:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

调用完load函数后,就是对获取到的图片内容进行裁剪处理,然后把新生成的图片进行保存,查看保存新文件的操作(造成目录穿越的终点):

Wordpress 5.0.0 远程代码执行漏洞分析与复现

$dst_file 是保存的文件名,生成规则如上图标注所示。因此生成最终文件路径为:

uploaddir/2019/02/cropped-evil.jpg#/../../../../../theme-compat/cropped-evil.jpg

这里有一个注意点,就是会先调用 wp_mkdir_p 函数来创建目录,然后再调用save函数保存文件。

save函数核心如下图:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

这里调用了make_image函数,函数体如下:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

这里又有一个坑点,这里会用 call_user_func_array 函数来调用Imagick的writeImage函数,并将$filename传递进去,值得注意的一点是该函数在 Linux 下不支持不存在的目录跳转。

但是为了达到目录穿越的目的,我们这里传入的$filename就是 uploaddir/2019/02/cropped-evil.jpg#/../../../../../theme-compat/cropped-evil.jpg

由于cropped-evil.jpg#是个不存在的目录,因此该函数会调用失败抛出错误终止流程,自然也无法调用fopen和fwrite进行写文件的操作。

借助多次上传裁剪就可以绕过这个坑点,但是生成的新图片又有什么用呢?

2.3 本地文件包含

wp-includes/template-loader.php:55

Wordpress 5.0.0 远程代码执行漏洞分析与复现

这里调用了 get_single_template 函数:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

第一行获取请求的对象。当我们通过路由浏览文章时这里会返回 WP_Post 对象,其中包含文章的一些属性。

然后将该对象带入到了 get_page_template_slug 函数中,函数体如下:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

根据 post_idwp_postmeta 表中取出 meta_key 字段值为 _wp_page_templatemeta_value 的值并返回。

从核心问题可知,这里返回的 meta_value 的值同样是可以被攻击者自由覆盖的,因此该值是攻击者可控的。

然后将该值添加到 $templates 数组中并传递给 get_query_template 函数。函数体如下:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

调用 locate_template 函数,函数体如下:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

这里做路径的拼接和判断。 $template_name 是可控的,因此结合上文的目录穿越,将新生成的图片放到theme-compat目录下即可。

然后返回该路径,回到最开始的地方:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

调用include将图片包含,执行代码。

三、漏洞复现

这里采用 mac os+php7.1+wordpress4.9.8+imagick6.9.7 复现。

首先,攻击者需要登录一个Author权限的账户。登录后添加一个名为createdir.jpg的图片:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

然后更新该图片信息:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

并使用burp抓包,更改如图所示:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

然后开始裁剪图片,点击edit Image并抓包得到nonce并构造报文。

Wordpress 5.0.0 远程代码执行漏洞分析与复现

Wordpress 5.0.0 远程代码执行漏洞分析与复现

继续上传并裁剪一张名为finally.jpg的图片,成功创建文件:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

然后新增加一篇文章,在update时继续抓包更改如下图所示:

Wordpress 5.0.0 远程代码执行漏洞分析与复现

完毕后。查看该文章,成功触发phpinfo!

Wordpress 5.0.0 远程代码执行漏洞分析与复现

四、补丁分析

添加了 _wp_get_allowed_postdata 方法,将 meta_input 字段从POST报文中去掉了。

Wordpress 5.0.0 远程代码执行漏洞分析与复现

启明星辰积极防御实验室(ADLab)

ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截止目前,ADLab已通过CVE累计发布安全漏洞近1000个,通过 CNVD/CNNVD累计发布安全漏洞近500个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。

Wordpress 5.0.0 远程代码执行漏洞分析与复现


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Probability and Computing

Probability and Computing

Michael Mitzenmacher、Eli Upfal / Cambridge University Press / 2005-01-31 / USD 66.00

Assuming only an elementary background in discrete mathematics, this textbook is an excellent introduction to the probabilistic techniques and paradigms used in the development of probabilistic algori......一起来看看 《Probability and Computing》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换