user enumeration - تعداد المستخدمين

مقدمة

تعداد المستخدمين (Users Enumeration) هي طريقة بيستخدمها الهاكرز علشان يجمعو اكبر قدر من اسماء المستخدمين (usernames) الموجودين علي النظام لاستخدامها لاحقا في هجوم اكبر علي التطبيق او النظام, بمعرفة وجود مستخدم علي نظام ما او تطبيق ك attacker كدا قطعت نصف الطريق متبقي تخمين الباسورد وكدا قدرت استحوذ علي حساب المستخدم (account takeover)

الاختبار

في أكثر من طريقة ممكن ننفذ بيها عملية تعداد المستخدمين (users enumeration)

1- عن طريق صفحة تسجيل الدخول

2- عن طريق صفحة اعادة تعيين كلمة المرور

3- عن طريق صفحة أنشاء حساب جديد

4- عن طريق هجوم يسمي timing attack

استخدام صفحة تسجيل الدخول (login page)

ازاي عملية تسجيل الدخول بتتم؟

1- المستخدم بيكتب الاسم وكلمة المرور وبيضغط علي تسجيل الدخول

2- المتصفح بيبعت طلب (HTTP request) للتطبيق

3- التطبيق بيتأكد من وجود المستخدم في قاعدة البيانات

-- لو اسم المستخدم مش موجود في قاعدة البيانات بيرجع برسالة خطأ للمستخدم ومش هيعمل باقي الخطوات

4- لو المستخدم موجود بيعمل مقارنة لل password hash اللي المتستخدم بعته بال password hash اللي متسجل في قاعدة البيانات

5- لو ال password hashes متماثلين بيرجع للمستخدم بالبيانات الخاصة بيه

6- لو مش متماثلين بيرجع للمستخدم برسالة خطاء

السر هنا في الرسالة, ممكن تكون واحدة من الرسايل دي:

1- رسالة مفادها ان المستخدم مش موجود اصلا في قاعدة البيانات

2- رسالة مفادها أن كلمة المرور غير صحيحة

بسبب الفرق الواضح في الرسايل ك attacker انا بقيت قادر ان اعرف هل المستخدم موجود ولا لا

استخدام صفحة اعادة تعيين كلمة المرور

اعادة تعيين كلمة المرور هي خاصية بتسمح للمستخدم بتغير كلمة المرور الخاصة بيه في حالة نسيانها بدون الرجوع لمدير (Admin) الموقع او التطبيق.

ازاي الخاصية دي بتشتغل؟

اعادة تعيين كلمة المرور ممكن تتم بكذا طريقة :

1- ممكن تكتب اسمك او رقم التليفون او البريد الالكتروني

3- ممكن يطلب البريد الالكتروني بس ويبعتلك ايميل

بعد ما بتختار الوسيلة اللي التطبيق هيبعلتلك عليها رمز اعادة التعيين التطبيق ممكن يرد عليك بكذا رسالة

1- رسالة مفادها ان التطبيق بعتلك ايميل

2- رسالة مفادها ان البريد الالكتروني اللي انت كتبته مش موجود في قاعدة البيانات

من الرسايل دي نقدر نستنج هل اسم المستخدم او البريد الالكتروني متسجل في التطبيق ولا لا

استخدام صفحة انشاء حساب جديد

لما بتنشئ حساب جديد وتستخدم البريد الالكتروني التطبيق قبل ما بيسجلك بيشوف هل البريد الالكتروني مسجل مسبقا ولا لا لو مسجل مسبقا مش بيسمحلك بانشاء حساب بنفس البريد الالكتروني ونفس الكلام مع اسم المستخدم التطبيق مش هيسمحلك تختار اسم مستخدم موجود في قاعدة البيانات

بناء علي الردود (Responses) السابقة نقدر نحدد هل المستخدم موجود ولا لا

استخدام ال timing attack

ال timing attack هو side channel attack بيعتمد فيه ال attacker علي استنتاج المعلومات بناء علي الوقت اللي بيستغرقه النظام في اجراء عملية معينه

In computer security, a side-channel attack is any attack based on information gained from the implementation of a computer system, rather than weaknesses in the implemented algorithm itself. Timing information, power consumption, electromagnetic leaks or even sound can provide an extra source of information, which can be exploited. Some side-channel attacks require technical knowledge of the internal operation of the system, although others such as differential power analysis are effective as black-box attacks. The rise of Web 2.0 applications and software-as-a-service has also significantly raised the possibility of side-channel attacks on the web, even when transmissions between a web browser and server are encrypted, according to researchers from Microsoft Research and Indiana University. Many powerful side-channel attacks are based on statistical methods pioneered by Paul Kocher.Wikipedia

ازاي نقدر نستفيد من ال timing attack

لما بنعمل login التطبيق بيشوف هل الاسم موجود في قاعدة البيانات ولا لا, لو الاسم موجود بيعمل مقارنه لل password hashes

في حالة لو الاسم مش موجود اصلا التطبيق مش هيشغل ال hashing algorithm بالتالي هياخد وقت اقل في الresponse اما لو الاسم موجود هيتأخر شوية لان hashing algorithm مصممه انها تبقي بطيئة بالتالي هياخد وقت اكبر لحد مال الresponse يجي

حاولت هنا اسجل الدخول باسم مش موجود التطبيق رد عليا برسالة عامة مقدرش احدد منها اذا كان الاسم موجود ولا لا , لاكن وقت الرد (response time) تقريبا 2 millisecond

هنا حاولت اسجل الدخول باسم موجود ولاكن الباسورد غلط رد عليا بنفس الرسالة لاكن لو لاحظنا الوقت هنلاقية اتغير وبقا 117 millisecond التطبيق اخد وقت اطول

الحلول

1- استخدم الرسائل العامة بدل الرسائل المخصصة

في ال login استخدم

Login failed; Invalid user ID or password.

بدل

Login failed; this user is not active.

Login for User foo: invalid password.

Login failed, invalid user ID.

Login failed; account disabled.

في ال password reset استخدم

If that email address is in our database, we will send you an email to reset your password.

بدل

This email address doesn't exist in our database.

We just sent you a password reset link.

في ال registration استخدم

A link to activate your account has been emailed to the address provided.

بدل

This user ID is already in use.

Welcome! You have signed up successfully.

2- بالنسبة لل timing attack حاول متخليش وقت الResponse مختلف كتير في حالة وجود اسم المستخدم من عدمة يعني مثلا لو الRequest بياخد 50 millisecond في حالة ان الاسم مش موجود وبياخد 150 في حالة وجود الاسم ممكن اخلي وقت الResponse في حالة ان الاسم مش موجود يزيد بيحيث انو يبقي متقارب ما الResponse في حالة وجود الاسم ( الوقت المستغرق للرد يكون واحد او متقارب)

الحلول اللي فاتت دي ممكن تكون ضد ال UX يعني مثلا لو في مستخدم بيحاول يعمل login والتطبيق رد برسالة عامة في حالة عدم نجاح عملية تسجيل الدخول غالبا هيسيب التطبيق لانو مش فاهم ايه المشكلة هل اسم المستخدم اللي غلط ولا كلمة المرور

3- استخدم CAPTCHA علشان تصعب علي الattacker انو ينفذ عملية ال enumeration بشكل اَلي

4- حاول تعمل حد لمعدل الطلبات (Rate liming)

المصادر

1- https://blog.rapid7.com/2017/06/15/about-user-enumeration/

2- https://www.triaxiomsecurity.com/2019/03/15/vulnerability-walkthrough-timing-based-username-enumeration/

3- https://littlemaninmyhead.wordpress.com/2015/07/26/account-enumeration-via-timing-attacks/

4- https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html

Last updated