WordPress Rest Api内容注入漏洞

前言: 二月初WordPress大礼包0.0

0x01 简介

WordPress在4.7.0版本后,REST API插件的功能被集成到WordPress中。WordPress REST API主要提供一组易于使用的HTTP端点,可以使用户以简单的JSON格式访问网站的数据,包括用户,帖子,分类等。检索或更新数据与发送HTTP请求一样简单。因此该漏洞导致WordPress所有文章内容可以未经验证被查看,修改,删除,甚至创建新的文章。


0x02 影响版本

  • WordPress 4.7.0
  • WordPress 4.7.1

0x03漏洞复现

  • 1.安装WordPress,配置参数,设置WordPress站点为固定链接。
    httpd.conf: 加载Apache的rewrite模块以及设置对应的WEB目录的AllowOverride为All。

  • 2.过程复现
    首先把id为1的文章给加密了,然后访问wp的api地址http://127.0.0.1:8080/wp-json/wp/v2/posts/1?id=1a,Post 一个数据 {“title”:”dota9999”},


    由此发现密码以及修改了title参数;但是前提id从哪获取,为什么要用json呢,是因为wp rest api语法规则的要求;所以过程大致如下:
    首先’GET /wp-json/wp/v2/posts/‘获取所有的id号(并不都是从0或者1开始,因此需要获取更加准确)

    其次根据其内容选择你想要修改的参数,比如修改个content,然后构造post数据 json.dumps({'content': 'dota8888'})
    最后post "/wp-json/wp/v2/posts/想要改的文章id?id=想要改的文章id+随机字符串"

  • 3.注入原理
    在wp rest api使用中比如访问”/wp-json/wp/v2/posts/1”这个地址,其过程是wp rest api去查找这个地址,但是为了防止别人恶意对目标地址参数做手脚,因此在查找这个地址时会通过正则'/(?P<id>[\d]+)'进行限制。但是在正则限制这个过程之前是要访问的,如果目标都ID不存在都不能访问了,也就不判断正则了,从而利用自定义ID绕过,如果自定义的ID不全是数字则wp rest api则既绕过了正则,又绕过了update_item_permissions_check检查,并且在php中类型的转换会存在

    从而绕过了两次检查,返回到update_item方法下时候,查看/wp-json/wp/v2/posts/1?id=1hhh实际上就是请求ID为1的文章。
    ps:
    1.建议不要在windows(复现失败),wp中文版(可能存在编码问题)下复现。
    2.安装wp过程中如果在数据库步骤出问题,考虑权限以及手工添加wordpress数据库。
    3.wp设置为主目录,不要在子目录下。


0x04 危害防御

危害:对站点的页面可以任意(即使加密了)查看,修改,删除,创建。利用修改的内容可进一步构造攻击,比如页面钓鱼。
防御:升级4.7.2


0x05 POC&EXP

先根据目标站点获取其wp api的地址,如利用xpath //link[@rel="https://api.w.org/"]/@href,然后根据wp-api地址获取对应目标站点id号,利用得到的其中一个id号地址,post一个你想修改的参数,根据返回的状态码和返回页面中是否成功被post的访问以及修改。

利用之前判断版本,打开网站看看是否用的固定链接,post的id能不能获取到,然后进行利用,比如页面插个马,坐等管理员。


0x06 工具

WordpressRestApiInject.py
Burpsuite


0x07 引用

Wordpress Rest API
Seebug WordPress REST API 内容注入漏洞
Seebug WordPress REST API分析
91ri WordPress REST API 文章编辑漏洞

文章目录
  1. 1. 0x01 简介
  2. 2. 0x02 影响版本
  3. 3. 0x03漏洞复现
  4. 4. 0x04 危害防御
  5. 5. 0x05 POC&EXP
  6. 6. 0x06 工具
  7. 7. 0x07 引用