新曝WordPress REST API内容注入漏洞详解

简介:

近日,来自Sucuri的研究人员发现WordPress存在重大漏洞,漏洞在于WordpressREST API,成功利用该漏洞可删除页面或修改页面内容。官方很快发布了升级版Wordpress,但很多管理员没有及时升级,以至于被篡改的网页从最初的几千一路飙升到了150万,在此也提醒各位管理员尽快升级。

漏洞

一、漏洞详情

1. 漏洞信息:

WordPress是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统。在4.7.0版本后,REST API插件的功能被集成到WordPress中,由此也引发了一些安全性问题。近日,一个由REST API引起的影响WorePress4.7.0和4.7.1版本的漏洞被披露,该漏洞可以导致WordPress所有文章内容可以未经验证被查看,修改,删除,甚至创建新的文章,危害巨大。

2. 漏洞影响版本:

WordPress4.7.0、WordPress 4.7.1

3. 复现环境:

Apache 2.4

PHP 7.0

WordPress4.7.1

4.复现过程:

(1) 安装WordPress并配置REST API

① 配置Apache+PHP+Mysql的运行环境,下载含有漏洞版本的WordPress (https://wordpress.org/wordpress-4.7.1.tar.gz)并安装。

② 加载Apache的rewrite模块。

在Apache的配置文件中添加

LoadModule rewrite_module/usr/lib/apache2/modules/mod_rewrite.so

并在主配置文件中设置对应的WEB目录的AllowOverride为All

加载Apache的rewrite模块

③设置WordPress站点为固定链接

在Settings->Permalinks中的Common Settings设置为非Plain模式。例如下图,我们设置为Day and name。

设置WordPress站点为固定链接

(2) 漏洞复现

①根据REST API文档,修改文章内容的数据包构造如下:

根据REST API文档,修改文章内容的数据包构造

可以看到,不带任何验证信息会提示不允许编辑文章

②构造可利用的数据包:

当url为/wp-json/wp/v2/posts/1?id=1a时,可以看到,已经成功跳过验证看到文章内容了。

当url为/wp-json/wp/v2/posts/1?id=1a时

二、漏洞发现之技术细节

Sucuri研究人员的漏洞发现过程始于./wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

漏洞发现之技术细节

这里有几件事值得注意。注册的路由用于用数字填充ID请求参数。比如,如果向/wp-json/wp/v2/posts/1234 –发送请求,则ID参数被设置为1234。

这种行为本身不失为一种防止攻击者编制恶意ID值的好方法,但是当查看REST API如何管理访问时,研究人员很快发现其给予$_GET 和$_POST值的优先级高于路由的正则表达式生成的值。这使攻击者可以发送/wp-json/wp/v2/posts/1234?id=12345helloworld这样的请求,这样会将12345helloworld分配到ID参数,这样包含的不仅仅是数字。

研究人员进一步查看了各种回调(上面截图中),其中一个引起了研究人员的注意:update_item及其权限检查方法:update_item_permissions_check。

update_item_permissions_check

简言之,它将字母数字ID值直接传递给了get_post()函数。该函数通过检查帖子是否实际存在以及用户是否有权编辑此帖来验证请求。研究人员认为这种审验请求的方式较为奇特。如果我们发送一个没有相应帖子的ID,我们可以通过权限检查,并被允许继续执行对update_item方法的请求。

出于对是什么导致get_post()无法找到帖子(除ID不存在外)的好奇,研究人员意识到其使用wp_posts中的get_instance()静态方法来抓取帖子。

wp_posts中的get_instance()

从代码中可以看出,对于不是由纯数字字符组成的任何输入,其基本上会失败 – 因此123ABC会失败。

对于攻击者,这意味着WordPress(将其视作具有足够权限编辑此帖的用户)会运行update_item方法。

我们认为有必要查看该方法的作用。

截图中有一个微妙但非常重要的细节——WordPress在将ID参数传递给get_post前先将其转换为一个整数。鉴于PHP进行类型比较和转换的方式,这是一个问题。比如,你会发现以下代码片段会返回123:

9.png

这导致了非常危险的情形,即攻击者可以提交/wp-json/wp/v2/posts/123?id=456ABC这样的请求来对ID为456的帖子进行篡改。

鉴于此类型欺骗问题,攻击者便可篡改受害者网站上的任何帖子或页面的内容。这样他们便可以添加插件特定的短代码来利用漏洞(原本仅限于贡献者)、使用SEO垃圾邮件活动感染网站内容或注入广告,等等。甚至可以很容易地执行PHP代码——取决于网站上启用的插件。

结语

这是一个可以以不同方式利用的严重漏洞,如果您的网站尚未启用自动更新,请尽快更新。

作者:华为未然实验室
来源:51CTO

相关文章
|
24天前
|
缓存 API 网络架构
掌握现代API开发:GraphQL vs REST
【10月更文挑战第24天】本文深入探讨了现代API开发中两种主流技术——GraphQL和REST的设计理念、技术特点及实际开发中的对比分析。GraphQL通过声明式数据请求和强类型系统提供更高的灵活性和性能,而REST则以其无状态特性和成熟的生态系统见长。文章还讨论了两者在客户端-服务器交互、安全性和工具支持方面的优劣,帮助开发者根据项目需求做出明智选择。
|
2月前
|
JSON 中间件 API
开发REST API3-11
开发REST API3-11
|
2月前
|
JSON JavaScript API
编写REST API
编写REST API
61 2
|
1月前
|
Java API Maven
使用 Smart-doc 记录 Spring REST API
使用 Smart-doc 记录 Spring REST API
47 0
|
3月前
|
XML 安全 API
REST 和 SOAP API 有什么区别?
【8月更文挑战第31天】
200 0
|
11天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
23天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。
|
24天前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应
|
1月前
|
编解码 监控 API
直播源怎么调用api接口
调用直播源的API接口涉及开通服务、添加域名、获取API密钥、调用API接口、生成推流和拉流地址、配置直播源、开始直播、监控管理及停止直播等步骤。不同云服务平台的具体操作略有差异,但整体流程简单易懂。
|
14天前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
下一篇
无影云桌面