频道栏目
首页 > 安全 > 网络安全 > 正文
WordPress REST API 内容注入漏洞分析
2017-02-08 09:46:01           
收藏   我要投稿

WordPress REST API 内容注入漏洞分析。

0x00 漏洞简述

1. 漏洞简介

在 REST API 自动包含在 Wordpress4.7 以上的版本, WordPress REST API 提供了一组易于使用的HTTP端点,可以使用户以简单的JSON格式访问网站的数据,包括用户,帖子,分类等。检索或更新数据与发送HTTP请求一样简单。上周,一个由 REST API 引起的影响 WorePress4.7.0 和 4.7.1 版本的漏洞被披露,该漏洞可以导致WordPress所有文章内容可以未经验证被查看,修改,删除,甚至创建新的文章,危害巨大。

2. 漏洞影响版本 WordPress4.7.0 WordPress4.7.10x01 漏洞复现

Seebug上已经给出详细的复现过程,在复现过程中可以使用 已经放出的POC 来进行测试。

0x02 漏洞分析

其实漏洞发现者已经给出了较为详细的 分析过程 ,接下来说说自己在参考了上面的分析后的一点想法。

WP REST API

首先来说一下 REST API 。

控制器

WP-API 中采用了控制器概念,为表示自愿端点的类提供了标准模式,所有资源端点都扩展 WP_REST_Controller 来保证其实现通用方法。

五种请求

之后, WP-API 还有这么几种请求(也可以想成是功能吧):

HEAD GET POST PUT DELETE

以上表示HTTP客户端可能对资源执行的操作类型。

HTTP客户端

WordPress本身在 WP_HTTP 类和相关函数中提供了一个HTTP客户端。用于从另一个访问一个WordPress站点。

资源

简单来说,就是文章,页面,评论等。

WP-API 允许HTTP客户端对资源执行CRUD操作(创建,读取,更新,删除,这边只展示和漏洞相关的部分):

GET /wp-json/wp/v2/posts 获取帖子的集合:

\

GET /wp-json/wp/v2/posts/1 获取一个ID为1的单独的Post:

\

可以看到ID为1的文章标题为Hello World,包括文章的路由也有。

路由

路由是用于访问端点的“名称”,在URL中使用(在非法情况下可控,就像这个漏洞一样)。

例如,使用URL https://example.com/wp-json/wp/v2/posts/123 :

路由(route)是 wp/v2/posts/123 ,不包括 wp-json ,因为 wp-json 是API本身的基本路径。 这个路由有三个端点: GET触发一个 get_item 方法,将post数据返回给客户端。 PUT触发一个 update_item 方法,使数据更新,并返回更新的发布数据。 DELETE触发 delete_item 方法,将现在删除的发布数据返回给客户端。 静态追踪

知道了 WP-API 的路由信息以及其操作方式,可以根据其运行的思路来看一下具体实现的代码。

我们看一下 /wp-includes/rest-api/endpoints/class-wp-rest-post-controller.php :

\

根据上面的信息,我们可以知道这是注册controller对象的路由,实现路由中端点方法。

在这里,如果我们向 /wp-json/wp/v2/posts/1 发送请求,则ID参数将被设置为1:

\

同时,注意一下这里:

register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => array( $this, 'get_item_permissions_check' ), 'args' => $get_item_args, ), array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'update_item' ), 'permission_callback' => array( $this, 'update_item_permissions_check' ), 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), ), array( 'methods' => WP_REST_Server::DELETABLE, 'callback' => array( $this, 'delete_item' ), 'permission_callback' => array( $this, 'delete_item_permissions_check' ), 'args' => array( 'force' => array( 'type' => 'boolean', 'default' => false, 'description' => __( 'Whether to bypass trash and force deletion.' ), ), ), ), 'schema' => array( $this, 'get_public_item_schema' ), ) );

可以看到在 register_rest_route 中对路由进行了正则限制:

\

也就是防止攻击者恶意构造ID值,但是我们可以发现 $_GET 和 $_POST 值优先于路由正则表达式生成的值:

\

这边没有找到ID为 123hh 的项目,所以返回 rest_invalid 。

现在我们可以忽略路由正则的限制,来传入我们自定义的ID。

点击复制链接 与好友分享!回本站首页
上一篇:详解Oculus摄像头的运作原理及黑客攻击风险
下一篇:小白自学教程:如何选择正确的防火墙
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站