JWT (JSON Web Tokens)
كيف تحمل الرموز الموقعة هويتك وثلاث طرق كلاسيكية يتحقق بها الخادم منها خطأ: قبول alg none وسر ضعيف وخلط RS256 بـ HS256
- المسار
- أمن الويب
- الوقت المتوقع
- 30 د
- المستوى
- متوسط
قبل هذا الدرس
رمز JWT ملاحظة صغيرة موقعة يعطيك إياها الخادم بعد الدخول في كل طلب لاحق تعيدها فيتحقق الخادم من التوقيع فإذا صح وثق بما تقوله الملاحظة من أنت ودورك البيانات داخله مجرد Base64 يقرأها أي أحد والتوقيع هو ما يجعله موثوقا فكل هجوم على JWT هو في الحقيقة هجوم على كيف يتحقق الخادم من ذلك التوقيع
كيف يبدو الرمز
ثلاثة أجزاء Base64url تفصلها نقاط header.payload.signature
// header // payload
{ "alg": "HS256", { "user": "guest",
"typ": "JWT" } "role": "member" }الترويسة تحدد الخوارزمية والحمولة هي الادعاءات والتوقيع يحسب على header.payload بمفتاح
غير أي بايت في الحمولة فلا يطابق التوقيع إلا إذا تحقق الخادم منه خطأ
ثلاث طرق للخطأ
- alg none المعيار فيه خوارزمية none تعني بلا توقيع فإذا قرأ الخادم الخوارزمية من الرمز واحترم none قبل رمزا بلا أي توقيع فأي أحد يكتب أي حمولة
- سر ضعيف HS256 يوقع بسر مشترك لو كان السر قصيرا أو شائعا مثل
ravensكسره المهاجم دون اتصال بقائمة كلمات ثم وقع أي رمز قوة HMAC كلها في سرية سره - خلط الخوارزميات الخادم يستخدم RS256 مفتاح خاص يوقع وعام يتحقق لكنه يقبل أيضا HS256 ويتحقق منه بنفس المفتاح العام كسر HMAC والمفتاح العام معلن فالمهاجم يوقع به رمز HS256 فيقبله الخادم
كيف تنحمى منها
// Pin the algorithm on the server. Never read it from the token. Never accept none.
jwt.verify(token, KEY, { algorithms: ['HS256'] }); // or ['RS256']ثبت الخوارزمية المقبولة في كودك ومررها للمتحقق استخدم سرا عشوائيا طويلا لـ HS256 (32 بايت فأكثر من مخزن أسرار ويدور) أو توقيعا غير متماثل RS256 أو EdDSA حيث لا يحمل المتحقق أي سر توقيع وامنع مفتاح التحقق من أن يستخدم يوما كسر متماثل واضبط صلاحية قصيرة وتذكر أن الحمولة مقروءة فلا تضع فيها أسرارا واعتمد على مكتبة JWT مصانة فالتحقق المكتوب باليد هو مكان هذي الأخطاء
اللابات
توقيع اختياري
محلولسهللاب في المتصفح
زور رمزا يجعل الخادم يعاملك كـ admin
ادخل اللابمقفلسر يمكن كسره
محلولمتوسطلاب في المتصفح
اكسر سر التوقيع ثم وقع رمزا جديدا يجعلك admin
ادخل اللابمقفلخلط بين الخوارزميات
محلولصعبلاب في المتصفح
استغل الخلط بين RS256 و HS256 لتزوير رمز admin باستخدام المفتاح العام
ادخل اللابمقفل
