توضیح عمیق آسیبپذیریهای JWT (بخش دوم)
سلام من بهروزم و در ادامه توضیح عمیق آسیبپذیریهای JWT (بخش اول) در خدمتتون هستم.
سری قبل تکنیکی رو دیدیم که الگوریتم رو به none
تنزل دادیم.
حالا بزنیم به اصل مطلب، اگه اون تکنیک قبلی رو امتحان کردیم و جواب نداد، چی کار کنیم؟
حالا قراره در مورد چیزی صحبت کنیم که بسیار رایجه، اما متأسفانه این تکنیک شاید به بانتی نرسه 😥
با این حال از نظر شدت نمره 9 از 10 داده میشه.
واقعاً اینقدر بحرانیه؟
Weak Symmetric Secrets
احتمالا الان خیلیاتون می خواید بگید: «من این روش رو میدونم، خستهکنندهس و کار نمیکنه.» صبر کن، اول بخون، تنبل جان.
خب این چیه؟ همونطور که اسمش میگه، تکنیکی هست که توش تلاش میکنیم secret الگوریتم رو پیدا کنیم، به زبان ساده، همون رمز/کلید الگوریتم.
اما چطوری؟ جوابش بروتفورس هست، به همین سادگی. باشه، بذار یه کمی فنیتر توضیح بدم.
اگه الگوریتم امضای متقارن استفاده شده باشه، امنیت JWT وابستهست به قدرت و آنتروپی (تصادفیبودن) کلیدِ استفادهشده.
اگه از یک کلید ضعیف استفاده شده باشه، ممکنه بشه بهصورت آفلاین اون کلید رو شکوند و بازیابیش کرد.
وقتی مقدار کلید معلوم شد، میتونی ادعاها (claims) داخل JWT رو تغییر بدی و با استفاده از همون کلید، یک امضای معتبر دوباره محاسبه کنی.
مراحل:
- توکن JWT رو ذخیره کن تو یه فایل متنی به اسم jwt.txt.
-
یه لیست رایج از Secret JWT دانلود کن. برای این کار میتونی از این استفاده کنی:
wget https://raw.githubusercontent.com/wallarm/jwt-secrets/master/jwt.secrets.list
- از Hashcat برای شکوندن کلید استفاده کن:
hashcat -m 16500 -a 0 jwt.txt jwt.secrets.list
پس روال کار اینطوری شد که :
اول توکن JWT رو بیرون بیار و تو یه فایل .txt
ذخیره کن و اسم دلخواه بذار.
بعد لیست کلمات (wordlist) بالا یا هر JWT wordlist دیگهای که خواستی دانلود کن.
بعد با دستور Hashcat (همونی که بالا نوشتم) سعی کن کلید رو بشکنی.
اگه تونستی کلید رو بشکنی، خب… عالیه. 😆
اگه کلید رو بهدست آوردی، میتونی هر پارامتری تو توکن رو تغییر بدی، و چون حالا کلید رو میدونی، میتونی دوباره توکن رو امضا کنی و کار میکنه.
الان توجه کاملت رو میخوام چون این بخش کمی پیچیدهست، ولی سعی میکنم ساده و واضح توضیح بدم.
از سادهترین حالت شروع کنیم.
الگوریتمِ مورد استفاده در JWT، هر چی باشه، عملاً بر دو رویکرد اصلی تکیه داره:
متقارن (symmetric) و نامتقارن (asymmetric).
-
در الگوریتمهای متقارن، فقط یک کلید وجود داره که هم برای امضا (encode) و هم برای بررسی/رمزگشایی (decode/verify) استفاده میشه.
-
در الگوریتمهای نامتقارن، دو تا کلید داریم: یکی برای امضا که خصوصی (private key) هست و یکی برای بررسی که عمومی (public key) هست.
حالا برسیم به نکته حیاتی:
اگه از یک الگوریتم نامتقارن برای امضا استفاده شده باشه، مثلاً RS256
، گاهی ممکنه بشه الگوریتم رو به HS256
تنزل داد (downgrade).
در این حالت، بعضی کتابخانهها بهصورت پیشفرض از کلید عمومی بهعنوان secret برای الگوریتم متقارن استفاده میکنن.
چرا این خطرناکه؟ چون کلید عمومی حساس نیست و اغلب به سادگی در دسترس قرار داره.
وقتی کلید عمومی بهعنوان secret استفاده بشه، با داشتن همون کلید عمومی میتونیم یک امضای معتبر بسازیم:
یعنی الگوریتم رو عوض میکنیم به HS256
و بهجای یک کلید سری، از کلید عمومی بهعنوان secret استفاده میکنیم ،در نتیجه توکنهای جعلشده توسط سرور پذیرفته میشن.
معمولاً هم کلید عمومی در جاهای عمومی منتشر شده یا حتی گاهی داخل خودِ JWT بهصورت یک claim قرار داده میشه. (بله؛ بعضیها عمداً یا سهواً این کار رو میکنن).
روند حمله شبیه اینه:
-
الگوریتم رو از
RS256
بهHS256
تنزل بده. -
از کلید عمومی بهعنوان secret استفاده کن تا JWT رو امضا کنی.
-
یک JWT جدید با claims تغییریافته بساز و آن را با همین secret امضا کن.حاصل، یک توکن معتبر جعلی خواهد بود.
نگران شدی؟ اشکالی نداره، بذار دوباره سادهترش کنم.
به زبان ساده: وقتی توکن JWT رو تو jwt.io دیکد کردیم، دیدیم الگوریتم RS256
هست، که یک الگوریتم نامتقارنِ.
اما اگر بتونیم اون رو به HS256
تغییر بدیم، تبدیل میشه به امضای متقارن.
این یعنی کلید عمومی حالا برای هر دو کار رمزگذاری و بررسی استفاده میشه.
به عبارت دیگه، «خود کلید عمومی» تبدیل میشه به کلید مورد استفاده.
حالا سؤال اینه: کلید عمومی رو از کجا پیدا کنیم؟
خب، اینجاست که باید کمی از مغزت کار بکشی.
سعی کن درخواستهای غیرمعمول بزنی، مثلاً یک GET به endpointای که توکن JWT رو صادر یا میسازه بفرست.
ممکنه اونجا کلید عمومی رو بدست بیاری.
البته این تنها راه نیست بهتره گوگل سرچ کنی روش های دیگم پیدا میکنی. راستی از هوش مصنوعی هم کمک بگیر.
چون ادامه دادن مقاله رو خیلی طولانی و خستهکننده میکنه، همینجا نگه میداریم.
پس رسیدیم به انتهای مطلب.
هنوز چند تکنیک دیگه مونده که باید پوشش بدم و سعی میکنم تو قسمت سوم کاملشون کنم.
اگر به هک و امنیت علاقه داری پیشنهاد میکنم کلاس هاص خصیوصی کلوپ امنیت ۱ و پیشرفته رو از دست ندی چون از پایه کار رو یاد میگیری.