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 远程代码执行漏洞分析与复现


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

查看所有标签

猜你喜欢:

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

使用HTML5和Node构建超媒体API

使用HTML5和Node构建超媒体API

【美】Mike Amundsen(麦克.阿蒙森) / 臧秀涛 / 电子工业出版社 / 2014-5 / 55.00元

《使用HTML5和Node构建超媒体API》探讨了超媒体API 的设计,介绍了作为超媒体API 的构件块的超媒体因子,并讲解了基本格式、状态转移、领域风格和应用流程这4 种超媒体设计元素;之后作者结合具体的场景,通过3个动手实验章节,从超媒体因子和超媒体设计元素入手,用实际的代码向我们详细地演示了超媒体API 的设计;最后介绍了超媒体设计的文档编写、注册与发布等内容。 《使用HTML5和No......一起来看看 《使用HTML5和Node构建超媒体API》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

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

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具