Bugbounty:一次有趣的账户接管
2019-09-16 09:57:24 Author: xz.aliyun.com(查看原文) 阅读量:157 收藏

概述

近期,我接受了一份对某个私人项目网站的测试邀请。开始,我询问网站方能否提供具有admin权限的测试用户,但被拒绝了,我只能用普通账户测试。

目标站点是一个普通网站,没有复杂的业务,多数为静态页面,这使我有些苦恼。登入普通账户后,唯一有趣的东西就是一个文件上传点,但只能上传PDF格式的文件,无法绕过。一段时间后,测试陷入困境。我想要测试站点授权功能但又没有admin账户,而且也没有提供任何API文档,我根本不知道后台有哪些端点。

在挖洞界,有句名言:“网站如果有管理员用户,那么一定有管理员用户的特定端点”。

fuzz测试

因此,接下来我只能通过fuzz来找出这些端点。根据以往的经验,管理员用户有非常多的功能端点,比如修改用户信息的端点。

此端点可能是以下格式:

/api/v2/member/
/api/v2/members/
/api/v2/users/
/api/v2/user/

查看Burp-Suite历史请求,恰好有一个类似的API端点。

/api/v2/search/suggestion/counterparty/改为/api/v2/members/,出现404错误。

api/v2/users 404错误

api/v2/user 405错误

HTTP 405 错误 – 方法不被允许 (Method not allowed),一般将GET改为POST方法即可解决问题。

尝试账户接管

服务器要求我们在body中提供更多参数信息,并且以JSON格式发送。简单构造:

此时报错,提示缺少client参数。一开始,我认为这个参数是用来控制用户权限的,将参数改为test,再次报错:

Ok,将其改为整形:

此时,我成功创建了一个新用户。在另一个浏览器上登入新用户,尝试更改密码,但没有收到重置密码的邮件。

进一步研究,我发现client参数控制着所在的用户组。但我不清楚哪一个或哪些ID控制着用户组。我把请求sent到Bp intruder,配置client值的范围:1-100。结果如下:

使用上面状态码为201的ID,成功创建用户。在另一个浏览器上登入新用户,重置密码,此时可以收到更改密码的邮件。

尝试接管管理员用户

我没有立即提交这个漏洞,万一可以接管管理员用户怎么办?站点可能存在某个参数控制用户的权限。

经过一些摸索测试后,我尝试在请求body中添加"role":"admin",而且居然成功了。登入用户后,我发现该账户已具有管理员权限。

经验总结

  1. 目标站点过于简单,测试陷入僵局时,可以尝试Fuzz,可能有意外收获;
  2. 用发散性思维思考问题,去猜想一些参数;
  3. 挖到漏洞后不要立即提交,尝试放大影响。

文章来源: http://xz.aliyun.com/t/6330
如有侵权请联系:admin#unsafe.sh