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

شرح Talking Web | التحدث مع الانترنت | مع حل 39 تحدي 📣✨

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

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

السمعة:

Screenshot 2024-12-27 110337.webp

ملف:بسم الله الرحمن الرحیم..png - ويكيبيديا


شرح أول موضوع في Intro to Cybersecurity
الـ Talking Web يحتوي على 39 تحدي

مقدمة

لو بتقرأ بالمقال أكيد قاعد بتتصفح الإنترنت باستخدام الشبكة العنكبوتية العالمية World Wide Web
هي مشروع ضخم اشتغلت عليه البشرية خلال آخر 30 سنة وهدفها إنها توصل مصادر معلومات متنوعة وأحيانًا مش دايمًا مفيدة ببعضها ضمن شبكة ضخمة من المعلومات والأنظمة حول العالم

شو هي الشبكة العنكبوتية؟

الشبكة العنكبوتية مثل ما اسمها بدل هي شبكة يعني مجموعة صفحات معلومات مترابطة الفكرة الرئيسية فيها إنه كل صفحة فيها نصوص متصلة ببعض باستخدام تقنية اسمها الهايبر تكست (Hypertext) يعني لما تشوف كلمة أو رابط باللون الأزرق مثلاً وتضغط عليه راح ينقلك لمعلومة ثانية بصفحة مختلفة
هالتقنية سمحتلنا نتنقل بين صفحات متعددة بكل سهولة وبطريقة مش خطية يعني مو لازم نتابع صفحة بصفحة ممكن نرجع لورا أو نروح لأي صفحة ثانية مباشرة
عشان هيك سميناها شبكة لأنها متصلة زي خيوط العنكبوت

كيف انبنت الشبكة؟

الفكرة بدأت عام 1989 لما العالم البريطاني تيم بيرنرز لي في مختبر CERN كان بدو يحل مشكلة ربط معلومات العلماء مع بعض وقتها كان كل عالم عنده بياناته الخاصة وما فيه طريقة سهلة لربطها مع بيانات غيره فاقترح فكرة نظام هايبر تكست اللي بسمح بربط المعلومات ببعض من خلال روابط مباشرة
سنة 1991 تم إطلاق أول موقع إلكتروني على الشبكة ومن وقتها صار عندنا تقريبًا حوالي ملياري موقع إلكتروني
الشبكة مش بس لمعلومات نصية، صار فينا نستخدمها للفيديوهات الصور شبكات التواصل الاجتماعي البحث وغيرها.

كيف بتشتغل الشبكة؟

الشبكة العنكبوتية بتشتغل باستخدام بروتوكول موحد اسمه الـ HTTP لما تدخل موقع أو تكتب رابط جهازك (الموبايل أو الكمبيوتر) بترجم طلبك لبروتوكول الـ HTTP وببعث الطلب لسيرفر بعيد اللي برد عليك بالمعلومات اللي طلبتها
مثلاً لو طلبت صورة قطة المتصفح ببعث طلب للسيرفر اللي عنده الصورة والسيرفر برد عليك بالصورة هالعملية بتتم لأن كل الأجهزة بتتكلم بنفس اللغة الـ HTTP

طلبات ديناميكية ومعلومات متغيرة

الإنترنت مش بس للطلبات الثابتة زي الصور ممكن نطلب معلومات ديناميكية زي الوقت الحالي السيرفر ممكن يعمل حسابات ويرجعلنا النتيجة بناءً على طلبنا يعني لو طلبنا الوقت بمنطقة UTC السيرفر بحسبه وبرجعلنا الوقت بشكل دقيق

دور المتصفح

كمستخدم إحنا ما بنتعامل مع الـ HTTP مباشرة إحنا بنضغط روابط وبنبحث عن فيديوهات أو صور المتصفح هو اللي بترجم طلباتنا لبروتوكول الـ HTTP وبرجع لنا النتيجة من السيرفر

شو هو الإنترنت؟

الإنترنت هو العمود الفقري اللي بتشتغل عليه الشبكة العنكبوتية العالمية World Wide Web ببساطة الإنترنت عبارة عن نظام بنستعمله حتى ننقل بيانات بين الأجهزة يعني إذا بدي أبعث رسالة Hello World من جهازي لجهاز ثاني في أي مكان بالعالم الإنترنت هو الوسيلة اللي بتساعدنا نعمل هالشي

كيف بنوصل الرسائل؟

تخيل إنه في سلك مباشر بين جهازي وجهاز جاري وأنا ببساطة ببعث البيانات عبر السلك بس المشكلة الحقيقية هي لما ما يكون في اتصال مباشر بين الأجهزة! هون بجي دور الإنترنت كحل

الإنترنت هو نظام موزّع Distributed System يعني إذا ما في طريقة مباشرة للاتصال بالجهاز الهدف الرسالة بتنتقل عبر أجهزة ثانية الفكرة إنه جهازي ببعث الرسالة لجهاز قريب مني وهذا الجهاز بدوره ببعثها لجهاز ثاني وهكذا لحد ما توصل للهدف النهائي

شبكة من الشبكات

الإنترنت مش جهاز واحد هو شبكة من الشبكات
الأجهزة كلها مرتبطة ببعض بشكل أو بآخر الرسالة اللي بنبعثها بتتنقل عبر مجموعة شبكات لحد ما توصل وكل ما كان في ارتباط بين الأنظمة الإنترنت بقدر يلاقي مسار للرسالة ويوصلها للهدف

طبقات الإنترنت (Layers)

عشان نفهم كيف بشتغل الإنترنت لازم نعرف إنه فيه طبقات أو مستويات بتوضح كيف البيانات بتنتقل
وهون بنستخدم نموذج TCP/IP واللي مقسم لعدة طبقات :

1. طبقة الرابط Link Layer

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

2. طبقة الإنترنت Internet Layer

هاي الطبقة مسؤولة عن إيجاد الطريق الأنسب للرسالة للوصول لجهاز معين يعني إذا في شبكة فيها أجهزة كثيرة الطبقة هاي بتحدد المسار الأفضل حسب الظروف زي الازدحام أو تعطل الوصلات

3. طبقة النقل Transport Layer

لما الرسالة توصل للجهاز المطلوب طبقة النقل بتحدد البرنامج اللي المفروض يستلم الرسالة مثلاً إذا الجهاز فيه أكثر من برنامج شغال الطبقة هاي بتستعمل أرقام المنافذ Ports لتوصل الرسالة للبرنامج الصح كمان بتضمن إنه لو فقدنا جزء من الرسالة نحاول نعيد إرساله

4. طبقة التطبيقات Application Layer

هاي الطبقة بتحدد كيف البرامج بتتواصل مع بعضها مثلاً إذا بنحكي عن تصفح الإنترنت بنستخدم بروتوكول الـ HTTP وإذا بدنا نرفع ملفات بنستخدم الـ FTP وإذا بدنا نبعث إيميل بنستخدم الـ SMTP

ليش الإنترنت مهم؟

الإنترنت بخلينا نستخدم كل هالخدمات بطريقة سلسة وبسيطة كل طبقة مبنية على اللي قبلها وهاي الفكرة اللي بنسميها التجريد Abstraction يعني بنبني شيء بسيط ونشتغل عليه عشان نعمل أشياء أعقد


مووضوع الـ HTTP و HTTPS وأجزاء الـ URL مهممممم

فهم بروتوكول الـ HTTP وأهميته RFC 1945

أول وثيقة معيارية RFC 1945 اللي عرفت بروتوكول الـ HTTP ببساطة هو اللغة اللي بتخلي أنظمة الإنترنت تفهم بعضها
إذا ما كان فيه معيار محدد لطريقة الطلبات والاستجابات بين المتصفحات والسيرفرات ما راح نقدر نبني نظام متكامل زي شبكة الإنترنت



شو يعني الـ HTTP ؟

الـ HTTP هو بروتوكول للتواصل بين المتصفح (العميل) والسيرفر
أول وثيقة وضّحت هالبروتوكول هي RFC 1945 اللي عرّفت النسخة الأولى منه HTTP/1.0 الوثيقة شرحت طريقة عمل البروتوكول بالتفصيل زي كيفية إرسال الطلبات واستقبال الردود وكيفية استخدامه لتوفير الموارد

كيف شكل الطلبات في الـ HTTP ؟

الطلب البسيط في الـ HTTP بتكون من سطر رئيسي فيه 3 أشياء أساسية:
1. طريقة الطلب الـ Method زي GET
2. المسار المطلوب الـ Request URI زي /
3. إصدار البروتوكول HTTP Version زي HTTP/1.0

السيرفر بفهم الطلب وبقرر شو الرد المناسب مثلاً:
  • إذا الطلب صحيح وناجح السيرفر بيبعث حالة 200 OK
  • إذا فيه خطأ من العميل زي طلب مورد مش موجود الرد بيكون 404 Not Found

شو هي أكواد الاستجابة (Status Codes)؟

يمكن تقسيم هذه الرموز إلى 5 مجموعات مختلفة

رمز الحالة
الوصف
توضيح
100-199
رد المعلومات
تُرسل لإخبار العميل بقبول الجزء الأول من طلبه وضرورة متابعة الإرسال. هذه الرموز غير شائعة.
200-299
نجاح
تُستخدم لإبلاغ العميل بنجاح طلبه.
300-399
إعادة توجيه
تُستخدم لإعادة توجيه طلب العميل إلى مصدر آخر، سواءً كان ذلك إلى صفحة ويب مختلفة أو موقع ويب مختلف بشكل كامل.
400-499
أخطاء العميل
تُستخدم لإبلاغ العميل بوجود خطأ في طلبه.
500-599
أخطاء الخادم
تُحجز للأخطاء التي تحدث على الجانب الخادم وتشير عادة إلى مشكلة كبيرة في معالجة الخادم للطلب.


بعض أمثلة على الرموز الشائعة 👇
رمز الحالة
الوصف
200
تم إكمال الطلب بنجاح.
201
تم إنشاء مورد جديد (على سبيل المثال، مستخدم جديد أو منشور في المدونة).
301
إعادة توجيه دائمة إلى صفحة جديدة أو إخطار محركات البحث بأن الصفحة انتقلت إلى مكان آخر.
302
إعادة توجيه مؤقتة، تشير إلى أن التغيير مؤقت وقد يتغير مرة أخرى في المستقبل القريب.
400
طلب سيء، يُبلغ المتصفح بأن هناك شيء خاطئ أو ناقص في طلبه.
401
غير مصرّح لك بعرض هذا المورد حتى تقوم بالتوثيق في تطبيق الويب، عادة باستخدام اسم مستخدم وكلمة مرور.
403
ليس لديك إذن لعرض هذا المورد، سواء كنت قد قمت بتسجيل الدخول أم لا.
405
الطلب غير مسموح به بواسطة المورد المستهدف. على سبيل المثال، إذا قمت بإرسال طلب GET إلى المورد create-account/ عندما كان يتوقع الخادم وجود طلب POST بدلاً منه.
404
الصفحة أو المورد الذي طلبته غير موجود.
500
خطأ في الخدمة الداخلية، يشير إلى أن الخادم واجه مشكلة لا يعرف كيفية التعامل معها بشكل صحيح.


هيك ممكن يكون شكل الطلب :

كود:
GET /index.html HTTP/1.0[/B][/SIZE][/CENTER]
[SIZE=13px][B][CENTER]Host: example.com


والرد ممكن يكون :

كود:
HTTP/1.0 200 OK[/B][/SIZE][/CENTER]
[SIZE=13px][B][CENTER]Content-Type: text/html

<HTML>...</HTML>



مووضوع الـ HTTP و HTTPS وأجزاء الـ URL مهممممم

مقدمة عن الروابط (URLs)

بالنسبة للروابط اللي بتشوفها كل يوم وبتكتبها في المتصفح هي فعلياً عبارة عن محدد موارد موحد Uniform Resource Locator الروابط بتنقسم لعدة أجزاء منها:

الـ Scheme : البروتوكول (مثل HTTP أو HTTPS)
الـ Host : الخادم اللي بنطلب منه المورد (زي example.com)
الـ Port : رقم المنفذ اللي بيشغل الخدمة (زي 80 أو 8080)
الـ Path : المسار اللي بِوصلنا للمورد (زي cat.gif)
الـ Query : المعلمات أو البيانات الإضافية اللي بنحددها (مثلاً الأبعاد)
الـ Fragment : معلومات خاصة بالمستخدم أو المتصفح (ما بتوصل للسيرفر)

المشكلة مع المسافات والترميز (Encoding):

لو طلبنا مورد فيه مسافات زي hello world السيرفر ممكن يرد بـ "طلب غير صحيح" الحل هون هو ترميز الأحرف الغير آمنة باستخدام الـ ASCII

المسافة مثلاً تتحول لـ %20
كل حرف أو رمز عنده قيمة سداسية عشرية Hex

أنواع ترميز البيانات في الطلبات :

1. Form URL Encoded :
زي لما نستخدم نموذج Form عادي في صفحة ويب البيانات بتترمز وتُرسل كسلسلة نصوص مفصولة بـ = و &


2. JSON :
يستخدم لإرسال بيانات مهيكلة بشكل أعمق (زي الكائنات المتداخلة) مثلاً:

كود:
{
  "name": "Connor"
}

متى بنستخدم JSON بدل Form URL ؟

  • Form URL Encoded : لما نرسل بيانات بسيطة عبر نموذج ويب
  • JSON : لما نحتاج بيانات معقدة زي واجهات الـ APIs

شو فكرة State بالويب وليش هو مهم؟

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

شو يعني State ؟

الفرق الأساسي بين برنامج بسيط زي موقع يعرضلك صورة قطة وبرنامج زي اللي بتسجل فيه حسابك البنكي هو مفهوم الحالة أو State هاي بتخلي البرنامج يتذكر شغلات عنك زي تسجيل دخولك البيانات اللي أدخلتها وأي تغييرات بتصير
لكن فيه مشكلة!
البروتوكول اللي بستخدمه الإنترنت واللي اسمه HTTP هو بروتوكول بدون حالة Stateless Protocol يعني كل طلب request انت بتبعثه للموقع السيرفر بتعامل معه كأنه جديد وما بتذكر او بخزن الطلبات اللي قبله (كل طلب لحال)

طيب كيف بنحافظ على الـ State ؟

هون بيجي دور الكوكيز HTTP Cookies لما تسجل دخولك لموقع معين السيرفر بعمل شغلة ذكية :
ببعثلك قطعة صغيرة من البيانات اسمها كوكي والمتصفح بخزنها عندك
كل ما ترسل طلب جديد للسيرفر المتصفح برجع يبعث هاي الكوكيز عشان السيرفر يتذكر مين انت

مثال بسيط:

  • لما تسجل دخول باسم مستخدم معين السيرفر بعطيك كوكي زي : auth=abdallah
  • في الطلبات الجاية المتصفح تلقائياً برفق هاي الكوكيز مع كل طلب
  • السيرفر بستخدم الكوكي عشان يعرف مين انت وبتعامل معك بناءً على هاي البيانات

مشاكل أمنية:

واحدة من النقاط اللي لازم ننتبهلها إنه السيرفر ما بتأكد إذا انت فعلاً سجلت الدخول بطريقة صحيحة أو إذا ببساطة اخترعت كوكي بنفسك (مثلاً: auth=admin)
عشان هيك التطبيقات لازم تستخدم أساليب أقوى زي أرقام الجلسات Session IDs اللي بتكون صعبة التوقع أو التزوير

ليش هذا مهم؟

فهم كيف الكوكيز و State بشتغلوا مهم جداً لأي شخص مهتم بالأمن السيبراني لأنه بعطيك فكرة عن كيف ممكن تتلاعب أو تحمي البيانات اللي بتتعامل معها التطبيقات والتعمق أكثر بهاي المواضيع بخليك تعرف نقاط الضعف وتحمي النظام من الثغرات

كيف بتصير طلبات الويب؟

بالعادة لما تفتح متصفح وتدخل رابط URL وتكبس Enter بتتفاجأ إن صفحة ويب ظهرت قدامك طيب كيف بتشتغل هاي العملية تحت الغطاء ؟
القصة بسيطة : الـ HTTP هو البروتوكول اللي بتم من خلاله هالكلام المتصفح تبعك ببعث طلب HTTP للخادم (السيرفر) عشان يرجعلك المحتوى


استخدام أدوات غير المتصفح

1. curl هي أداة بسيطة تستخدم من التيرمنال عشان تبعث طلبات HTTP مثلاً :

كود:
curl example.com
هون بترجعلنا صفحة HTML بنفس الشكل اللي كان يظهر بالمتصفح مش بس هيك ممكن نستخدم أوامر إضافية زي X POST- عشان نعمل طلب POST بدلاً من GET

2. لو بدنا نشتغل على مستوى أقل ممكن نستخدم netcat عشان نبعث الطلب يدوي مثلاً:

كود:
nc example.com 80
وبعدين بنكتب طلبنا كالتالي :
كود:
GET / HTTP/1.1
Host: example.com
وبنضغط Enter مرتين الخادم برد علينا باستجابة HTTP بشكل خام

3. البرمجة مع طلبات HTTP

باستخدام بايثون :

لو بدنا نكتب برنامج يتعامل مع طلبات الويب مكتبة الـ requests ببايثون بتسهّل علينا هاي الأمور مثلا :
كود:
import requests
response = requests.get("http://example.com")
print(response.text)


هون بنقدر نطبع النص اللي رجعه السيرفر أو حتى نفحص الـ Headers

استخراج الروابط من صفحة:

ممكن نكتب برنامج بسيط يسحب الروابط links من أي صفحة :
  1. بجيب النص HTML
  2. بدوّر على الـ TAG ـ <a> اللي فيه الروابط
  3. يعرض كل الروابط اللي لقاها

بنبدا مع تطبيق عملي على 39 تحدي لارسال الطلبات واسترجاعها بالـ Curl والـ Nc والـ python


من 1 الى 3 المطلوب Send an HTTP request

1. عن طريق الـ Curl
Bash:
curl localhost
طلب بسيط عن طريق الـ curl

2. عن طريق الـ Nc
Bash:
nc localhost 80 GET /flag
بنرسل طلب لصفحة العلم

3. عن طريق الـ python
كود:
python3 -c "import requests; print(requests.get('http://localhost/flag').text)"

طلب باستخدام البايثون وهاد هو الكود الاصلي


Python:
import requests
print(requests.get('http://localhost/flag').text)

من 4 الى 6 المطلوب host header

4. عن طريق الـ Curl
Bash:
curl -H "Host: localhost" http://localhost
بنستخدم الخيار
H- عشان نستعرض الـ header

5. عن طريق الـ
Nc
Bash:
echo -e "GET / HTTP/1.1\r\nHost: 6987947b16a3f4d71023eab30de877b6\r\nConnection: close\r\n\r\n" | nc localhost 80
وهاد هو شكل الطلب
HTTP:
GET / HTTP/1.1
Host: 6987947b16a3f4d71023eab30de877b6
Connection: close


6. عن طريق الـ
python
كود:
python -c "import requests; print(requests.get('http://localhost', headers={'Host': '9d85473ad3a0eec01de4696e4388b5a5'}).text)"
هي بشكل بسيط عن طريق بايثون كيف نستعرض الـ
header

وهاد هو الكود الاصلي
Python:
import requests
url = 'http://localhost'
host_value = '9d85473ad3a0eec01de4696e4388b5a5'
response = requests.get(url, headers={'Host': host_value})
print(f"Response from {url} with Host {host_value}: {response.text}")

من 7 الى 9 المطلوب Set the path in an HTTP request

7. عن طريق الـ Curl
Bash:
curl http://localhost/6987947b16a3f4d71023eab30de877b6
مافي فرق عن الطلب العادي

8. عن طريق الـ Nc
Bash:
echo -e "GET /1b16942c1b81c0786eb84f3bd3724b79 HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" | nc localhost 80
بنحط الباث بدايه الطلب وهاد هو شكل الطلب

HTTP:
GET /1b16942c1b81c0786eb84f3bd3724b79 HTTP/1.1
Host: localhost
Connection: close


9. عن طريق الـ python
كود:
python -c "import requests; print(requests.get('http://localhost/64abeec9191d09296dda2fdfbb781988', headers={'Host': 'localhost'}).text)"
بنحدد الباث بشكل بسيط بس


وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost/64abeec9191d09296dda2fdfbb781988'
host_value = 'localhost'
response = requests.get(url, headers={'Host': host_value})
print(f"Response from {url} with Host {host_value}: {response.text}")
[B][SIZE=5]

من 10 الى 12 المطلوب URL encode a path in an HTTP request

10. عن طريق الـ Curl
Bash:
curl "http://localhost//9822629e%20b62993d7/9ad6eff9%20f873c007"
بنعمل بس URL encoding

بنحول هدول الرموز لـ

& > %26
# > %23
> %20

11. عن طريق الـ Nc
Bash:
echo -e "GET /f65c9b42%20e4c70a50/b68ce464%204551c4fb HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" | nc localhost 80
بنعمل بس URL encoding

بنحول هدول الرموز لـ

& > %26
# > %23
> %20
وهاد هو الطلب
HTTP:
GET /f65c9b42%20e4c70a50/b68ce464%204551c4fb HTTP/1.1
Host: localhost
Connection: close

12. عن طريق الـ python
كود:
python -c "import requests; print(requests.get('http://localhost//a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5', headers={'Host': 'localhost'}).text)"
بنعمل بس URL encoding

بنحول هدول الرموز لـ

& > %26
# > %23
> %20

وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost//a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5'
host_value = 'localhost'
response = requests.get(url, headers={'Host': host_value})
print(f"Response from {url} with Host {host_value}: {response.text}")
[B][SIZE=5]

من 13 الى 15 المطلوب Specify an argument in an HTTP request

13. عن طريق الـ Curl
Bash:
curl -H "Host: localhost" "http://localhost//a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=b83c32298e6e891dea35dedf0b96cdf1"
بنرسل طلب GET مع هيدر Host وبنحط المعلمات او البيانات اللي بدو التحدي نبعثها


14. عن طريق الـ Nc
Bash:
echo -e "GET /a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=1422f7a8337d2e8147b5e9997f7a47ab HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" | nc localhost 80
نفس الفكره لكن بنحط المعلومه A بالرابط
وهاد هو الطلب

HTTP:
GET /a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=1422f7a8337d2e8147b5e9997f7a47ab HTTP/1.1
Host: localhost
Connection: close

15. عن طريق الـ python
كود:
python -c "import requests; print(requests.get('http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5', params={'a': '32fc5e63b7f3a9ec63c5183ecfc849ec'}).text)"
وهون بنضيفها عل الرابط


وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5'
params = {'a': '32fc5e63b7f3a9ec63c5183ecfc849ec'}
response = requests.get(url, params=params)
print(f"Response from {url} with params {params}: {response.text}")
[B][SIZE=5]

من 16 الى 18 المطلوب Specify multiple arguments in an HTTP request

16. عن طريق الـ Curl
Bash:
curl "http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=d98aa9836c920b989a5635c67f886902&b=c490a9b5%204cde9062%2648514fde%234315279d" -H "Host: localhost"
بنرسل طلب GET مع هيدر Host وبنحط المعلمات او البيانات اللي بدو التحدي نبعثها
هاد مثال على اكثر من معلومه ( بنفصلهن بـ & )


17. عن طريق الـ Nc
Bash:
echo -e "GET /a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=3e7c42f3f4f89e8f6345609447cc0d25&b=b5c89e33%2074079a4b%269726845e%23079c10ef HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" | nc localhost 80
نفس الفكره ( بنفصلهن بـ & )
وهاد هو الطلب

HTTP:
GET /a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=3e7c42f3f4f89e8f6345609447cc0d25&b=b5c89e33%2074079a4b%269726845e%23079c10ef HTTP/1.1
Host: localhost
Connection: close


18. عن طريق الـ python
كود:
python -c "import requests; print(requests.get('http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=2c22c8590cb0a46a76ae467e15fe1cba&b=443c8f39%2022e20791%2636529185%23c2800d55', headers={'Host': 'localhost'}).text)"
نفس الفكره

وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5'
params = {'a': '2c22c8590cb0a46a76ae467e15fe1cba', 'b': '443c8f39%2022e20791%2636529185%23c2800d55'}
response = requests.get(url, params=params, headers={'Host': 'localhost'})
print(f"Response from {url} with params {params}: {response.text}")
[B][SIZE=5]

من 19 الى 21 المطلوب Include form data in an HTTP request

19. عن طريق الـ Curl
Bash:
curl -X POST -d "a=8468bf1d32ca196a01b18388bf3e3986" -H "Host: localhost" "http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5"
بنستخدم X POST- عشان نحدد الطلب يكون POST
وسبق وحكينا عن الـ Form


20. عن طريق الـ Nc
Bash:
echo -e "POST / HTTP/1.1\r\nHost: localhost\r\nContent-Length: 34\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\na=69abbc1cd587c8981e5d0502e950152d" | nc localhost 80
هون بنحدد نوع البيانات Content-Type وبنحدد نوع الطلب POST

وهاد هو الطلب

HTTP:
POST / HTTP/1.1
Host: localhost
Content-Length: 34
Content-Type: application/x-www-form-urlencoded

a=69abbc1cd587c8981e5d0502e950152d

21. عن طريق الـ python
كود:
python -c "import requests; print(requests.post('http://localhost/', headers={'Host': '6987947b16a3f4d71023eab30de877b6', 'Connection': 'close'}, data={'a': 'bff63dd33a30288b1bdb5a4416e2a96c'}).text)"
وبالبايثون هيك بنحدد


وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost/'
headers = {'Host': '6987947b16a3f4d71023eab30de877b6', 'Connection': 'close'}
data = {'a': 'bff63dd33a30288b1bdb5a4416e2a96c'}
response = requests.post(url, headers=headers, data=data)
print(f"Response from POST {url} with headers {headers} and data {data}: {response.text}")
[B][SIZE=5]

من 22 الى 24 المطلوب Include form data with multiple fields in an HTTP request

22. عن طريق الـ Curl
Bash:
curl -X POST "http://localhost/" -H "Host: localhost" -d "a=0515cd7cc9e0d5ccd79b0acb09102542&b=85672841%20416de088%26c687360c%236af5f601"
الهون الفرق انه زدنا بس المتغيرات او المعلمات


23. عن طريق الـ Nc
Bash:
echo -e "POST / HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 78\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\na=f63119f486b55181fdac486305d8b636&b=3b089da1%20e22c5688%2634503678%23dc102bc4" | nc localhost 80
نفس الفكره الفرق انه زدنا بس المتغيرات او المعلمات
وهاد هو الطلب

HTTP:
POST / HTTP/1.0
Host: 127.0.0.1
Content-Length: 78
Content-Type: application/x-www-form-urlencoded

a=f63119f486b55181fdac486305d8b636&b=3b089da1%20e22c5688%2634503678%23dc102bc4



24. عن طريق الـ python

Python:
python -c "import requests; print((requests.post('http://localhost/', headers={'Host': 'localhost'}, data={'a': '60e22136484d963bd50c99e94626dbc8', 'b': '3cc458ef 5431a2cd&19cec9d3#7a648a7e'})).text)"
نفس الفكره الفرق انه زدنا بس المتغيرات او المعلمات


وهاد هو الكود الاصلي
كود:
[/B][/SIZE][/CENTER]
[SIZE=5][B][CENTER]import requests
url = 'http://localhost/'
headers = {'Host': 'localhost'}
data = {'a': '60e22136484d963bd50c99e94626dbc8', 'b': '3cc458ef 5431a2cd&19cec9d3#7a648a7e'}
response = requests.post(url, headers=headers, data=data)
print(f"Response from POST {url} with headers {headers} and data {data}: {response.text}")


من 25 الى 27 المطلوب Include json data in an HTTP request

25. عن طريق الـ Curl
Bash:
curl -X POST -H "Content-Type: application/json" -d '{"a":"7ff7c4d20c9afd8b0d198634c2c1c629"}' http://localhost
هون احنا بنحدد نوع المحتوى application/json عشان يعرف السيرفر اننا بدنا نرسل بيانات بصيغه JSON

26. عن طريق الـ Nc
Bash:
echo -e 'POST / HTTP/1.0\r\nHost: localhost\r\nContent-Length: 41\r\nContent-Type: application/json\r\n\r\n{"a":"6be3b1ca28f64d9a25588c7034a8b1c0"}' | nc localhost 80
نفس الفكره بنحدد نوع المحتوى application/json عشان يعرف السيرفر اننا بدنا نرسل بيانات بصيغه JSON
وهاد هو الطلب

HTTP:
POST / HTTP/1.0
Host: localhost
Content-Length: 41
Content-Type: application/json

{"a":"6be3b1ca28f64d9a25588c7034a8b1c0"}'


27. عن طريق الـ python
كود:
python -c 'import requests; print(requests.post("http://localhost", headers={"Host": "localhost", "Content-Type": "application/json"}, data="{\"a\":\"b96a93183bc3654d6d9bcd6f9912d788\"}").text)'
نفس الفكره وبنستخدم \ عشان نقدر نرسل الـ " ويوخذها كما هي (بنسميها تهريب)


وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = "http://localhost"
headers = {"Host": "localhost", "Content-Type": "application/json"}
data = "{\"a\":\"b96a93183bc3654d6d9bcd6f9912d788\"}"
response = requests.post(url, headers=headers, data=data)
print(f"Response from POST {url} with headers {headers} and data {data}: {response.text}")
[B][SIZE=5]

من 28 الى 30 المطلوب Include complex json data in an HTTP request

28. عن طريق الـ Curl
Bash:
curl -X POST -H "Content-Type: application/json" -d '{"a": "3efb8f52cc7c3ce281e360620336650a", "b": {"c": "7b80994b", "d": ["c8a5b632", "92909c57 e90ee6db&a1a41ad1#0d237712"]}}' http://localhost
نفس فكره التحديات اللي فوق بس ضفنا شويه تعقيد 😂


29. عن طريق الـ Nc


بنخزن هذه الطلب بملف ( وبنقدر نعمل هيك لكل الطلبات)
Bash:
POST / HTTP/1.1
Host: 127.0.0.1
Content-Length: 119
Content-Type: application/json

{"a":"6c988b59fc8b0b8b74b5f62bcd1dc417", "b":{"c":"b9c45c7d", "d":["92e58e74", "7b856d5d aacc7382&4778ec8f#75795ae7"]}}

بعدها بنكتب الامر
Bash:
[SIZE=5][B]cat request | nc localhost 80[/B][/SIZE]



30. عن طريق الـ python

كود:
python -c 'import requests; print(requests.post("http://localhost", json={"a": "9d5fe48f6fcbe6474f84811216cdbf7e", "b": {"c": "cd319365", "d": ["ff89d800", "a5bd55f4 58740e53&9f7e94f8#79739cb2"]}}, headers={"Host": "localhost"}).text)'
نفس الفكره


وهاد هو الكود الاصلي
Python:
import requests
url = "http://localhost"
json_data = {
    "a": "9d5fe48f6fcbe6474f84811216cdbf7e",
    "b": {
        "c": "cd319365",
        "d": [
            "ff89d800",
            "a5bd55f4 58740e53&9f7e94f8#79739cb2"
        ]
    }
}
headers = {"Host": "localhost"}
response = requests.post(url, json=json_data, headers=headers)
print(f"Response from POST {url} with JSON data {json_data}: {response.text}")

من 31 الى 33 المطلوب Follow an HTTP redirect from HTTP response

31. عن طريق الـ Curl
Bash:
curl -L http://localhost
بنستخدم الـ L- لمتابعة إعادة التوجيه التلقائي في حال وجوده

32. عن طريق الـ Nc
Bash:
[/B][/SIZE]echo -e "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n" | nc localhost 80 
echo -e "GET /cda4a8da943d0c94644935e1cd5e3d97 HTTP/1.1\r\nHost: localhost\r\n\r\n" | nc localhost 80[SIZE=5][B]
هاد هو الطلب

HTTP:
GET / HTTP/1.1
Host: localhost
HTTP:
GET /cda4a8da943d0c94644935e1cd5e3d97 HTTP/1.1
Host: localhost


33. عن طريق الـ python
كود:
python -c "import requests; print(requests.get('http://localhost', allow_redirects=True).text)"
بنستخدم بس allow_redirects

وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost'
response = requests.get(url, allow_redirects=True)
print(f"Response from {url} with redirects allowed: {response.text}")
[B][SIZE=5]

من 34 الى 36 المطلوب Include a cookie from HTTP response

34. عن طريق الـ Curl
Bash:
curl -b cookies.txt http://localhost
بكل بساطه بنستخدم b- وبنحط الكوكيي


35. عن طريق الـ Nc
Bash:
printf "GET / HTTP/1.1\r\nHost: localhost\r\nCookie: cookie=643f4def533e27c21302e59fd86cbb36\r\nConnection: close\r\n\r\n" | nc localhost 80
بنحط الكوكي مع الطلب بمتغير Cookie
وهاد هو الطلب

HTTP:
GET / HTTP/1.1
Host: localhost
Cookie: cookie=643f4def533e27c21302e59fd86cbb36
Connection: close

36. عن طريق الـ python
كود:
python3 -c "import requests; r1 = requests.get('http://localhost', allow_redirects=False); cookie = r1.cookies.get('cookie'); r2 = requests.get('http://localhost', cookies={'cookie': cookie}); print(r2.text)"
بالشكل التالي اوضح

وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost'
r1 = requests.get(url, allow_redirects=False)
cookie = r1.cookies.get('cookie')
r2 = requests.get(url, cookies={'cookie': cookie})
print(f"Response after following redirect with cookie: {r2.text}")
[B][SIZE=5]

من 37 الى 39 المطلوب Make multiple requests in response to stateful HTTP responses

37. عن طريق الـ Curl
Bash:
curl -X GET http://localhost --cookie-jar cookies.txt --cookie cookies.txt && curl -X GET http://localhost --cookie-jar cookies.txt --cookie cookies.txt && curl -X GET http://localhost --cookie-jar cookies.txt --cookie cookies.txt
بنرسل 3 طلبات مع استخدام الكوكي المخزنه بعد كل استجابه



38. عن طريق الـ
Nc
Bash:
echo -e "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\nCookie: session=dummy\r\n" | nc localhost 80 | grep -oP 'Set-Cookie: session=\K[^\s;]*' | xargs -I {} echo -e "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\nCookie: session={}\r\n" | nc localhost 80

echo -e "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\nCookie: session=eyJzdGF0ZSI6Mn0.Z22P_w.pUKUlrwwUJ5Hg3aluOtJ3hO1S8k\r\n" | nc localhost 80

echo -e "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\nCookie: session=eyJzdGF0ZSI6M30.Z22QUg.sMd35lKUbDu8tNrpAIdgi8ghqB0\r\n" | nc localhost 80
بنرسل الكوكيز باسم session مع القيمة dummy كجزء من الطلب
عشان نجرب بس يعني القيمه dummy وهميه بس
يعني هيك خبرناه اننا عننا كوكي معينه وبعدها عن طريق الـ grep بنبحث عن كوكي جديده

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

وهاد هو الطلب

HTTP:
GET / HTTP/1.0
Host: 127.0.0.1
Cookie: session=dummy


39. عن طريق الـ python
كود:
python3 -c "import requests; host = 'http://127.0.0.1/'; response1 = requests.get(host); cookie1 = response1.cookies; response2 = requests.get(host, cookies=cookie1); cookie2 = response2.cookies; response3 = requests.get(host, cookies=cookie2); cookie3 = response3.cookies; response4 = requests.get(host, cookies=cookie3); cookie4 = response4.cookies; print(response4.text)"

وهاد هو الكود الاصلي
Python:
import requests

host = 'http://127.0.0.1/'
response1 = requests.get(host)
cookie1 = response1.cookies
response2 = requests.get(host, cookies=cookie1)
cookie2 = response2.cookies
response3 = requests.get(host, cookies=cookie2)
cookie3 = response3.cookies
response4 = requests.get(host, cookies=cookie3)
cookie4 = response4.cookies
print(f"Final response after multiple redirects: {response4.text}")


في اكثر من شخص سالني كم بقعد معي المنشور بالتنسيق والتعديل والشرح
فجوابي بختلف من منشور لمنشور هاد اخذ 3 ساعات ونص شرح وترتيب وتنسيق بدون حل الاسئله كنت احلها قبل

3 ساعات ونص == اجر لييوم الدين
تجارة رابحة
تجارة لن تبور
وبسسس


وهيك بنحكي خلصنا اول جزء


pwn-college-12-27-2024_09_33_PM.webp

 
التعديل الأخير بواسطة المشرف:
مبدع ما شاء الله
 


شرح اول موضوع في Intro to Cybersecurity
الـ Talking Web
يحتوي على 39 تحدي

مقدمة

لو بتقرأ بالمقال أكيد قاعد بتتصفح الإنترنت باستخدام الشبكة العنكبوتية العالمية World Wide Web
هي مشروع ضخم اشتغلت عليه البشرية خلال آخر 30 سنة وهدفها إنها توصل مصادر معلومات متنوعة وأحيانًا مش دايمًا مفيدة ببعضها ضمن شبكة ضخمة من المعلومات والأنظمة حول العالم

شو هي الشبكة العنكبوتية؟

الشبكة العنكبوتية مثل ما اسمها بدل هي شبكة يعني مجموعة صفحات معلومات مترابطة الفكرة الرئيسية فيها إنه كل صفحة فيها نصوص متصلة ببعض باستخدام تقنية اسمها الهايبر تكست (Hypertext) يعني لما تشوف كلمة أو رابط باللون الأزرق مثلاً وتضغط عليه راح ينقلك لمعلومة ثانية بصفحة مختلفة
هالتقنية سمحتلنا نتنقل بين صفحات متعددة بكل سهولة وبطريقة مش خطية يعني مو لازم نتابع صفحة بصفحة ممكن نرجع لورا أو نروح لأي صفحة ثانية مباشرة
عشان هيك سميناها شبكة لأنها متصلة زي خيوط العنكبوت

كيف انبنت الشبكة؟

الفكرة بدأت عام 1989 لما العالم البريطاني تيم بيرنرز لي في مختبر CERN كان بدو يحل مشكلة ربط معلومات العلماء مع بعض وقتها كان كل عالم عنده بياناته الخاصة وما فيه طريقة سهلة لربطها مع بيانات غيره فاقترح فكرة نظام هايبر تكست اللي بسمح بربط المعلومات ببعض من خلال روابط مباشرة
سنة 1991 تم إطلاق أول موقع إلكتروني على الشبكة ومن وقتها صار عندنا تقريبًا حوالي ملياري موقع إلكتروني
الشبكة مش بس لمعلومات نصية، صار فينا نستخدمها للفيديوهات الصور شبكات التواصل الاجتماعي البحث وغيرها.


كيف بتشتغل الشبكة؟

الشبكة العنكبوتية بتشتغل باستخدام بروتوكول موحد اسمه الـ HTTP لما تدخل موقع أو تكتب رابط جهازك (الموبايل أو الكمبيوتر) بترجم طلبك لبروتوكول الـ HTTP وببعث الطلب لسيرفر بعيد اللي برد عليك بالمعلومات اللي طلبتها
مثلاً لو طلبت صورة قطة المتصفح ببعث طلب للسيرفر اللي عنده الصورة والسيرفر برد عليك بالصورة هالعملية بتتم لأن كل الأجهزة بتتكلم بنفس اللغة الـ HTTP


طلبات ديناميكية ومعلومات متغيرة

الإنترنت مش بس للطلبات الثابتة زي الصور ممكن نطلب معلومات ديناميكية زي الوقت الحالي السيرفر ممكن يعمل حسابات ويرجعلنا النتيجة بناءً على طلبنا يعني لو طلبنا الوقت بمنطقة UTC السيرفر بحسبه وبرجعلنا الوقت بشكل دقيق

دور المتصفح

كمستخدم إحنا ما بنتعامل مع الـ HTTP مباشرة إحنا بنضغط روابط وبنبحث عن فيديوهات أو صور المتصفح هو اللي بترجم طلباتنا لبروتوكول الـ HTTP وبرجع لنا النتيجة من السيرفر


شو هو الإنترنت؟

الإنترنت هو العمود الفقري اللي بتشتغل عليه الشبكة العنكبوتية العالمية World Wide Web ببساطة الإنترنت عبارة عن نظام بنستعمله حتى ننقل بيانات بين الأجهزة يعني إذا بدي أبعث رسالة Hello World من جهازي لجهاز ثاني في أي مكان بالعالم الإنترنت هو الوسيلة اللي بتساعدنا نعمل هالشي

كيف بنوصل الرسائل؟

تخيل إنه في سلك مباشر بين جهازي وجهاز جاري وأنا ببساطة ببعث البيانات عبر السلك بس المشكلة الحقيقية هي لما ما يكون في اتصال مباشر بين الأجهزة! هون بجي دور الإنترنت كحل

الإنترنت هو نظام موزّع Distributed System يعني إذا ما في طريقة مباشرة للاتصال بالجهاز الهدف الرسالة بتنتقل عبر أجهزة ثانية الفكرة إنه جهازي ببعث الرسالة لجهاز قريب مني وهذا الجهاز بدوره ببعثها لجهاز ثاني وهكذا لحد ما توصل للهدف النهائي

شبكة من الشبكات

الإنترنت مش جهاز واحد هو شبكة من الشبكات
الأجهزة كلها مرتبطة ببعض بشكل أو بآخر الرسالة اللي بنبعثها بتتنقل عبر مجموعة شبكات لحد ما توصل وكل ما كان في ارتباط بين الأنظمة الإنترنت بقدر يلاقي مسار للرسالة ويوصلها للهدف

طبقات الإنترنت (Layers)

عشان نفهم كيف بشتغل الإنترنت لازم نعرف إنه فيه طبقات أو مستويات بتوضح كيف البيانات بتنتقل
وهون بنستخدم نموذج TCP/IP واللي مقسم لعدة طبقات :


1. طبقة الرابط Link Layer

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

2. طبقة الإنترنت Internet Layer

هاي الطبقة مسؤولة عن إيجاد الطريق الأنسب للرسالة للوصول لجهاز معين يعني إذا في شبكة فيها أجهزة كثيرة الطبقة هاي بتحدد المسار الأفضل حسب الظروف زي الازدحام أو تعطل الوصلات

3. طبقة النقل Transport Layer

لما الرسالة توصل للجهاز المطلوب طبقة النقل بتحدد البرنامج اللي المفروض يستلم الرسالة مثلاً إذا الجهاز فيه أكثر من برنامج شغال الطبقة هاي بتستعمل أرقام المنافذ Ports لتوصل الرسالة للبرنامج الصح كمان بتضمن إنه لو فقدنا جزء من الرسالة نحاول نعيد إرساله

4. طبقة التطبيقات Application Layer

هاي الطبقة بتحدد كيف البرامج بتتواصل مع بعضها مثلاً إذا بنحكي عن تصفح الإنترنت بنستخدم بروتوكول الـ HTTP وإذا بدنا نرفع ملفات بنستخدم الـ FTP وإذا بدنا نبعث إيميل بنستخدم الـ SMTP

ليش الإنترنت مهم؟

الإنترنت بخلينا نستخدم كل هالخدمات بطريقة سلسة وبسيطة كل طبقة مبنية على اللي قبلها وهاي الفكرة اللي بنسميها التجريد Abstraction يعني بنبني شيء بسيط ونشتغل عليه عشان نعمل أشياء أعقد


مووضوع الـ HTTP و HTTPS وأجزاء الـ URL مهممممم


فهم بروتوكول الـ HTTP وأهميته RFC 1945

أول وثيقة معيارية RFC 1945 اللي عرفت بروتوكول الـ HTTP ببساطة هو اللغة اللي بتخلي أنظمة الإنترنت تفهم بعضها
إذا ما كان فيه معيار محدد لطريقة الطلبات والاستجابات بين المتصفحات والسيرفرات ما راح نقدر نبني نظام متكامل زي شبكة الإنترنت




شو يعني الـ HTTP ؟

الـ HTTP هو بروتوكول للتواصل بين المتصفح (العميل) والسيرفر
أول وثيقة وضّحت هالبروتوكول هي RFC 1945 اللي عرّفت النسخة الأولى منه HTTP/1.0 الوثيقة شرحت طريقة عمل البروتوكول بالتفصيل زي كيفية إرسال الطلبات واستقبال الردود وكيفية استخدامه لتوفير الموارد


كيف شكل الطلبات في الـ HTTP ؟

الطلب البسيط في الـ HTTP بتكون من سطر رئيسي فيه 3 أشياء أساسية:
1. طريقة الطلب الـ Method زي GET
2. المسار المطلوب الـ Request URI زي /
3. إصدار البروتوكول HTTP Version زي HTTP/1.0

السيرفر بفهم الطلب وبقرر شو الرد المناسب مثلاً:
  • إذا الطلب صحيح وناجح السيرفر بيبعث حالة 200 OK
  • إذا فيه خطأ من العميل زي طلب مورد مش موجود الرد بيكون 404 Not Found

شو هي أكواد الاستجابة (Status Codes)؟

يمكن تقسيم هذه الرموز إلى 5 مجموعات مختلفة


رمز الحالةالوصفتوضيح
100-199رد المعلوماتتُرسل لإخبار العميل بقبول الجزء الأول من طلبه وضرورة متابعة الإرسال. هذه الرموز غير شائعة.
200-299نجاحتُستخدم لإبلاغ العميل بنجاح طلبه.
300-399إعادة توجيهتُستخدم لإعادة توجيه طلب العميل إلى مصدر آخر، سواءً كان ذلك إلى صفحة ويب مختلفة أو موقع ويب مختلف بشكل كامل.
400-499أخطاء العميلتُستخدم لإبلاغ العميل بوجود خطأ في طلبه.
500-599أخطاء الخادمتُحجز للأخطاء التي تحدث على الجانب الخادم وتشير عادة إلى مشكلة كبيرة في معالجة الخادم للطلب.


بعض أمثلة على الرموز الشائعة 👇

رمز الحالةالوصف
200تم إكمال الطلب بنجاح.
201تم إنشاء مورد جديد (على سبيل المثال، مستخدم جديد أو منشور في المدونة).
301إعادة توجيه دائمة إلى صفحة جديدة أو إخطار محركات البحث بأن الصفحة انتقلت إلى مكان آخر.
302إعادة توجيه مؤقتة، تشير إلى أن التغيير مؤقت وقد يتغير مرة أخرى في المستقبل القريب.
400طلب سيء، يُبلغ المتصفح بأن هناك شيء خاطئ أو ناقص في طلبه.
401غير مصرّح لك بعرض هذا المورد حتى تقوم بالتوثيق في تطبيق الويب، عادة باستخدام اسم مستخدم وكلمة مرور.
403ليس لديك إذن لعرض هذا المورد، سواء كنت قد قمت بتسجيل الدخول أم لا.
405الطلب غير مسموح به بواسطة المورد المستهدف. على سبيل المثال، إذا قمت بإرسال طلب GET إلى المورد create-account/ عندما كان يتوقع الخادم وجود طلب POST بدلاً منه.
404الصفحة أو المورد الذي طلبته غير موجود.
500خطأ في الخدمة الداخلية، يشير إلى أن الخادم واجه مشكلة لا يعرف كيفية التعامل معها بشكل صحيح.


هيك ممكن يكون شكل الطلب :

كود:
GET /index.html HTTP/1.0
Host: example.com

والرد ممكن يكون :

كود:
HTTP/1.0 200 OK
Content-Type: text/html

<HTML>...</HTML>


مووضوع الـ HTTP و HTTPS وأجزاء الـ URL مهممممم


مقدمة عن الروابط (URLs)

بالنسبة للروابط اللي بتشوفها كل يوم وبتكتبها في المتصفح هي فعلياً عبارة عن محدد موارد موحد Uniform Resource Locator الروابط بتنقسم لعدة أجزاء منها:

الـ Scheme : البروتوكول (مثل HTTP أو HTTPS)
الـ Host : الخادم اللي بنطلب منه المورد (زي example.com)
الـ Port : رقم المنفذ اللي بيشغل الخدمة (زي 80 أو 8080)
الـ Path : المسار اللي بِوصلنا للمورد (زي cat.gif)
الـ Query : المعلمات أو البيانات الإضافية اللي بنحددها (مثلاً الأبعاد)
الـ Fragment : معلومات خاصة بالمستخدم أو المتصفح (ما بتوصل للسيرفر)

المشكلة مع المسافات والترميز (Encoding):

لو طلبنا مورد فيه مسافات زي hello world السيرفر ممكن يرد بـ "طلب غير صحيح" الحل هون هو ترميز الأحرف الغير آمنة باستخدام الـ ASCII

المسافة مثلاً تتحول لـ %20
كل حرف أو رمز عنده قيمة سداسية عشرية Hex


أنواع ترميز البيانات في الطلبات :

1. Form URL Encoded :
زي لما نستخدم نموذج Form عادي في صفحة ويب البيانات بتترمز وتُرسل كسلسلة نصوص مفصولة بـ = و &


2. JSON :
يستخدم لإرسال بيانات مهيكلة بشكل أعمق (زي الكائنات المتداخلة) مثلاً:

كود:
{
  "name": "Connor"
}

متى بنستخدم JSON بدل Form URL ؟

  • Form URL Encoded : لما نرسل بيانات بسيطة عبر نموذج ويب
  • JSON : لما نحتاج بيانات معقدة زي واجهات الـ APIs

شو فكرة State بالويب وليش هو مهم؟

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


شو يعني State ؟

الفرق الأساسي بين برنامج بسيط زي موقع يعرضلك صورة قطة وبرنامج زي اللي بتسجل فيه حسابك البنكي هو مفهوم الحالة أو State هاي بتخلي البرنامج يتذكر شغلات عنك زي تسجيل دخولك البيانات اللي أدخلتها وأي تغييرات بتصير
لكن فيه مشكلة!
البروتوكول اللي بستخدمه الإنترنت واللي اسمه HTTP هو بروتوكول بدون حالة Stateless Protocol يعني كل طلب request انت بتبعثه للموقع السيرفر بتعامل معه كأنه جديد وما بتذكر او بخزن الطلبات اللي قبله (كل طلب لحال)


طيب كيف بنحافظ على الـ State ؟

هون بيجي دور الكوكيز HTTP Cookies لما تسجل دخولك لموقع معين السيرفر بعمل شغلة ذكية :
ببعثلك قطعة صغيرة من البيانات اسمها كوكي والمتصفح بخزنها عندك
كل ما ترسل طلب جديد للسيرفر المتصفح برجع يبعث هاي الكوكيز عشان السيرفر يتذكر مين انت

مثال بسيط:

  • لما تسجل دخول باسم مستخدم معين السيرفر بعطيك كوكي زي : auth=abdallah
  • في الطلبات الجاية المتصفح تلقائياً برفق هاي الكوكيز مع كل طلب
  • السيرفر بستخدم الكوكي عشان يعرف مين انت وبتعامل معك بناءً على هاي البيانات

مشاكل أمنية:

واحدة من النقاط اللي لازم ننتبهلها إنه السيرفر ما بتأكد إذا انت فعلاً سجلت الدخول بطريقة صحيحة أو إذا ببساطة اخترعت كوكي بنفسك (مثلاً: auth=admin)
عشان هيك التطبيقات لازم تستخدم أساليب أقوى زي أرقام الجلسات Session IDs اللي بتكون صعبة التوقع أو التزوير


ليش هذا مهم؟

فهم كيف الكوكيز و State بشتغلوا مهم جداً لأي شخص مهتم بالأمن السيبراني لأنه بعطيك فكرة عن كيف ممكن تتلاعب أو تحمي البيانات اللي بتتعامل معها التطبيقات والتعمق أكثر بهاي المواضيع بخليك تعرف نقاط الضعف وتحمي النظام من الثغرات


كيف بتصير طلبات الويب؟

بالعادة لما تفتح متصفح وتدخل رابط URL وتكبس Enter بتتفاجأ إن صفحة ويب ظهرت قدامك طيب كيف بتشتغل هاي العملية تحت الغطاء ؟
القصة بسيطة : الـ HTTP هو البروتوكول اللي بتم من خلاله هالكلام المتصفح تبعك ببعث طلب HTTP للخادم (السيرفر) عشان يرجعلك المحتوى



استخدام أدوات غير المتصفح

1. curl هي أداة بسيطة تستخدم من التيرمنال عشان تبعث طلبات HTTP مثلاً :

كود:
curl example.com
هون بترجعلنا صفحة HTML بنفس الشكل اللي كان يظهر بالمتصفح مش بس هيك ممكن نستخدم أوامر إضافية زي X POST- عشان نعمل طلب POST بدلاً من GET

2. لو بدنا نشتغل على مستوى أقل ممكن نستخدم netcat عشان نبعث الطلب يدوي مثلاً:

كود:
nc example.com 80
وبعدين بنكتب طلبنا كالتالي :
كود:
GET / HTTP/1.1
Host: example.com
وبنضغط Enter مرتين الخادم برد علينا باستجابة HTTP بشكل خام

3. البرمجة مع طلبات HTTP

باستخدام بايثون :

لو بدنا نكتب برنامج يتعامل مع طلبات الويب مكتبة الـ requests ببايثون بتسهّل علينا هاي الأمور مثلا :
كود:
import requests
response = requests.get("http://example.com")
print(response.text)


هون بنقدر نطبع النص اللي رجعه السيرفر أو حتى نفحص الـ Headers

استخراج الروابط من صفحة:

ممكن نكتب برنامج بسيط يسحب الروابط links من أي صفحة :
  1. بجيب النص HTML
  2. بدوّر على الـ TAG ـ <a> اللي فيه الروابط
  3. يعرض كل الروابط اللي لقاها

بنبدا مع تطبيق عملي على 39 تحدي لارسال الطلبات واسترجاعها بالـ Curl والـ Nc والـ python


من 1 الى 3 المطلوب Send an HTTP request

1. عن طريق الـ Curl
Bash:
curl localhost
طلب بسيط عن طريق الـ curl

2. عن طريق الـ Nc
Bash:
nc localhost 80 GET /flag
بنرسل طلب لصفحة العلم

3. عن طريق الـ python
كود:
python3 -c "import requests; print(requests.get('http://localhost/flag').text)"

طلب باستخدام البايثون وهاد هو الكود الاصلي


Python:
import requests
print(requests.get('http://localhost/flag').text)

من 4 الى 6 المطلوب host header

4. عن طريق الـ Curl
Bash:
curl -H "Host: localhost" http://localhost
بنستخدم الخيار
H- عشان نستعرض الـ header

5. عن طريق الـ
Nc
Bash:
echo -e "GET / HTTP/1.1\r\nHost: 6987947b16a3f4d71023eab30de877b6\r\nConnection: close\r\n\r\n" | nc localhost 80
وهاد هو شكل الطلب
HTTP:
GET / HTTP/1.1
Host: 6987947b16a3f4d71023eab30de877b6
Connection: close


6. عن طريق الـ
python
كود:
python -c "import requests; print(requests.get('http://localhost', headers={'Host': '9d85473ad3a0eec01de4696e4388b5a5'}).text)"
هي بشكل بسيط عن طريق بايثون كيف نستعرض الـ
header

وهاد هو الكود الاصلي
Python:
import requests
url = 'http://localhost'
host_value = '9d85473ad3a0eec01de4696e4388b5a5'
response = requests.get(url, headers={'Host': host_value})
print(f"Response from {url} with Host {host_value}: {response.text}")

من 7 الى 9 المطلوب Set the path in an HTTP request

7. عن طريق الـ Curl
Bash:
curl http://localhost/6987947b16a3f4d71023eab30de877b6
مافي فرق عن الطلب العادي

8. عن طريق الـ Nc
Bash:
echo -e "GET /1b16942c1b81c0786eb84f3bd3724b79 HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" | nc localhost 80
بنحط الباث بدايه الطلب وهاد هو شكل الطلب

HTTP:
GET /1b16942c1b81c0786eb84f3bd3724b79 HTTP/1.1
Host: localhost
Connection: close


9. عن طريق الـ python
كود:
python -c "import requests; print(requests.get('http://localhost/64abeec9191d09296dda2fdfbb781988', headers={'Host': 'localhost'}).text)"
بنحدد الباث بشكل بسيط بس


وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost/64abeec9191d09296dda2fdfbb781988'
host_value = 'localhost'
response = requests.get(url, headers={'Host': host_value})
print(f"Response from {url} with Host {host_value}: {response.text}")
[B][SIZE=5]

من 10 الى 12 المطلوب URL encode a path in an HTTP request

10. عن طريق الـ Curl
Bash:
curl "http://localhost//9822629e%20b62993d7/9ad6eff9%20f873c007"
بنعمل بس URL encoding

بنحول هدول الرموز لـ

& > %26
# > %23
> %20

11. عن طريق الـ Nc
Bash:
echo -e "GET /f65c9b42%20e4c70a50/b68ce464%204551c4fb HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" | nc localhost 80
بنعمل بس URL encoding

بنحول هدول الرموز لـ

& > %26
# > %23
> %20
وهاد هو الطلب
HTTP:
GET /f65c9b42%20e4c70a50/b68ce464%204551c4fb HTTP/1.1
Host: localhost
Connection: close

12. عن طريق الـ python
كود:
python -c "import requests; print(requests.get('http://localhost//a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5', headers={'Host': 'localhost'}).text)"
بنعمل بس URL encoding

بنحول هدول الرموز لـ

& > %26
# > %23
> %20

وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost//a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5'
host_value = 'localhost'
response = requests.get(url, headers={'Host': host_value})
print(f"Response from {url} with Host {host_value}: {response.text}")
[B][SIZE=5]

من 13 الى 15 المطلوب Specify an argument in an HTTP request

13. عن طريق الـ Curl
Bash:
curl -H "Host: localhost" "http://localhost//a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=b83c32298e6e891dea35dedf0b96cdf1"
بنرسل طلب GET مع هيدر Host وبنحط المعلمات او البيانات اللي بدو التحدي نبعثها


14. عن طريق الـ Nc
Bash:
echo -e "GET /a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=1422f7a8337d2e8147b5e9997f7a47ab HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" | nc localhost 80
نفس الفكره لكن بنحط المعلومه A بالرابط
وهاد هو الطلب

HTTP:
GET /a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=1422f7a8337d2e8147b5e9997f7a47ab HTTP/1.1
Host: localhost
Connection: close

15. عن طريق الـ python
كود:
python -c "import requests; print(requests.get('http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5', params={'a': '32fc5e63b7f3a9ec63c5183ecfc849ec'}).text)"
وهون بنضيفها عل الرابط


وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5'
params = {'a': '32fc5e63b7f3a9ec63c5183ecfc849ec'}
response = requests.get(url, params=params)
print(f"Response from {url} with params {params}: {response.text}")
[B][SIZE=5]

من 16 الى 18 المطلوب Specify multiple arguments in an HTTP request

16. عن طريق الـ Curl
Bash:
curl "http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=d98aa9836c920b989a5635c67f886902&b=c490a9b5%204cde9062%2648514fde%234315279d" -H "Host: localhost"
بنرسل طلب GET مع هيدر Host وبنحط المعلمات او البيانات اللي بدو التحدي نبعثها
هاد مثال على اكثر من معلومه ( بنفصلهن بـ & )


17. عن طريق الـ Nc
Bash:
echo -e "GET /a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=3e7c42f3f4f89e8f6345609447cc0d25&b=b5c89e33%2074079a4b%269726845e%23079c10ef HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" | nc localhost 80
نفس الفكره ( بنفصلهن بـ & )
وهاد هو الطلب

HTTP:
GET /a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=3e7c42f3f4f89e8f6345609447cc0d25&b=b5c89e33%2074079a4b%269726845e%23079c10ef HTTP/1.1
Host: localhost
Connection: close


18. عن طريق الـ python
كود:
python -c "import requests; print(requests.get('http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5?a=2c22c8590cb0a46a76ae467e15fe1cba&b=443c8f39%2022e20791%2636529185%23c2800d55', headers={'Host': 'localhost'}).text)"
نفس الفكره

وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5'
params = {'a': '2c22c8590cb0a46a76ae467e15fe1cba', 'b': '443c8f39%2022e20791%2636529185%23c2800d55'}
response = requests.get(url, params=params, headers={'Host': 'localhost'})
print(f"Response from {url} with params {params}: {response.text}")
[B][SIZE=5]

من 19 الى 21 المطلوب Include form data in an HTTP request

19. عن طريق الـ Curl
Bash:
curl -X POST -d "a=8468bf1d32ca196a01b18388bf3e3986" -H "Host: localhost" "http://localhost/a1afa0e3%20fcd2e340/6a0c2b8c%20f58256d5"
بنستخدم X POST- عشان نحدد الطلب يكون POST
وسبق وحكينا عن الـ Form


20. عن طريق الـ Nc
Bash:
echo -e "POST / HTTP/1.1\r\nHost: localhost\r\nContent-Length: 34\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\na=69abbc1cd587c8981e5d0502e950152d" | nc localhost 80
هون بنحدد نوع البيانات Content-Type وبنحدد نوع الطلب POST

وهاد هو الطلب

HTTP:
POST / HTTP/1.1
Host: localhost
Content-Length: 34
Content-Type: application/x-www-form-urlencoded

a=69abbc1cd587c8981e5d0502e950152d

21. عن طريق الـ python
كود:
python -c "import requests; print(requests.post('http://localhost/', headers={'Host': '6987947b16a3f4d71023eab30de877b6', 'Connection': 'close'}, data={'a': 'bff63dd33a30288b1bdb5a4416e2a96c'}).text)"
وبالبايثون هيك بنحدد


وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost/'
headers = {'Host': '6987947b16a3f4d71023eab30de877b6', 'Connection': 'close'}
data = {'a': 'bff63dd33a30288b1bdb5a4416e2a96c'}
response = requests.post(url, headers=headers, data=data)
print(f"Response from POST {url} with headers {headers} and data {data}: {response.text}")
[B][SIZE=5]

من 22 الى 24 المطلوب Include form data with multiple fields in an HTTP request

22. عن طريق الـ Curl
Bash:
curl -X POST "http://localhost/" -H "Host: localhost" -d "a=0515cd7cc9e0d5ccd79b0acb09102542&b=85672841%20416de088%26c687360c%236af5f601"
الهون الفرق انه زدنا بس المتغيرات او المعلمات


23. عن طريق الـ Nc
Bash:
echo -e "POST / HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 78\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\na=f63119f486b55181fdac486305d8b636&b=3b089da1%20e22c5688%2634503678%23dc102bc4" | nc localhost 80
نفس الفكره الفرق انه زدنا بس المتغيرات او المعلمات
وهاد هو الطلب

HTTP:
POST / HTTP/1.0
Host: 127.0.0.1
Content-Length: 78
Content-Type: application/x-www-form-urlencoded

a=f63119f486b55181fdac486305d8b636&b=3b089da1%20e22c5688%2634503678%23dc102bc4



24. عن طريق الـ python

Python:
python -c "import requests; print((requests.post('http://localhost/', headers={'Host': 'localhost'}, data={'a': '60e22136484d963bd50c99e94626dbc8', 'b': '3cc458ef 5431a2cd&19cec9d3#7a648a7e'})).text)"
نفس الفكره الفرق انه زدنا بس المتغيرات او المعلمات


وهاد هو الكود الاصلي
كود:
import requests
url = 'http://localhost/'
headers = {'Host': 'localhost'}
data = {'a': '60e22136484d963bd50c99e94626dbc8', 'b': '3cc458ef 5431a2cd&19cec9d3#7a648a7e'}
response = requests.post(url, headers=headers, data=data)
print(f"Response from POST {url} with headers {headers} and data {data}: {response.text}")

من 25 الى 27 المطلوب Include json data in an HTTP request

25. عن طريق الـ Curl
Bash:
curl -X POST -H "Content-Type: application/json" -d '{"a":"7ff7c4d20c9afd8b0d198634c2c1c629"}' http://localhost
هون احنا بنحدد نوع المحتوى application/json عشان يعرف السيرفر اننا بدنا نرسل بيانات بصيغه JSON

26. عن طريق الـ Nc
Bash:
echo -e 'POST / HTTP/1.0\r\nHost: localhost\r\nContent-Length: 41\r\nContent-Type: application/json\r\n\r\n{"a":"6be3b1ca28f64d9a25588c7034a8b1c0"}' | nc localhost 80
نفس الفكره بنحدد نوع المحتوى application/json عشان يعرف السيرفر اننا بدنا نرسل بيانات بصيغه JSON
وهاد هو الطلب

HTTP:
POST / HTTP/1.0
Host: localhost
Content-Length: 41
Content-Type: application/json

{"a":"6be3b1ca28f64d9a25588c7034a8b1c0"}'


27. عن طريق الـ python
كود:
python -c 'import requests; print(requests.post("http://localhost", headers={"Host": "localhost", "Content-Type": "application/json"}, data="{\"a\":\"b96a93183bc3654d6d9bcd6f9912d788\"}").text)'
نفس الفكره وبنستخدم \ عشان نقدر نرسل الـ " ويوخذها كما هي (بنسميها تهريب)


وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = "http://localhost"
headers = {"Host": "localhost", "Content-Type": "application/json"}
data = "{\"a\":\"b96a93183bc3654d6d9bcd6f9912d788\"}"
response = requests.post(url, headers=headers, data=data)
print(f"Response from POST {url} with headers {headers} and data {data}: {response.text}")
[B][SIZE=5]

من 28 الى 30 المطلوب Include complex json data in an HTTP request

28. عن طريق الـ Curl
Bash:
curl -X POST -H "Content-Type: application/json" -d '{"a": "3efb8f52cc7c3ce281e360620336650a", "b": {"c": "7b80994b", "d": ["c8a5b632", "92909c57 e90ee6db&a1a41ad1#0d237712"]}}' http://localhost
نفس فكره التحديات اللي فوق بس ضفنا شويه تعقيد 😂


29. عن طريق الـ Nc


بنخزن هذه الطلب بملف ( وبنقدر نعمل هيك لكل الطلبات)
Bash:
POST / HTTP/1.1
Host: 127.0.0.1
Content-Length: 119
Content-Type: application/json

{"a":"6c988b59fc8b0b8b74b5f62bcd1dc417", "b":{"c":"b9c45c7d", "d":["92e58e74", "7b856d5d aacc7382&4778ec8f#75795ae7"]}}

بعدها بنكتب الامر
Bash:
[SIZE=5][B]cat request | nc localhost 80[/B][/SIZE]



30. عن طريق الـ python

كود:
python -c 'import requests; print(requests.post("http://localhost", json={"a": "9d5fe48f6fcbe6474f84811216cdbf7e", "b": {"c": "cd319365", "d": ["ff89d800", "a5bd55f4 58740e53&9f7e94f8#79739cb2"]}}, headers={"Host": "localhost"}).text)'
نفس الفكره


وهاد هو الكود الاصلي
Python:
import requests
url = "http://localhost"
json_data = {
    "a": "9d5fe48f6fcbe6474f84811216cdbf7e",
    "b": {
        "c": "cd319365",
        "d": [
            "ff89d800",
            "a5bd55f4 58740e53&9f7e94f8#79739cb2"
        ]
    }
}
headers = {"Host": "localhost"}
response = requests.post(url, json=json_data, headers=headers)
print(f"Response from POST {url} with JSON data {json_data}: {response.text}")

من 31 الى 33 المطلوب Follow an HTTP redirect from HTTP response

31. عن طريق الـ Curl
Bash:
curl -L http://localhost
بنستخدم الـ L- لمتابعة إعادة التوجيه التلقائي في حال وجوده

32. عن طريق الـ Nc
Bash:
[/B][/SIZE]echo -e "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n" | nc localhost 80 
echo -e "GET /cda4a8da943d0c94644935e1cd5e3d97 HTTP/1.1\r\nHost: localhost\r\n\r\n" | nc localhost 80[SIZE=5][B]
هاد هو الطلب

HTTP:
GET / HTTP/1.1
Host: localhost
HTTP:
GET /cda4a8da943d0c94644935e1cd5e3d97 HTTP/1.1
Host: localhost


33. عن طريق الـ python
كود:
python -c "import requests; print(requests.get('http://localhost', allow_redirects=True).text)"
بنستخدم بس allow_redirects

وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost'
response = requests.get(url, allow_redirects=True)
print(f"Response from {url} with redirects allowed: {response.text}")
[B][SIZE=5]

من 34 الى 36 المطلوب Include a cookie from HTTP response

34. عن طريق الـ Curl
Bash:
curl -b cookies.txt http://localhost
بكل بساطه بنستخدم b- وبنحط الكوكيي


35. عن طريق الـ Nc
Bash:
printf "GET / HTTP/1.1\r\nHost: localhost\r\nCookie: cookie=643f4def533e27c21302e59fd86cbb36\r\nConnection: close\r\n\r\n" | nc localhost 80
بنحط الكوكي مع الطلب بمتغير Cookie
وهاد هو الطلب

HTTP:
GET / HTTP/1.1
Host: localhost
Cookie: cookie=643f4def533e27c21302e59fd86cbb36
Connection: close

36. عن طريق الـ python
كود:
python3 -c "import requests; r1 = requests.get('http://localhost', allow_redirects=False); cookie = r1.cookies.get('cookie'); r2 = requests.get('http://localhost', cookies={'cookie': cookie}); print(r2.text)"
بالشكل التالي اوضح

وهاد هو الكود الاصلي
Python:
[/SIZE][/B]
import requests
url = 'http://localhost'
r1 = requests.get(url, allow_redirects=False)
cookie = r1.cookies.get('cookie')
r2 = requests.get(url, cookies={'cookie': cookie})
print(f"Response after following redirect with cookie: {r2.text}")
[B][SIZE=5]

من 37 الى 39 المطلوب Make multiple requests in response to stateful HTTP responses

37. عن طريق الـ Curl
Bash:
curl -X GET http://localhost --cookie-jar cookies.txt --cookie cookies.txt && curl -X GET http://localhost --cookie-jar cookies.txt --cookie cookies.txt && curl -X GET http://localhost --cookie-jar cookies.txt --cookie cookies.txt
بنرسل 3 طلبات مع استخدام الكوكي المخزنه بعد كل استجابه



38. عن طريق الـ
Nc
Bash:
echo -e "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\nCookie: session=dummy\r\n" | nc localhost 80 | grep -oP 'Set-Cookie: session=\K[^\s;]*' | xargs -I {} echo -e "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\nCookie: session={}\r\n" | nc localhost 80

echo -e "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\nCookie: session=eyJzdGF0ZSI6Mn0.Z22P_w.pUKUlrwwUJ5Hg3aluOtJ3hO1S8k\r\n" | nc localhost 80

echo -e "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\nCookie: session=eyJzdGF0ZSI6M30.Z22QUg.sMd35lKUbDu8tNrpAIdgi8ghqB0\r\n" | nc localhost 80
بنرسل الكوكيز باسم session مع القيمة dummy كجزء من الطلب
عشان نجرب بس يعني القيمه dummy وهميه بس
يعني هيك خبرناه اننا عننا كوكي معينه وبعدها عن طريق الـ grep بنبحث عن كوكي جديده

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

وهاد هو الطلب

HTTP:
GET / HTTP/1.0
Host: 127.0.0.1
Cookie: session=dummy


39. عن طريق الـ python
كود:
python3 -c "import requests; host = 'http://127.0.0.1/'; response1 = requests.get(host); cookie1 = response1.cookies; response2 = requests.get(host, cookies=cookie1); cookie2 = response2.cookies; response3 = requests.get(host, cookies=cookie2); cookie3 = response3.cookies; response4 = requests.get(host, cookies=cookie3); cookie4 = response4.cookies; print(response4.text)"

وهاد هو الكود الاصلي
Python:
import requests

host = 'http://127.0.0.1/'
response1 = requests.get(host)
cookie1 = response1.cookies
response2 = requests.get(host, cookies=cookie1)
cookie2 = response2.cookies
response3 = requests.get(host, cookies=cookie2)
cookie3 = response3.cookies
response4 = requests.get(host, cookies=cookie3)
cookie4 = response4.cookies
print(f"Final response after multiple redirects: {response4.text}")



في اكثر من شخص سالني كم بقعد معي المنشور بالتنسيق والتعديل والشرح
فجوابي بختلف من منشور لمنشور هاد اخذ 3 ساعات ونص شرح وترتيب وتنسيق بدون حل الاسئله كنت احلها قبل وبسسس


وهيك بنحكي خلصنا اول جزء


مشاهدة المرفق 15876
بارك الله فيك يا عبود
عمل جبار
 
بارك الله فيك عبود على الطرح الرائع
ننتظر جديد ابداعاتك دائما
تحياتي
 
بارك الله فيك عبود على الطرح الرائع
ننتظر جديد ابداعاتك دائما
تحياتي
وفيك يارب ,اشكرك على مرورك 🫀
 
  • Love
التفاعلات: STORM
شخصيا هذا ليس مجالي و لكن مع مطالعة للموضوع فالشرح تفصيلي و سفاح مثل باقي مقالاتك

الله يجزيك الف خير و ان شاء الله نكون بذرة لتطور المحتوى العربي و لارضاء الله تعالى
بالتوفيق عبود
 

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

فانوس

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