تسجيل الدخول DoS سأناقش في هذه المقالة كيف يمكنك ايجاد خطأً في برنامج خاص على HackerOne.
نظرة عامة على البرنامج
- الصناعة: البرمجيات والتطبيقات
- نوع البرنامج: خاص
- الحد الأدنى للمكافأة: 50 دولارًا
- الأعلى. المكافأة: 500 دولار
- كفاءة الاستجابة: 70%+
ما هو DoS أو رفض الخدمة؟
رفض الخدمة، أو ببساطة DoS، هو نوع من الهجوم، حيث يرسل المهاجم طلبات متعددة إلى السيرفر لتسبب تعطل السيرفر أو إضافة تأخير كبير في توقيت الاستجابة لجميع المستخدمين.
يمكن أن يؤدي هذا إلى خسارة الأعمال حيث لن يتمكن عملاء موقع الويب هذا من الوصول إلى موقع الويب وتنفيذ الإجراءات، مثل شراء الأشياء إذا كان موقعًا للتجارة الإلكترونية، والدردشة مع أشخاص آخرين إذا كان برنامجًا يشبه المنتدى العام، إلخ.
عادةً ما يكون الطلب الذي يتم إرساله إلى السيرفر سببًا في تصميم DoS بشكل خاص مما يضيف تأخيرًا كبيرًا في توقيت الاستجابة.
وهذا يجعل السيرفر ينفق المزيد من الموارد على طلب المهاجم او الهكر المصمم خصيصًا، وسيتم تخصيص موارد أقل لطلب العميل الحقيقي، مما يؤدي إلى رفض الخدمة بالكامل أو التسبب في تأخير
ماذا يحدث عند الضغط على زر تسجيل الدخول؟
سنناقش في هذا القسم من المقالة ما يحدث عند النقر فوق زر تسجيل الدخول. يتضمن ذلك العمليات التي تحدث على جانب السيرفر.
بالنسبة لأي تطبيق ويب لمنع تسرب كلمات مرور المستخدم في نص عادي (وليس كتجزئة) حتى بعد خرق البيانات، تقوم الشركات بتخزين كلمة المرور الخاصة بها في شكل تجزئات.
هذه بعض الوظائف الخاصة التي تحول السلاسل من أي طول إلى سلسلة ذات طول ثابت.
يمكنك تحويل سلسلة إلى تجزئة، لكن لا يمكنك القيام بالعكس.
بأخذ مثال MD5، يمكنك تحويل السلسلة “password” إلى تجزئة MD5 “5f4dcc3b5aa765d61d8327deb882cf99″، لكن لا يمكنك تحويل “5f4dcc3b5aa765d61d8327deb882cf99” مباشرة إلى “password”
التجزئة هي عملية معقدة. أنها تنطوي على حسابات ثقيلة. على الرغم من أن المثال الموضح هنا، أي دالة التجزئة MD5، يستغرق وقتًا أقل مقارنة بالوظائف الأخرى، إلا أنه يعتبر غير آمن بعض الشيء، ولكنه لا يزال يوفر حملاً جيدًا على وحدة المعالجة المركزية.
العودة إلى نقطة ما يحدث بعد النقر فوق تسجيل الدخول.
يتم إرسال طلب إلى السيرفر يتضمن اسم المستخدم وكلمة المرور المحددة من قبل المستخدم.
يتم تحويل كلمة المرور إما إلى تجزئة على الواجهة الأمامية فقط (بمساعدة وظائف Javascript)، أو يتم إرسالها كنص عادي (عمومًا عبر HTTPS) إلى السيرفر، الذي يقوم بعد ذلك بحساب تجزئة كلمة المرور.
إذا تم حساب التجزئة على الواجهة الأمامية فقط، فهناك فرص ضئيلة لأن يكون السيرفر عرضة لهذا الهجوم.
لكي يحدث هذا الهجوم، يجب على السيرفر حساب التجزئة للسلسلة المقدمة
كلما كانت السلسلة أطول، كلما زاد الوقت وطاقة وحدة المعالجة المركزية التي ستستهلكها لحساب التجزئة.
هذا يعني أنه يتعين علينا إرسال سلسلة طويلة إلى التطبيق.
كيفية إرسال سلسلة طويلة إلى السيرفر؟
الآن، بمجرد أن نعرف ما يحدث على الواجهة الخلفية، يجب أن تكون قد عرفت كيفية التسبب في حجب الخدمة (DoS).
نحتاج فقط إلى إرسال سلسلة طويلة في معامل كلمة المرور.
في هذا المثال لننظر في الطلب التالي:-
POST /login
Host: www.target.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
--snip--
Content-Length: 123
username=*****&password=********
في الطلب المذكور أعلاه، المعامل الذي يحتوي على كلمة المرور هو password
.
لكن قبل أن نرسل سلسلة طويلة، ما هو طول السلسلة الطويلة بالضبط؟
حسنا، ذلك يعتمد على السيرفر. إذا نفذ السيرفر بعض خوارزميات التجزئة الجيدة، فسيستغرق الأمر وقتًا أطول، والعكس صحيح.
بشكل عام، يجب اختبار كلمات المرور التي يزيد طولها عن 10000 حرف، وذلك عن طريق زيادة طول السلسلة.
يمكن لبرنامج Python النصي التالي إنجاز عملك: –
for x in range(50000, 500000, 10000): #start:as it is , stop: as per your system's limit and considering the server load, step: value greater than 10K recommended
print("a"*x)
سيقوم برنامج Python النصي أعلاه بإنشاء أحرف يتراوح طولها بين 50 ألف إلى 500 ألف، مع اختلاف 10 آلاف بين كل سلسلة.
يمكنك حفظ البرنامج النصي وتشغيله وحفظ مخرجات هذا في ملف: –
python3 generate.py > lst.txt
وهذا يعني أن السطر الأول من الإخراج سيحتوي على 50 ألف حرف، والسطر الثاني سيحتوي على 60 ألف، وهكذا.
يمكن اختبار التوقيت باستخدام proxies تطبيقات الويب مثل Burp أو ZAP أو Caido.
في حالتي، استخدمت caido، لأنه proxy خفيف جدًا مقارنة بالبرامج الأخرى.
استخدام proxy تطبيق ويب لإرسال طلب كبير
الآن، سأقوم بتشغيل proxy تطبيق الويب الخاص بي، وهو Caido (وليس عرضًا ترويجيًا).
في المتصفح، سأفتح الهدف، وأتوجه إلى صفحة تسجيل الدخول، أي https://www[.]target[.]com/login
بعد ملء كافة التفاصيل في صفحة تسجيل الدخول، سأرسل طلب تسجيل الدخول، والذي في مثالنا هو POST /login
التشغيل الآلي (الدخيل في Burp). بعد وضع علامة على موضع الـ payload ( password المعامل)، سأقوم بتعيين نوع الـ payload على “قائمة بسيطة”، وسأقوم بتحميل ملف الإخراج لرمز Python أعلاه
الآن، سأبدأ الهجوم ببساطة، وأتفحص توقيت الاستجابة للطلبات
في لقطة الشاشة أعلاه، يمكنك أن ترى أنه مع زيادة معرف الطلب، يزداد وقت الاستجابة أيضًا. وهذا يعني أن السيرفر عرضة لهذا الهجوم
الآن، يحتاج المهاجم إلى الاستمرار في إرسال الطلبات، مع عدد أكبر من العمال (بمعدل سريع جدًا) وفي النهاية، سيؤدي ذلك إلى حجب الخدمة على السيرفر.
لاحظ أنه لإثبات التأثير على السيرفر، لا تحتاج إلى التسبب في حجب الخدمة. يعد هذا أيضًا خارج نطاق البرامج التي تتسبب في حجب الخدمة فعليًا (على الرغم من أنها قد تقبل ثغرات DoS). مجرد إظهار الفرق في زمن الاستجابة يكفي.
أماكن أخرى للبحث عن هذه الثغرة الأمنية
إذا عثرت على ثغرة أمنية في مكان ما، فمن المحتمل أن تتمكن من العثور على نفس الثغرة الأمنية في أماكن أخرى على تطبيق الويب.
فيما يلي بعض الأماكن الأخرى التي تستحق التحقق إذا وجدت هذا النوع من الثغرة الأمنية: –
- صفحة التسجيل: يمكن للمهاجم تعيين كلمة مرور طويلة أثناء التسجيل
- نسيت كلمة المرور: يمكن للمهاجم تعيين كلمة مرور طويلة بعد النقر على “نسيت كلمة المرور”.
- تغيير كلمة المرور: في إعدادات الحساب، يمكن للمهاجم تعيين كلمة مرور طويلة بعد إدخال كلمة المرور القديمة
- تغيير كلمة المرور (من لوحة إدارة المؤسسة): يمكن للمهاجم، بعد إنشاء حساب شركة وهمي، إضافة مستخدم جديد، وتغيير كلمة المرور الخاصة به إلى شيء طويل.
نموذج التقرير
## Summary
An attacker can cause DoS on the server by sending multiple login requests with long passwords
## Steps to reproduce
If you are using some GUI tool, make sure your system is capable enough of that. If not, please keep the character limit lower in the attack else your system will crash.
- Save the following Python script
```python
for x in range(50000, 500000, 10000): #start:as it is , stop: as per your system's limit and considering the server load, step: value greater than 10K recommended
print("a"*x)
```
- Adjust the limits as per your system
- Now, head over to <login_page_url>
- Capture the login request.
- Now, set the output of the Python script given above as the payload (in burp/ZAP/caido)
- Start replaying the request
- As the length of the payload increases, the response time also increases
If you want, you can also use the CLI, copy the request as cURL (right click > copy as cURL in all proxies), and modify the request as per your choice (remove garbage, etc). To make the length of the password big, use the following
```bash
curl .... -d "username=****&password=$(python3 -c 'print("a"*20000)')"
```
## Screenshot
<add screenshot from the intruder in burp>
## References
- [Possible denial of service when entering a loooong password - Nextcloud](https://hackerone.com/reports/840598)
- [No length on password - Imgur](https://hackerone.com/reports/1411363)
## Impact
An attacker can cause DoS on the system causing business losses
## Remediation
Before calculating the hash for the password on the server, make sure the length is less than what is set when storing the password