WordPress REST API 内容注入漏洞
1 WordPress REST API 内容注入漏洞
1.1 摘要
1.1.1 漏洞介绍
- WordPress是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统。在4.7.0版本后,REST API插件的功能被集成到WordPress中,由此也引发了一些安全性问题。
- 近日,一个由REST API引起的影响WorePress4.7.0和4.7.1版本的漏洞被披露,该漏洞可以导致WordPress所有文章内容可以未经验证被查看,修改,删除,甚至创建新的文章,危害巨大。
1.1.2 漏洞环境
- 操作机:Kali Linux
- 目标机:CentOS 6.5
1.1.3 实验工具
- Apache 2.4
- PHP 7.0
- WordPress 4.7.1
1.2 漏洞复现
- 在浏览器中打开WordPress主页,可以看到一篇标题为“Hello World!”的博客
- 下载POC漏洞验证文件:
title_wp_rest_api.py
,在终端中打开
- 输入命令
curl 172.16.12.2 | grep entry-title
。可以看到该WordPress程序存在一篇文章,文章标题为“Hello World!”。(注:curl
是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中)
- 尝试执行POC越权修改该文章内容,输入命令:
python title_wp_rest_api.py http://172.16.12.2/ yuanxin
回车即可执行。
- 再次输入命令
curl 172.16.12.2 | grep entry-title
,可以看到该文章标题由"Hello World"
修改成为"yuanxin"
, 漏洞利用成功。
- 返回浏览器,刷新界面可以看到博客的标题已经成功被修改
- 漏洞复现成功
1.3 漏洞分析
1.首先来说一下 Word Press 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操作(创建,读取,更新,删除)
- 路由:路由是用于访问端点的“名称”,在URL中使用(在非法情况下可控,就像这个漏洞一样)。例如,使用URL
http://example.com/wp-json/wp/v2/posts/123
:
2.知道了 WP-API 的路由信息以及其操作方式,可以根据其运行的思路来看一下具体实现的代码。我们看一下/wp-includes/rest-api/endpoints/class-wp-rest-post-controller.php
:
- 这里有几件事要注意。注册的路由被设计为用数字填充ID请求参数。例如,使用
URL :http://example.com/wp-json/wp/v2/posts/1234
的ID参数将被设置为 1234,路由(route)是 wp/v2/posts/1234 ,不包括 wp-json ,因为 wp-json 是API本身的基本路径。 这个路由有三个端点: GET触发一个get_item
方法,将post数据返回给客户端。 PUT触发一个update_item
方法,使数据更新,并返回更新的发布数据。 DELETE触发delete_item
方法,将现在删除的发布数据返回给客户端,静态追踪。 - 注意到
register_rest_route
中对路由进行了正则限制:'/(?P<id>[\d]+)'
,这种行为本身可以是防止攻击者伪造恶意ID值的好方法,但是可以发现 $_GET 和 $_POST 值优先于路由正则表达式生成的值:这使得攻击者可以发送请求,如:/wp-json/wp/v2/posts/1234?id==12345helloworld
这将分配12345helloworld
到ID参数。
3.接下来在审查各个端点方法中,找到了 update_item
这个方法,及其权限检查方法update_item_permissions_check
:
update_item_permissions_check
方法将我们的字母数字ID值直接传递给get_post()
函数。此函数通过检查帖子是否实际存在 以及我们的用户是否有权编辑此帖来验证请求。这是一种好奇的清理请求的方式。如果发送一个没有相应帖子的ID,可以通过权限检查,并允许继续执行对update_item
方法的请求。- 那么是什么可能导致get_post()在找到一个不是不存在的I时失败 。它使用
wp_posts
中的get_instance()
静态方法来抓取帖子。
从代码中可以看出,对于不是全部由数字字符组成的输入,它基本上会失败。对于攻击者,这意味着WordPress(认为它是一个有足够特权编辑此帖的用户)将运行
update_item
方法。
在
update_item
方法中,有一个细节: WordPress将ID参数转换为一个整数,然后传递给get_post()函数,这导致了一个非常危险的情况,因为PHP做类型比较和转换的方式时,攻击者可以提交类似的请求/wp-json/wp/v2/posts/1234?id==12345helloworld
时,便是发起了对ID为1234的文章的请求。
1.4 修复方案
- 将WordPress更新到最新版本,官网下载地址:https://cn.wordpress.org/
1.5 思考总结
- 本实践实现了WordPress REST API 内容注入漏洞的复现,并对漏洞原理进行了详细的分析。乍一看,感觉这个洞并没有什么太大的影响,但是仔细想了一下,危害还是很大的:
- 先不说WordPress页面执行php代码的各种插件,还有相当一部分的WordPress文章可以调用短代码的方式导致WordPress所有文章内容可以未经验证被查看,修改,删除,甚至创建新的文章,这是一个思路。
- 另一个思路就是可以进行对原来文章中的指定超链接进行修改,从而进行钓鱼。
- 还有一个思路,就是利用WordPress文章中解析html以及JavaScript文件包含的做法,辅助其他方法,进行攻击。
WordPress REST API 内容注入漏洞的更多相关文章
- [CVE-2017-5487] WordPress <=4.7.1 REST API 内容注入漏洞分析与复现
记录下自己的复现思路 漏洞影响: 未授权获取发布过文章的其他用户的用户名.id 触发前提:wordpress配置REST API 影响版本:<= 4.7 0x01漏洞复现 复现环境: 1) Ap ...
- WordPress < 3.6.1 PHP 对象注入漏洞
0x00 背景 当我读到一篇关于Joomla的“PHP对象注射”的漏洞blog后,我挖深了一点就发现Stefan Esser大神在2010年黑帽大会的文章: http://media.blackhat ...
- WordPress Cart66 Lite插件HTML注入漏洞
漏洞名称: WordPress Cart66 Lite插件HTML注入漏洞 CNNVD编号: CNNVD-201310-525 发布时间: 2013-10-23 更新时间: 2013-10-23 危害 ...
- WordPress WP-Realty插件‘listing_id’参数SQL注入漏洞
漏洞名称: WordPress WP-Realty插件‘listing_id’参数SQL注入漏洞 CNNVD编号: CNNVD-201310-499 发布时间: 2013-10-23 更新时间: 20 ...
- WordPress Quick Paypal Payments插件HTML注入漏洞
漏洞名称: WordPress Quick Paypal Payments插件HTML注入漏洞 CNNVD编号: CNNVD-201310-491 发布时间: 2013-10-22 更新时间: 201 ...
- 织梦内容管理系统(DedeCms) 小说模块insert注入漏洞
漏洞版本: Dedecms 漏洞描述: DedeCms是免费的PHP网站内容管理系统. 织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户 ...
- WordPress NOSpam PTI插件‘comment_post_ID’参数SQL注入漏洞
漏洞名称: WordPress NOSpam PTI插件‘comment_post_ID’参数SQL注入漏洞 CNNVD编号: CNNVD-201309-388 发布时间: 2013-09-24 更新 ...
- WordPress A Forms插件HTML注入漏洞和跨站请求伪造漏洞
漏洞名称: WordPress A Forms插件HTML注入漏洞和跨站请求伪造漏洞 CNNVD编号: CNNVD-201308-281 发布时间: 2013-08-20 更新时间: 2013-08- ...
- WordPress BulletProof Security插件多个HTML注入漏洞
漏洞名称: WordPress BulletProof Security插件多个HTML注入漏洞 CNNVD编号: CNNVD-201308-023 发布时间: 2013-08-06 更新时间: 20 ...
随机推荐
- EF 性能调优
--EF 批量增删改 http://www.cnblogs.com/lori/archive/2013/01/31/2887396.html http://www.cnblogs.com/gzalrj ...
- div+css网页标准布局实例教程(三)
前边两节学完后,前台工作基本上完成了,下边的任务该程序员添加程序了.为什么说是基本完成呢?因为要做的工作还很多,不但要把首页做出来,其它的列表页详细页等页面也得做.还要配合程序员把整个网站完成,这样才 ...
- sql优化 表连接join方式
sql优化核心 是数据库中 解析器+优化器的工作,我觉得主要有以下几个大方面:1>扫表的方法(索引非索引.主键非主键.书签查.索引下推)2>关联表的方法(三种),关键是内存如何利用 ...
- 如何解决win8系统下卸载软件出现错误代码为2502和2503的问题
1.首先打开任务管理器,可以通过右键点击桌面上的任务栏打开任务管理器,也可以通过同时按下键盘上的Ctrl+Alt+Delete键打开任务管理器. 2.打开任务管理器后,切换到“详细信息”选项卡,找到e ...
- 13 jmeter性能测试实战--FTP程序
需求 上传一个文件到服务器(put),下载一个文件到本地(get). 测试步骤 1.创建一个线程组. 2.线程组-->添加-->配置元件-->FTP请求缺省值(可有可无,相当于给“服 ...
- 深入理解python之一——python3对象的一些特性
文章使用markdown写的,编辑的时候行间距还可以,显示的时候行间距好小,我也没办法. 首先,需要明白的是python是一种解释性语言标准,他可以由c.java或者其他语言来实现.在python的标 ...
- [LeetCode] 298. Binary Tree Longest Consecutive Sequence_Medium tag: DFS recursive
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
- js 使用jquery.form.js文件上传
1.文件上传,使用jquery.form.js插件库 <!DOCTYPE html> <html> <head> <meta charset="UT ...
- MVC5+Easyui1.3.6+EF6 开发部分备忘笔记
一点一点增加,后面继续. 1.Row Editing in DataGrid 编辑,总是绑定不了checkbox的问题
- JQuery表单元素过滤选择器
此选择器主要是对所选择的表单元素进行过滤: 选择器 描述 返回 enabled 选择所有的可用的元素 集合元素 disabled 选择所有的不可用的元素 集合元素 checked 选择所有被选中的元素 ...