ورود و ثبت نام

آموزش آشنایی با JWT و بررسی حملات آن

خواندن این مطلب

11 دقیقه

زمان میبرد!

آموزش آشنایی با JWT و بررسی حملات آن

سلام و درود خدمت تمامی دوستان عزیزو گرامی و امیدوارم که روزگار به کامتون باشه 🙂

 

امروز قراره بریم به ی مبحثی تحت عنوان JWT یا Json Web Token بپردازیم ، که حالا همینطور که از اسمش مشخصه jwt ی توکنه جهت احراز هویت کاربر توسط سرور .. که این jwt یکسری آسیب پذیری ها داره و خیلی از سایت ها برای احراز هویت از jwt استفاده می کنند.

در ادامه قراره با جزئیات بیشتر به این مبحث بپردازیم و روش های bypass این مکانیزم نیز خدمتتون خواهم گفت.

 

 

 

JWT چیست

JWT یا Json Web Token یکی از استاندارد های web می باشد که برای احراز هویت کاربر توسط سرور استفاده می شود و همچنین از این Token جهت ردوبدل کردن اطلاعات Json بصورت امن به مقصد های مختلف هم استفاده می شود.

خب حالا این JWT یک ساختاری داره که به سه بخش header .. payload .. signiture تقیسم میشه و با dot یا نقطه (.) هم از جدا میشن و هر بخش با الگوریتم Base64 نیز encode میشه و در نهایت یک Json Web Token ایجاد میشه ، به شرح زیر‌ :‌

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Imd1ZXN0IiwiaWF0IjoxNTE2MjM5MDIyfQ.ekZLf-HJPj9Ar0z-LJfkESpYGD0og3QGq4GvRb1ggsM

خب الان decode شده ی عبارت بالا میشه توکن زیر :

{“alg”:”HS256″,”typ”:”JWT”}{“sub”:”1234567890″,”name”:”guest”,”iat”:1516239022}

به قسمت اول توکن میگن header :

  • eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    • {“alg”:”HS256″,”typ”:”JWT”}

به قسمت دومش هم میگن payload

  • eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Imd1ZXN0IiwiaWF0IjoxNTE2MjM5MDIyfQ
    • {“sub”:”1234567890″,”name”:”guest”,”iat”:1516239022}

و به سمت سومش هم میگن signature

  • ekZLf-HJPj9Ar0z-LJfkESpYGD0og3QGq4GvRb1ggsM

الان بریم ببنیم این چیزای که گفتیم دقیقا چین و باهم بریم به اعماق JWT :

  • Header : بخش header اطلاعات مربوط به رمزنگاری signature و یکسری اطلاعات جزئی راجب اون token داخلش قرار میگیره.
  • Payload : بخش payload هم اطلاعات مربوط به کاربر داخلش قرار میگیره.
  • Signature :‌ خب حالا برای اینکه کسی نتونه این JWT رو جعل کنه ، اومدن براش ی کلیدی گذاشتن بنام secret که این secret میشه اون signature اون توکن یعنی توکن توسط signature اعتبار سنجی میشه .. و این secret در دسترس عموم قرار نمیگیرد.

 

با استفاده از سایت jwt.io میتونیم یک توکن jwt بسازیم و تغییر بدیم و اعتبار سنجیش رو بسنجیم و کلا سایت jwt.io مخصوص jwt هستش و میتونیم حرکتای مختلفی بزنیم به شرح زیر و پیشنهاد میکنم خودتون هم حتما برید بهش سر بزنیدو باهاش کار کنید :

 

 

 

ناگفته نماند که همونطور که گفتم میتونیم با استفاده از سایت www.jwt.io توکن های jwt رو اعتبار سنجی کنیم و decode شده ی اون رو ببنیم ، خب الان به تصویر بالا توجه کنید همونطور که مشاهده می فرمایید این یک توکن معتبر هستش و Signature Verified شده ینی تایید شده .. حالا اگر توکن secret ـش معتبر نبود با ارور Invalid Signature مواجه می شدیم به شرح زیر :

 

 

 

 

همونطور که میبنید بهمون ارور Invalid Signature داد یعنی secret معتبر نیست!

 

در کل ما میتونیم در ادامه با روش هایی که خدمتتون عرض می کنم secret این jwt رو بدست بیارید و با استفاده از این سایت میتونیم اونو اعتبار سنجی کنیم که آیا این secret معتبر هست یا خبر.

 

تا اینجای کار فهمیدیم که JWT چیه و ساختارش چیه .. حالا بریم سراغ حملات مربوط به JWT و ببنیم داستانش به چه شکله.

بصورت کلی ما دو روش برای دور زدن JWT Token داریم ینی دو روش داریم برای اینکه بتونیم بدون احراز هویت لاگین کنیم که اصطلاحا بهش میگن Broken Authentication و همچنین میتونیم سطح دسترسی خودمون رو از guest به admin در صورت وجود داشتن اون آسیب پذیری مورد نظر انجام بدیم.

 

 

 

روش اول : دور زدن JWT Token با استفاده از آسیب پذیری

آسیب پذیری هایی که برای JWT Token تا به امروز کشف شده به شرح زیر می باشند :

 

که ما در ادامه قراره CVE-2015-2951 رو با هم دیگه بررسی کنیم.

ی آسیب پذیری تحت عنوان CVE-2015-2951 داریم ، که اینم ی آسیب پذیری توی کتابخونه f21/jwt هستش که f21/jwt یک کتابخونه ی JWT برای php می باشد و از نسخه ی 2.0 به پایین ، این کتابخونه آسیب پذیره و ما میتونیم با استفاده از این آسیب پذیریی که در این کتابخونه وجود داره بیایم و JWT رو bypass کنیم .. و برای exploit کردن این آسیب پذیری هم کافیه مقدار alg داخل header توکن رو none کنیم و بعدش با حذف کردن بخش signature میتونیم jwt رو بایپس کنیم 🙂 پس بریم تا داشته باشیم

خب

برای اینکار کافیه بریم به سایت target مورد نظر و کلیک راست کرده و inspector مرورگر باز کنیم و سپس از تب Application بخش cookie ـها اون session و کوکی ها و توکن هایی که سایت برای احراز هویت کاربر ازش استفاده میکنه رو میتونیم ببنیم که برای هر کاربر هم منحصر بفرده ، به شرح زیر :

 

 

 

خب همونطور که میبینید این داره با jwt token سطح دسترسی کاربر رو مشخص میکنه و زده login as a guest که ما میتونیم با استفاده از این آسیب پذیری سطح دسترسیمون رو از میهمان به ادمین تغییر بدیم .. الان کافیه این توکن رو از اینجا کپی کنیم و بدیمش به jwt.io و خروجی زیر رو بهمون میده :‌

 

 

 

خب اینجا کافیه در بخش payload کلید name رو مقدارش از guest به admin تغییر بدیم و در بخش Header کلید alg که الگوریتم رمزنگاری اون secret رو مشخص میکنه مقداش رو از HS256 که ی نوع متد رمزنگاری متقارن هستش رو به none تغییر بدیم.

و وقتی که اینکارا رو انجام دادیم کافیه که اون قسمت سوم token که secret هستش و توکن با استفاده از اون sign میشه رو حذف کنیم ، به شرح زیر :‌

 

 

 

فقط توجه داشته باشید که برای اینکار ینی none کردن algorithm توکن ، ممکنه سایته یکم اذیت کنه و توکن رو پاک کنه که در صورت بروز این مشکل میتونیم بیایم بصورت دستی اون jwt رو از base64 decode کنیم (و اینجا باید اون قسمت سومش رو هنگام deocde حذف کنیم ینی secret ـش رو باید برداریم) :

 

 

 

و حالا این مقدار decode شده رو کپی می کنیم و به شرح زیر تغییرش میدیمو دوباره به base64 انکدش می کنیم :

 

 

فقط اینجا هم توجه داشته باشید که اون علامت مساوی هایی که اخر عبارت encode شده میزاره رو باید حذف کنید و بجاش ی دونه dot یا همون نقطه بزارین (.) و در آخر باید اونارو کنار هم بزاریم به شرح زیر :‌

 

 

 

 

خب حالا کافیه که این jwt token ـی که ساختیم رو بجای اون jwt فعلی که سایت بهمون داده ست کنیم ، به شرح زیر :

 

 

 

خب الان بعد از ست کردن توکن کافیه صفحه رو رفرش کنید و تمام!

 

 

 

روش دوم : بدست آوردن Secret توکن با استفاده از Brute Force

خب همونطور که گفتم ، برای اینکه JWT روامنش کنن اومدن یچیزی گذاشتن بنام secret که ما تا زمانی که اون secret رو نداشته باشیم نمیتونیم اون JWT ـهای مشابه رو درست کنیم یا spoof کنیم .. حالا در این روش ما میایم روش ها و ابزار های کرک کردن این secret رو مورد بررسی قرار میدیم.

 

خب ما با استفاده از ابزار jwt-cracker و ابزار های مشابه بیایم jwt token رو کرک کنیم.

 

قبل از اینکه بریم سراغ کرک بیایم یکم عمیقتر بررسی کنیم که دقیقا چه چیزی رو قراره کرک کنیم .. خب ببنید وقتی میریم تو سایت jwt.io و ی توکن برامون میسازه از قسمت secret میتونیم برای اون توکن یک عبارتی ست کنیم که اون عبارت در نهایت با اون متد رمزنگاری مورد نظر رمزنگاری شده و سپس jwt token ما sign میشه .. به شرح زیر‌ :‌

 

 

 

همونطور که میبنید الان توکن ما با رمز 1234 مثلا sign شده و الان میخوایم این رمز رو بصورت blackbox ـی بدست بیاریم.

برای اینکار میایم از ابزار jwt-cracker استفاده میکنیم به شرح زیر :

jwt-cracker <token> [<alphabet>] [<maxLength>]

 

سینتکس این دستور به این شکله که اول باید token رو به عنوان ورودی بهش بدیم و سپس اون کاراکتر هایی که قراره برامون حالت های مختلفش رو تست کنه تا به رمز اصلی برسه و در اخر هم طول اون کاراکتر هایی که میخواد تست کنه رو بهش میدیم .. به شرح زیر :‌

jwt-cracker eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SP0R2USEDHqPV7mcIK08 ZAs4WtPMQ0NdMHuSD8tnWOw “1234567890” 4

 

خب حالا من این دستورو داخل ترمینالم میزنم تا خروجیشو شما هم ببنید :

 

همونطور که میبنید secret رو برامون کرک کرد.

حالا شما میتونید حالت ها و کاراکتر های مختلفی رو تست بکنید تا به کلید اصلی برسید .. و ناگفته نماند که دیگه این ابزار یکی از خوبیاش اینه که ورد لیست هم نمیخواد چون خودش میاد بر اساس کاراکتر هایی که بهش میدید همه ی حالت هارو همزمان تست میکنه.

زمانی که secret رو بدست آوردید میتونید به روش اول رجوع کنید و حالا تغییرات مورد نظر رو بر اساس اون policy ـهای اعمال شده اعمال کنید .. که اینم برای اعتبار سنجیش باید برید به سایت jwt.io و اونجا بدید که در ادامه به این مبحث هم میپردازیم.

 

خب الان شاید براتون سوال شه که رمز رو بدست اوردیم ، بعدش چیکار کنیم ؟! خب باید بگم که ما secret اون jwt token رو وقتی بدست بیاریم میتونیم اطلاعات مربوط به payload رو تغییر بدیم و وارد حساب کاربری یکی دیگه شیم یا اصطلاحا Impersonation (جعل هویت) انجام بدیم و… که مثالش رو در ادامه میزنم.

زمانی که secret رو بدست آوردید کافیه برید به سایت jwt.io و اون توکن رو اونجا paste کنید و سپس اون secert مورد نظر رو در بخش secret جایگذاری کنید :

 

 

 

خب همونطور که میبینید من 1234 که secret توکنم بود رو در قسمت secret signature جایگذاری کردم و الان کافیه مقادیر داخل payload رو به دلخواه تغییر بدیم همین ، به شرح زیر :‌

 

 

 

 

 

همونطور که مشاهده می کنید الان من مقدار name رو به admin تغییر دادم بهمراه secret معتبر که بدست اوردیم و پایین هم زد signature validate و این یعنی کارمون رو درست انجام دادیم و کافیه الان این توکن رو جایگزین توکن فعلی خودمون در سایت کنیم 🙂

 

 

 

توضیحات تکمیلی

خب من روش های اصلی و معروف رو برای انجام حملات مربوط به jwt خدمتتون گفتم!…

و درکل برای کشف آسیب پذیری توی JWT Token ـها علاوه بر اینکه باید دو روش بالارو روی اون JWT Token مورد نظرتون تست کنید ، شما باید آسیب پذیری های مختلفی که برای JWT وجود داره هم روی اون توکن مورد نظرتون تست کنید ، که برای اینکار کافیه از ابزار  JWT_Tool که در ادامه هم آدرسش رو براتون قرار میدم استفاده کنید ، دیگه این میاد آسیب پذیری های مختلفی که برای jwt وجود داره رو براتون تست میکنه و نتیجشو بهتون میگه.

خب

همونطور که گفتم ی ابزار خیلی خوب داریم که کلا برای exploit کردن آسیب پذیری های jwt استفاده میشه ، بنام JWT Tool ،‌ که این ابزار هم میتونید از این آدرس دانلود و استفاده کنید ، راهنمای استفاده از ابزار هم داخل اون آدرسی که براتون گذاشتم بصورت کامل وجود داره .. که دیگه اینو بعنوان تمرین میسپارم به خودتون چیز خاصی نداره فقط کافیه طبق manual ـی که داره پیش برید و راهنماشو بخونید همین 🙂

 

خب اینم از این.

 

ناگفته هم نماند که با Burp Suite هم شما میتونید این حرکتارو بزنید و برای تمرین هم میتونید از آزمایشگاه (lab) خود portswigger استفاده کنید.

 

 

امیدوارم از این مطلب لذت کافی رو برده باشید 🙂

 

 

 

درباره نویسنده



نظرات کاربران



دیدگاهتان را بنویسید

مطالب مرتبط