WordPress REST API 内容注入漏洞

漏洞描述

    近期,WordPress 被曝存在内容注入漏洞,攻击者利用该漏洞可对网站注入恶意内容,越权对网站文章内容进行修改。

    漏洞原理

    通过对WordPress源代码的深入剖析,发现REST API文件中可绕过权限检查,来实现文章任意内容的修改的漏洞点。

    首 先,在文件/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php 中,看下文章(post)的控制类,注册了文章更新的回调函数update_item和检查更新权限的回调函数 update_item_permissions_check。

    blob.png

    我们跟进检查更新权限的回调函数update_item_permissions_check。

    第 一个红框,是根据用户传入的id参数,使用get_post()函数来查找相应的文章。第二个红框是重点,如果文章存在但是没有权限,会返回没有权限操作 (Sorry, you are not allowed to edit this post.)。也就是说,如果文章不存在,则会跳过这部分的判断,执行到最后的return true,从而完成权限检查。这里的逻辑是合理的,如果用户提供的id没有对应的文章,即使获得了更改权限,也没有可用的文章被修改。但是,这只是权限检 查阶段。

    如果用户提供一个特殊的id参数,使得在权限检查时 (update_item_permissions_check函数)没有对应的文章,从而获得修改权限,但在修改文章内容(update_item函 数)时。又能找到该特殊的id对应的文章,那么就可以直接修改文章的内容了。这样的id参数需要满足两个条件:

    1.使得get_post()函数找不到对应的文章

    2.使得update_item ()函数能找到对应的文章

    这样的id参数是否存在呢?

    我们先看get_post()函数

    blob.png

    可以看出,只要我们输入的id使得get_instance()函数返回false,我们就会得到一个null的返回,也就是找不到对应的文章。继续根跟进get_instance()函数,如下图:

    blob.png

    这里可以清楚地看到,只要输入的id参数不是纯数字,就会false,从而就会使得找不到对应的文章。

    我们再看下修改文章内容的函数update_item。

    blob.png

    红 框中的内容是重点中的重点。这里我们需要get_post()函数成功执行,找到对应的文章。而上一行的$id   = (int) $request[‘id’];,会把用户输入的id进行整数类型转换,保证了get_post()函数能够执行成功。问题就出现在这个类型转换上,只要 我们提供的id参数能还换成整数即可,比如123abc,进行转换后会变成123。

    我们找到了这样的id参数,从而可以实现绕过权限检查,修改文章任意内容。

    漏洞复现

    下图是默认安装的WordPress4.7.1,第一篇默认文章Hello World,其文章id为1.

    blob.png

    构造数据包如下图,id参数为1a,修改标题和内容,都改为Content Injection Vulnerability in WordPress:

    blob.png

    查看返回状态码为200,说明已经成功修改。刷新页面,可以看到文章已被修改。

解决方案

    1、WordPress 4.7.2 版本已修复该漏洞,请前往官网下载升级:https://cn.wordpress.org/;

未经允许不得转载:哈勃私语 » WordPress REST API 内容注入漏洞

本文共1479个字 创建时间:2017年2月17日16:08   

分享到:更多 ()