WordPress5.0 远程代码执行分析

代码审计 2019-11-10

本文作者:七月火

2019年2月19日,RIPS 团队官方博客放出 WordPress5.0.0 RCE 漏洞详情,漏洞利用比较有趣,但其中多处细节部分并未放出,特别是其中利用到的 LFI 并未指明,之后网络上很多所谓的漏洞分析文章,多数对 LFI 并未分析,遂想一探究竟,并将自己的分析过程记录下来。

环境搭建

我们直接从 WordPress 官网下载 5.0 版本代码,搭建成功后先不要登录,因为从 3.7.0 版本开始, WordPress 在用户登录时,会在后台对小版本的改变进行更新,这样不利于我们分析代码。我们可以通过将 AUTOMATIC_UPDATER_DISABLED 设置成 true ,来禁止 WordPress 后台自动更新(在 wp-config.php 文件开头添加 define('AUTOMATIC_UPDATER_DISABLED', true); 即可)。

漏洞分析

路径穿越漏洞

该漏洞通过路径穿越和本地文件包含两个漏洞的组合,最终形成远程代码执行。我们先来看路径穿越问题。通过构造如下数据包,我们即可在数据库中插入一个恶意的路径:

img

上图中的 post 数据:

&action=editpost&meta_input[_wp_attached_file]=2019/03/demo.jpeg#/../../../../themes/twentynineteen/demo.jpeg

下面我们找到具体文件,审计代码。我们可以看到在 wp-admin/post.php 文件中,当 $action=editpost** 的时候,会调用 **edit_post** 方法。在 **edit_post** 方法中,我们看到可控的 **$post_data 变量,其数据来源于 $_POST** ,紧接着将可控的 **$post_data 变量传入 wp_update_post 方法,具体代码如下:

img

wp_update_post 方法中,我们看到其调用了 wp_insert_post 方法,该方法会将我们构造的恶意路径传入 update_post_meta 方法中,具体代码如下:

img

可以看到 update_post_meta 方法调用了 update_metadata 方法,而该方法调用了 wpdb 类的 update 方法,并将我们构造的恶意路径更新到数据库中。其具体代码如下:

img

更新前后, Mysql 中攻击者上传的图片对应的元信息变化如下:

img

至此,我们只是完成了将恶意路径插入数据库中,接下来我们还要让它发挥作用。在 WordPress 中,用户所上传的图片,会被保存至 wp-content/uploads/ 目录下。而程序获取图片时,有两种方法。第一种直接在 wp-content/uploads/ 目录下寻找;第二种则是在上一种方式无法获取图片时,从 http://localsite/wp-content/uploads/meta_value 下载,


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论