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

相关文章
|
22天前
|
前端开发 JavaScript API
基于React的简易REST API客户端设计与实现
基于React的简易REST API客户端设计与实现
19 3
|
1月前
|
存储 安全 前端开发
WordPress未经身份验证的远程代码执行CVE-2024-25600漏洞分析
WordPress未经身份验证的远程代码执行CVE-2024-25600漏洞分析
65 0
|
3月前
|
JSON 缓存 API
title: 深入理解REST API设计的最佳实践
title: 深入理解REST API设计的最佳实践
35 0
|
4月前
|
分布式计算 Hadoop Java
[hadoop3.x系列]HDFS REST HTTP API的使用(二)HttpFS
[hadoop3.x系列]HDFS REST HTTP API的使用(二)HttpFS
53 1
|
4月前
|
分布式计算 Hadoop API
✨[hadoop3.x系列]HDFS REST HTTP API的使用(一)WebHDFS
✨[hadoop3.x系列]HDFS REST HTTP API的使用(一)WebHDFS
60 1
|
4月前
|
JSON 前端开发 生物认证
REST API 的指纹验证机制
REST API 的指纹验证机制
31 0
|
10天前
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。
|
17天前
|
监控 前端开发 JavaScript
实战篇:商品API接口在跨平台销售中的有效运用与案例解析
随着电子商务的蓬勃发展,企业为了扩大市场覆盖面,经常需要在多个在线平台上展示和销售产品。然而,手工管理多个平台的库存、价格、商品描述等信息既耗时又容易出错。商品API接口在这一背景下显得尤为重要,它能够帮助企业在不同的销售平台之间实现商品信息的高效同步和管理。本文将通过具体的淘宝API接口使用案例,展示如何在跨平台销售中有效利用商品API接口,以及如何通过代码实现数据的统一管理。
|
29天前
|
安全 算法 API
产品经理必备知识——API接口
前言 在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代,我通过一部手机就可以实现衣食住行的方方面面,比如:在家购物、远程控制家电、自动驾驶等等,背后都离不开我们今天要聊的API接口。
|
29天前
|
数据采集 JSON API
如何实现高效率超简洁的实时数据采集?——Python实战电商数据采集API接口
你是否曾为获取重要数据而感到困扰?是否因为数据封锁而无法获取所需信息?是否因为数据格式混乱而头疼?现在,所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据采集API接口。

热门文章

最新文章