السلام عليكم ، أثناء فحصي لجهاز التوجيه Router من إصدار شركة Huawei بهدف بعض عمليات الأتمتة ، اكتشفت أنك عندما تحاول تسجيل الدخول تقوم الصفحة بإرسال Request للـ Mini web server المدمج في الراوتر ، ويحتوي على بعض البيانات منها CSRF token و CSRF parameter واسم المستخدم ، وكلمة المرور لكن مشفرة ...
عندما بحثت عن الدالة المسئولة عن تشفير كلمة المرور وجدتها في ملف Javascript وبطبيعة الحال هذا الملف متاح للمستخدم بمجرد فتح صفحة الويب ، تلك هي طريقة التشفير:
var plaintPwd = this.content.get("UserName") + base64Encode(SHA256(this.content.get("Password"))) + csrf_obj.csrf_param + csrf_obj.csrf_token;
post_data["data"]["Password"] = SHA256(plaintPwd);
هذه هي الدوال المصممة خصيصا للتشفير ->
كما تلاحظون ، يتم التشفير على أربع مراحل:
1- يتم تشفير كلمة المرور باستخدام دالة SHA256
2- يتم تشفير الناتج السابق عن طريق دالة base64Encode
3 - يتم إضافة اسم المستخدم (غالبا admin) مع الناتج السابق وإضافة ناتج الدمج إلى اثنين من CSRF tokens يتم توليدهم بشكل عشوائي بمجرد تحميل الصفحة.
4- يتم تشفير الناتج السابق بواسطة SHA256 مرة أخرى
السؤال هو ، لماذا كل هذا الصداع ، ألم يكن من الممكن استخدام خوارزميات جاهزة ومعروفة مثل SHA256 مثلا واستخدامها مع كلمة المرور فقط (أعتقد جافا سكربت مليئة بالمكتبات المختصة بالتشفير) ؟؟
أنا لم أستطع قراءة الدوال جيدا ، لكن أليس استخدام تلك الطريقة يعد Over Engineering ؟
التعليقات
تطبيق base64 بعد sha هو ممارسة شائعة لأن الناتج من SHA256 هو raw bytes وعند تطبيق base64 encoding تتحول ال ascii
وبالبنسبة لنقطة جمع اسم المستخدم وcsrf + ناتج ال base64
فمما ذكرت فان CSRF يتم توليدها عشوائيا ومع معلومة أن من خصائص ال Hashing أن يكون نفس ل input نفس ال output دائما وهو ما لا يتحقق إذا كان CSRF عشوائي
إذا يمكننا إستتناج أن الهدف ليس هو عمل Hashing دائم لكلمة المرور بل عمل hashing ثابت فقط طوال مدة الجلسة session ويتغير من جلسة لاخرى
وهذا يسمي PseudoRandom Function (PRF ) ويختلف عن PseudoRandom Generator (PRNG )
في انه يعتمد على
* Random Seed والتي تمثلها CSRF العشوائية
* Fixed Input والتي يمثلها اسم المستخدم وكلمة المرور
بدون استخدام PRF واستخدام SHA فقط فالناتج دائما ثابت وهو ما يمثل خطورة
لأن الناتج من SHA256 هو raw bytes
في الواقع الناتج النهائي تم تشفيره مرة أخرى في الخطوة الأخيرة بواسطة دالة SHA256 والناتج نص وليس raw bytes ، وذلك النص يتم إرساله مع باقي البيانات داخل json في POST request إلى المخدم، أنا قمت بتحويل دوال التشفير إلى لغة بايثون بواسطة js2py ، واستطعت الحصول على نفس الناتج الذي يتم توليده في المتصفح ، وقمت بإكمال البرنامج ونجحت في تسجيل الدخول بواسطة requests مباشرة دون فتح متصفح.
أشكرك على شرح الفارق بين PRF و PRNG ، لكن هناك شيء آخر وهو عنوان الموضوع ، لماذا قاموا بابتكار base64Encode و SHA256 ؟
أعني هل توجد مشكلة من استخدام jQuery plugin جاهزة تقوم بتلك العملية ؟ المطورين بالفعل يستخدمون مكتبة jQuery
<script type="text/javascript" language="javascript" src="/lib/cat_jquery.js.jgz"></script>