开发者社区> 云栖大讲堂> 正文

新曝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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【API架构】REST API 行业辩论:OData vs GraphQL vs ORDS
【API架构】REST API 行业辩论:OData vs GraphQL vs ORDS
9 0
【API架构】REST API 设计的原则和最佳实践
【API架构】REST API 设计的原则和最佳实践
18 0
了解API相关范式(RPC、REST、GraphQL)
了解API相关范式(RPC、REST、GraphQL) 前言 两个独立的应用程序经常需要相互访问交谈,或则可以是同一个应用程序,但部署在不同的服务器,或者现在常用的前后端分离式架构等等需要经常相互访问交谈,因此开发人员经常搭建桥梁API(Application Programming Interfaces) 关于API的定义,你可以简单看看这篇文章-- What is an API: Definition, Types, Specifications, Documentation
86 0
分布式系统核心:REST风格的架构,REST成熟度模型及REST API管理
正如前文所述,正确、完整地使用REST是困难的,关键在于RoyFielding所定义的REST只是一种架构风格,它并不是规范,所以也就缺乏可以直接参考的依据。好在Leonard Richardson补充了这方面的不足。
120 0
【Elasticsearch】Rest风格API(二)
【Elasticsearch】Rest风格API
36 0
【Elasticsearch】Rest风格API(一)
【Elasticsearch】Rest风格API
54 0
国王小组:数字货币交易所开发中Binance REST API接入方式
秒合约交易所开发详细丨秒合约交易所系统开发详细及规则丨秒合约交易所系统源码部署 数字货币交易所开发源码丨数字货币交易所系统开发(详细及逻辑) 交易所开发正式版丨区块链交易所系统开发实现技术功能及源码 交易所开发案例丨交易所系统开发(详细及流程)丨交易所成熟及源码系统 交易所开发(稳定版)丨交易所系统开发(方案及逻辑)丨 交易所系统源码功能 什么是去中心化交易所系统开发丨浅谈uniswap丨justswap 交易所源码(整体架构演示) 交易所搭建,交易所源码是怎么开发的? 区块链交易所怎么搭建? 区块链交易所平台中常见的开发模式有哪些? 区块链交易所如何开发(介绍区块链应用开发的流程) 区块链
160 0
0Spirng Boot2.5 开发实战 REST API 模拟淘宝订单接口|学习笔记
快速学习0Spirng Boot2.5 开发实战 REST API 模拟淘宝订单接口。
66 0
《Java Spring Boot开发实战系列课程【第15讲】:Spring Boot 2.0 API与Spring REST Docs实战》电子版地址
Java Spring Boot开发实战系列课程【第15讲】:Spring Boot 2.0 API与Spring REST Docs实战
46 0
YARN REST API 总结
YARN REST API 总结
238 0
+关注
云栖大讲堂
擅长前端领域,欢迎各位热爱前端的朋友加入我们( 钉钉群号:23351485)关注【前端那些事儿】云栖号,更多好文持续更新中!
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
数据资源的基础设施API总线
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多