近期,我接受了一份对某个私人项目网站的测试邀请。开始,我询问网站方能否提供具有admin权限的测试用户,但被拒绝了,我只能用普通账户测试。
目标站点是一个普通网站,没有复杂的业务,多数为静态页面,这使我有些苦恼。登入普通账户后,唯一有趣的东西就是一个文件上传点,但只能上传PDF格式的文件,无法绕过。一段时间后,测试陷入困境。我想要测试站点授权功能但又没有admin账户,而且也没有提供任何API文档,我根本不知道后台有哪些端点。
在挖洞界,有句名言:“网站如果有管理员用户,那么一定有管理员用户的特定端点”。
因此,接下来我只能通过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",而且居然成功了。登入用户后,我发现该账户已具有管理员权限。