مضى على الشبكة و يوم من العطاء.
  • تحذير: يجب على كل روّاد الشبكة تشغيل برامج الاختراق داخل الأنظمة الوهمية وهي بهدف التعلم وحماية الأعضاء والتوعية بها

[ WalkTh ] تجاوز المصادقة ـ ( Authentication Bypass )

3b0-0d3b0-0d is verified member.

{ || مشرف قسم CTF || }
.:: طاقم المشرفين ::.

السمعة:

Authentication Bypass
1700573904065.png
راح اشرح كيفية تجاوز وكسر عمليات تسجيل الدخول والأساليب الأخرى للمصادقة على مواقع الويب. هذه الثغرات يمكن أن تكون من بين أخطر الثغرات الأمنية لأنها غالباً ما تؤدي إلى تسريب بيانات العملاء الشخصية.

راح نحكي عن كيفية التعامل مع هذه الثغرات وكيفية تجنبها أو إصلاحها.


راح يكون الحكي عن اربع مواضيع بالتحديد :

1. جمع معلومات ( Username Enumeration ).

2. القوة الغاشمة ( Brute Force ).

3. خطأ منطقي ( Logic Flaw ).

4. التلاعب بملفات تعريف الارتباط ( Cookie Tampering ).


الاسئله من TryHackMe | HTTP in detail ,TryHackMe | Authentication Bypass

احدى هذه الرومات تتطلب اشتراك ⚠️

جمع معلومات ( Username Enumeration )

الـ Username Enumeration ، يعني عملية لما حد بيحاول يدخل على حسابات أو مواقع بتحتاج تسجيل دخول. عشان نعرف إذا كان في أخطاء في النظام ولا لا، بنحتاج نعمل قائمة بأسماء مستخدمين صحيحة.

مثال على ذلك

الشغله الأولى إننا بنستخدم رسائل الخطأ اللي بتظهر لما حد بيحاول يسجل حساب جديد

لما نحاول نسجل باسم “admin” ونملأ باقي البيانات بمعلومات غير صحيحة، هنشوف رسالة خطأ بتقول “حساب بهذا الاسم موجود بالفعل”، هاد بكون مؤشر إن في حساب بالفعل باسم المستخدم موجود في النظام.

بنستخدم أداة اسمها ffuf عشان نعمل عملية Username Enumeration
.
1700573958343.png
الأمر هاد اللي بنستخدمه 👇
كود:
ffuf -w /usr/share/wordlists/SecLists/Usernames/Names/names.txt -X POST -d "username=FUZZ&email=x&password=x&cpassword=x" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.87.23/customers/signup -mr "username already exists"
الـ -w بحدد ملف الأسماء اللي بنستخدمه
الـ -X بيحدد نوع الطلب اللي هنبعثه ( وفي حالتنا هاي حيكون POST ).
الـ -d بيحدد البيانات اللي حنبعثها في الطلب.
الـ FUZZ بنستخدمها في الاسم عشان الأداة تحاول تجرب كل الأسماء من الملف.
الـ -H بيضيف هيدرز إضافية للطلب ( وراح نستخدمه عشان نحكي للموقع إننا راح نبعت بيانات نموذجية ) .
الـ -u بيحدد عنوان الموقع اللي راح نعمله الطلب عليه.
الـ -mr بيحدد النص اللي راح نبحث عنه على الصفحة عشان نتأكد إذا كان في اسم مستخدم صحيح أو لأ.

الملف اللي فيه الأسماء بتقدر تحملها من
هنا
1700574118964.png


القوة الغاشمة ( Brute Force )

بالبدايه راح نستخدم ملف اسمه valid_usernames.txt

الذي يحتوي على
كود:
admin
simon
steve
robert
الذي أنشأناه في مهمة سابقة. هذا الملف يحتوي على قائمة بأسماء مستخدمين صحيحين.

الآن، نريد استخدام هذا الملف لمحاولة اختراق صفحة تسجيل الدخول على العنوان التالي: http://10.10.87.23/customers/login ونريد القيام بذلك باستخدام تقنية تسمى Brute Force

ما هو هجوم Brute Force ؟ هو عملية تلقائية تقوم بمحاولة استخدام قائمة من كلمات المرور الشائعة مع اسم مستخدم معين أو، في حالتنا، مع قائمة من الأسماء.

لكي نقوم بهذا الهجوم، يجب أن يكون الترمينال ( النافذة التي نكتب فيها الأوامر ) في نفس المجلد الذي يحتوي على الملف valid_usernames.txt

الآن، دعونا نفحص الأمر الذي سنستخدمه مع أداة ffuf لتنفيذ هذا الهجوم بالتفصيل:
كود:
ffuf -w /location/to/valid_usernames.txt:W1,/location/to/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://( ip )/customers/login -fc 200
يجب

  1. تغير location/to/valid_usernames.txt/ الى مكان الملف الذي يحتوي على الاربع اسماء الذي تم ذكره سابقا
  2. تغير location/to/10-million-password-list-top-100.txt/ الى مكان ملف الباسوردات تجده داخل usr/share/wordlists/SecLists/Passwords/Common-Credentials
  3. تغير http://( ip )/customers/login الى الـ ip الخاص بالمشين من موقع TryHackMe
هذا الأمر يعتمد على أداة ffuf ويحتوي على الخيارات التالية:

الـ -w بحدد ملف الأسماء اللي بنستخدمه
الـ -X بيحدد نوع الطلب اللي هنبعثه ( وفي حالتنا هاي حيكون POST ).
الـ -d بيحدد البيانات اللي حنبعثها في الطلب.
الـ FUZZ بنستخدمها في الاسم عشان الأداة تحاول تجرب كل الأسماء من الملف.
الـ -H بيضيف هيدرز إضافية للطلب ( وراح نستخدمه عشان نحكي للموقع إننا راح نبعت بيانات نموذجية ) .
الـ -u بيحدد عنوان الموقع اللي راح نعمله الطلب عليه.
الـ 200 fc- هذا الخيار يستخدم لفحص إذا كانت الصفحة ردت برمز استجابة HTTP غير 200.

ببساطة، هذا الأمر يقوم بمحاولة تسجيل الدخول باستخدام قائمة من الأسماء وكلمات المرور على الصفحة المحددة ويتحقق إذا كان هناك رد استجابة غير 200، مما يشير إلى نجاح عملية الدخول بكلمة مرور معينة.

1700574136395.png

خطأ منطقي ( Logic Flaw )

احيانا، تحتوي عمليات المصادقة على أخطاء منطقية.
الخطأ المنطقي هو عندما يتم تجاوز المسار المنطقي النموذجي للتطبيق أو تجاوزه أو تلاعبه بواسطة هاكر.
يمكن أن تكون الأخطاء المنطقية موجودة في أي جزء من موقع الويب، ولكننا سنركز في هذا الحال على أمثلة تتعلق بعمليات المصادقة.

مثال على الخطأ المنطقي:

الكود الوهمي أدناه يتحقق مما إذا كان بداية المسار الذي يزوره العميل تبدأ بـ /admin وإذا كان الأمر كذلك، يتم إجراء فحوصات إضافية للتحقق مما إذا كان العميل فعلاً مسؤولًا. إذا لم يبدأ الصفحة بـ admin/، يتم عرض الصفحة للعميل.
كود:
if( url.substr(0,6) === '/admin')
{
    # الكود للتحقق مما إذا كان المستخدم مسؤولًا
}
 else
{
    # عرض الصفحة
}
بسبب استخدام الكود السابق ثلاثة علامات يساوي (===)، فإنه يبحث عن تطابق دقيق في السلسلة، بما في ذلك حالة الأحرف نفسها. يقدم الكود خطأً منطقيًا لأن المستخدم الذي لم يتم المصادقة على طلبه adMin/ لن يتم التحقق من امتيازاته وسيتم عرض الصفحة له، مما يتجاوز تمامً عمليات المصادقة.

تطبيق الخطأ المنطقي:

سنقوم بفحص وظيفة إعادة تعيين كلمة المرور

نجد نموذجًا يطلب عنوان البريد الإلكتروني المرتبط بالحساب الذي نرغب في إجراء إعادة تعيين كلمة المرور عليه. إذا تم إدخال بريد إلكتروني غير صالح، ستظهر رسالة خطأ تقول “لم يتم العثور على حساب من خلال عنوان البريد الإلكتروني المقدم”.

سنستخدم عنوان البريد الإلكتروني [email protected] والذي يتم قبوله. بعد ذلك، سيتم عرض المرحلة التالية من النموذج، الذي يطلب اسم المستخدم المرتبط بهذا عنوان البريد الإلكتروني للدخول. إذا قمنا بإدخال robert كاسم مستخدم وضغطنا على زر التحقق من اسم المستخدم، سيتم عرض رسالة تأكيد بأن بريدًا إلكترونيًا لإعادة تعيين كلمة المرور سيتم إرساله إلى [email protected] .


1700574149762.png


1700574161160.png

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

في الخطوة الثانية من عملية إعادة تعيين كلمة المرور، يتم إرسال اسم المستخدم في حقل POST إلى خادم الويب، ويتم إرسال عنوان البريد الإلكتروني في طلب السلسلة كحقل GET.

لنوضح ذلك باستخدام أداة Curl لإجراء الطلب يدويًا إلى خادم الويب.

Curl Request 1:
كود:
curl 'http://10.10.251.130/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert'
الـ -H لإضافة رأس إضافي إلى الطلب في هذه الحالة، نقوم بتعيين Content-Type إلى
application/x-www-form-urlencoded، مما يخبر خادم الويب أننا نرسل بيانات نموذج حتى يفهم طلبنا بشكل صحيح.

في التطبيق، يتم استرجاع حساب المستخدم باستخدام سلسلة الاستعلام، ولكن فيما بعد، في منطق التطبيق، يتم إرسال رسالة إعادة تعيين كلمة المرور باستخدام البيانات الموجودة في المتغير PHP $_REQUEST .

متغير PHP $_REQUEST :هي مصفوفة تحتوي على البيانات التي تم استلامها من سلسلة الاستعلام وبيانات POST. إذا تم استخدام نفس اسم المفتاح لكل من سلسلة الاستعلام وبيانات POST، فإن منطق التطبيق لهذا المتغير يميل إلى حقول بيانات POST بدلاً من سلسلة الاستعلام، لذا إذا قمنا بإضافة معلمة أخرى إلى نموذج POST، يمكننا التحكم في مكان تسليم رسالة إعادة تعيين كلمة المرور.

Curl Request 2:
كود:
curl 'http://10.10.251.130/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&[email protected]'
الخطوة التالية، ستحتاج إلى إنشاء حساب 👇

1700574178326.png


1700574184558.png
وذلك لأنه سيمنحك عنوان بريد إلكتروني فريد يمكن استخدامه لإنشاء تذاكر الدعم. عنوان البريد الإلكتروني يكون على النحو التالي: {اسم المستخدم}@customer.acmeitsupport.thm

الآن، بإعادة تشغيل Curl Request 2 ولكن باستخدام حسابك الخاص في حقل البريد الإلكتروني ستحصل على تذكرة تم إنشاؤها في حسابك تحتوي على رابط لتسجيل الدخول باسم Robert. باستخدام حساب Robert، يمكنك عرض تذاكر الدعم الخاصة به والعثور على علم.

Curl Request 2 ( لكن باستخدام حسابك )
كود:
curl 'http://10.10.251.130/customers/[email protected]' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&[email protected]'
1700574191949.png

ونجد الرساله لتسجيل الدخول تلقائي
1700574246660.png

عند تسجيل الدخول نجد تذكره داخلها الحل
1700574234047.png

التلاعب بملفات تعريف الارتباط ( Cookie Tampering )

الكوكيز هي عبارة عن قطع صغيرة من البيانات تُخزَّن على جهاز الكمبيوتر الخاص بك. تُحفظ الكوكيز عندما تتلقى رأس Set-Cookie من خادم الويب. بعد ذلك، في كل طلب تقوم به على الإنترنت، ستقوم بإرسال بيانات الكوكيز إلى خادم الويب. نظرًا لأن HTTP لا يحتفظ بسجل لطلباتك السابقة، يمكن استخدام الكوكيز لتذكير خادم الويب بمن أنت، وببعض الإعدادات الشخصية للموقع، أو ما إذا كنت قد قمت بزيارة الموقع من قبل. لنلقي نظرة على طلب HTTP كمثال:

في هذا الطلب، تُظهر الرسمة كيفية إدخال الكوكيز في طلبات HTTP للسماح بتخزين معلومات المستخدم

1700574221604.png
يمكن استخدام الكوكيز لأغراض متعددة، ولكنها تُستخدم عادة بشكل رئيسي للمصادقة على موقع الويب. قيمة الكوكيز عادة ما تكون رمزًا (رمز سري فريد غير سهل التخمين بواسطة البشر).
عرض الكوكيز
يمكنك بسهولة عرض الكوكيز التي يرسلها متصفحك إلى موقع الويب عن طريق استخدام أدوات المطور المتاحة في متصفحك.

عندما تفتح أدوات المطور، انتقل إلى علامة التبويب “الشبكة” (Network ). ستظهر لك هذه التبويب قائمة بجميع الموارد التي طلبها متصفحك. يمكنك النقر على كل طلب للحصول على تفصيل مفصل عن الطلب والاستجابة. إذا قام متصفحك بإرسال كوكيز، ستجدها في علامة التبويب “الكوكيز” (Cookies) للطلب.

هذا يسمح لك برؤية وفهم الكوكيز التي يتم إرسالها من متصفحك إلى مواقع الويب التي تزورها.

مثال: لنفترض أنك دخلت إلى موقع وسجلت دخولًا وحصلت على كوكيز تشير إلى أنك مستخدم عادي. إذا قمت بتعديل هذه الكوكيز لتجعل نفسك مديرًا، فيمكنك الآن الوصول إلى صفحات خاصة للمديرين.

Plain Text (النص العادي)
بعض الكوكيز تكون مفتوحة المحتوى ومفهومة بسهولة. مثل كوكيز تشير إلى ما إذا كنت مسجل الدخول أو إذا كنت مديرًا.

مثل كوكي logged_in=true تعني أنك مسجل الدخول، وكوكي admin=false تعني أنك لست مديرًا. بتغيير قيم هذه الكوكيز، يمكنك التحكم في صلاحياتك على الموقع.

Hashing (التجزئة)

التجزئة هي عملية تحويل نص إلى سلسلة أحرف أو أرقام. هذا التحويل غالبًا ما يتم باستخدام خوارزميات معينة ويُنتج هاش (سلسلة حرفية) فريدة لكل نص. هذا الهاش لا يمكن عكسه للحصول على النص الأصلي.

لمعرفه معنى الهاش بشكل مفصل بالمقال التالي 👇

مثال: إذا قمت بتجزئة كلمة “Hello”، فإن الهاش الناتج سيكون مثل “2ef7bde608ce5404e97d5f042f95f89f1”.

الكوكيز المشفرة تحتوي على بيانات مشفرة بطريقة تجعلها صعبة للغاية للقراءة أو التفكيك.

اذا سألت ليش بتقدر تعرف الجواب عن طريق المقال التالي 👇

مثال: كوكي مشفر يحمل قيمة “6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b”، وهذا النص هو نتيجة تجزئة (تشفير) معينة لمعلومة ما.

Encoding (الترميز)

الترميز هو عملية تحويل البيانات من شكل إلى آخر. على عكس التجزئة، يمكن عكس عملية الترميز للحصول على البيانات الأصلية.

لمعرفه معنى الترميز او الـ Encoding بشكل مفصل بالمقال التالي 👇

مثال: الترميز بنظام Base64 يحول البيانات الثنائية (الأصفار والواحدات) إلى سلسلة نصية تحتوي على أحرف وأرقام معينة. مثلاً، ترميز النص “Hello” بواسطة Base64 سيعطيك “SGVsbG8=”، ويمكن فك الترميز للحصول على النص “Hello” مرة أخرى.

في العادة، الكوكيز لا تُشفر (Encoding)، بل تُستخدم لتخزين بيانات نصية واضحة يمكن قراءتها بسهولة. ومع ذلك، هناك حالات استثنائية يتم فيها تشفير بعض محتوى الكوكيز لزيادة الأمان.

مثال: على ذلك هو استخدام التشفير عند تخزين معرِّف الجلسة (Session ID) في الكوكيز. في بعض الأنظمة، يمكن تشفير معرِّف الجلسة لمنع الوصول غير المصرح به إليه.

على سبيل المثال:

  • الكوكيز العادية: session_id=12345 (نص واضح)
  • الكوكيز المشفرة: session_id=7YhG9C6T8p8ZGK0S (مشفرة بطريقة تجعلها صعبة للقراءة والفهم)
Encoding VS Hashing

في الغالب، يتم استخدام التجزئة (Hashing) للكوكيز الحساسة مثل معرفات الجلسة.
بينما يتم استخدام التشفير (Encoding) لتمثيل البيانات بشكل قابل للقراءة بسهولة مثل الإعدادات الشخصية للمستخدم على الموقع.


اسئله
  • ما هو الرأس المستخدم لحفظ ملفات تعريف الارتباط على جهاز الكمبيوتر الخاص بك؟
1700574269440.png
الجواب Set-Cookie
1700574274671.png
ما هو (العلم) من تغيير قيم ملفات تعريف الارتباط للنص العادي؟
الجواب👇

يجب اول شيء تجربه عمل ريكويست

1700574281744.png
بعدها نعدل على كوكي logged_in لنجعله مسجل دخول وكوكي الادمن نضعها ترو
1700574290793.png
  • ما هي قيمة تجزئة md5 3b2a1053e3270077456a79192070aa78 ؟
الجواب👇

نستخدم موقع Crack Station
1700574348329.png

  • ما هي القيمة المشفرة الأساسية 64 لـ VEhNe0JBU0U2NF9FTkNPRElOR30= ؟
الجواب 👇

نستخدم موقع Base64 decode

1700574330783.png
  • قم بتشفير القيمة التالية باستخدام base64 هذه هي {"id":1,"admin":true}
الجواب👇

نستخدم موقع Crack Station

1700574317473.png
 

المرفقات

  • 1700574197528.png
    1700574197528.png
    18.3 KB · المشاهدات: 168
  • 1700574286357.png
    1700574286357.png
    14.2 KB · المشاهدات: 161
  • 1700574300152.png
    1700574300152.png
    1.5 KB · المشاهدات: 165
التعديل الأخير:
ايههههه العظمة ديييييي 🔥🔥😍
 
مرحبا انا في جزء مش عارف احلو هاذا هو
1727021458038.webp
 
سنقوم بفحص وظيفة إعادة تعيين كلمة المرور

نجد نموذجًا يطلب عنوان البريد الإلكتروني المرتبط بالحساب الذي نرغب في إجراء إعادة تعيين كلمة المرور عليه. إذا تم إدخال بريد إلكتروني غير صالح، ستظهر رسالة خطأ تقول “لم يتم العثور على حساب من خلال عنوان البريد الإلكتروني المقدم”.

سنستخدم عنوان البريد الإلكتروني [email protected] والذي يتم قبوله. بعد ذلك، سيتم عرض المرحلة التالية من النموذج، الذي يطلب اسم المستخدم المرتبط بهذا عنوان البريد الإلكتروني للدخول. إذا قمنا بإدخال robert كاسم مستخدم وضغطنا على زر التحقق من اسم المستخدم، سيتم عرض رسالة تأكيد بأن بريدًا إلكترونيًا لإعادة تعيين كلمة المرور سيتم إرساله إلى [email protected] .


[]
1700574149762.png


1700574161160.png

[/]في هذه المرحلة، قد تتساءل عن الضعف الذي يمكن أن يكون في هذا التطبيق حيث يجب عليك معرفة كل من عنوان البريد الإلكتروني واسم المستخدم ومن ثم يتم إرسال رابط إعادة تعيين كلمة المرور إلى عنوان البريد الإلكتروني لصاحب الحساب.

في الخطوة الثانية من عملية إعادة تعيين كلمة المرور، يتم إرسال اسم المستخدم في حقل POST إلى خادم الويب، ويتم إرسال عنوان البريد الإلكتروني في طلب السلسلة كحقل GET.

لنوضح ذلك باستخدام أداة Curl لإجراء الطلب يدويًا إلى خادم الويب.

Curl Request 1:
curl 'http://10.10.251.130/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert'الـ -H لإضافة رأس إضافي إلى الطلب في هذه الحالة، نقوم بتعيين Content-Type إلى
application/x-www-form-urlencoded، مما يخبر خادم الويب أننا نرسل بيانات نموذج حتى يفهم طلبنا بشكل صحيح.

في التطبيق، يتم استرجاع حساب المستخدم باستخدام سلسلة الاستعلام، ولكن فيما بعد، في منطق التطبيق، يتم إرسال رسالة إعادة تعيين كلمة المرور باستخدام البيانات الموجودة في المتغير PHP $_REQUEST .

متغير PHP $_REQUEST :هي مصفوفة تحتوي على البيانات التي تم استلامها من سلسلة الاستعلام وبيانات POST. إذا تم استخدام نفس اسم المفتاح لكل من سلسلة الاستعلام وبيانات POST، فإن منطق التطبيق لهذا المتغير يميل إلى حقول بيانات POST بدلاً من سلسلة الاستعلام، لذا إذا قمنا بإضافة معلمة أخرى إلى نموذج POST، يمكننا التحكم في مكان تسليم رسالة إعادة تعيين كلمة المرور.

Curl Request 2:
curl 'http://10.10.251.130/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&[email protected]'الخطوة التالية، ستحتاج إلى إنشاء حساب 👇

[]
1700574178326.png


1700574184558.png
[/]وذلك لأنه سيمنحك عنوان بريد إلكتروني فريد يمكن استخدامه لإنشاء تذاكر الدعم. عنوان البريد الإلكتروني يكون على النحو التالي: {اسم المستخدم}@customer.acmeitsupport.thm

الآن، بإعادة تشغيل Curl Request 2 ولكن باستخدام حسابك الخاص في حقل البريد الإلكتروني ستحصل على تذكرة تم إنشاؤها في حسابك تحتوي على رابط لتسجيل الدخول باسم Robert. باستخدام حساب Robert، يمكنك عرض تذاكر الدعم الخاصة به والعثور على علم.

Curl Request 2 ( لكن باستخدام حسابك )
curl 'http://10.10.251.130/customers/[email protected]' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&[email protected]'
[]
1700574191949.png

ونجد الرساله لتسجيل الدخول تلقائي

1700574246660.png

عند تسجيل الدخول نجد تذكره داخلها الحل
1700574234047.png
[/]
اقراء هاد بتمعن وان شاء الله بتوصلك الفكره اذا ما وصلتك احكيلي شو بالزبط ما فهمت
 
الله عليك يا فنان مبدع الله يبارك فيك يارب بالتوفيق إن شاءالله 🫶 (y)
 

آخر المشاركات

فانوس

رمضان
عودة
أعلى