01بنية تطبيقات الويب الحديثة

ما هي بنية تطبيق الويب؟

الإطار والهيكل اللي بيحدّد إزاي مكوّنات تطبيق الويب بتتفاعل مع بعض وبتشتغل سوا عشان توصل التطبيق للمستخدمين — بيشمل تصميم الواجهة الأمامية (Front-end)، الخلفية (Back-end)، تخزين البيانات، والتواصل بينهم. بدون بنية متينة، حتى أكتر التطبيقات ابتكارًا ممكن تفشل في تلبية توقعات المستخدمين أو أهداف العمل.

المكوّنات الأساسية

1Application Servers — بتعالج منطق العمل وتتعامل مع الطلبات الديناميكية من المستخدمين
2Database Servers — سيرفرات مخصّصة لتخزين واسترجاع بيانات التطبيق، محمية عادة خلف جدران نارية ومعزولة عن الوصول الخارجي المباشر
3آليات تحسين الأداء — خدمات زي CDNs بتخزّن الأصول الثابتة (صور، JS، CSS) أقرب للمستخدم لتقليل زمن الاستجابة
أهمية فهم البنية في هذا الموديول

فهم بنية السيرفر الداخلية مهم جدًا في سياق "هجمات جهة السيرفر" — لأن ثغرات زي SSRF وInsecure Deserialization غالبًا بتستغل علاقات الثقة الداخلية، تدفّق البيانات، وتفاعلات المكوّنات جوه البنية. فهمك للبنية بيخلّيك تقترب من الهجمات دي بدقة، تكتشف عيوب خفيّة، وتوصي بإجراءات معالجة مستهدَفة.


02نماذج بنية تطبيقات الويب

النموذجالوصفأفضل استخدام
Layeredتنظيم المكوّنات في طبقات منفصلة (عرض، منطق عمل، بيانات)تطبيقات Monolithic تقليدية
Microservicesخدمات صغيرة مستقلة بتعالج وظائف عمل محدَّدة، بتتواصل عبر APIsتطبيقات كبيرة ومعقّدة وقابلة للتوسّع
SOAخدمات مركزية قابلة لإعادة الاستخدام تُدار عبر Enterprise Service Busتكاملات على مستوى المؤسسة
Event-Drivenعمليات تُشغَّل عبر إجراءات مستخدم أو أحداث نظام، غالبًا بشكل غير متزامنأنظمة لحظية زي التجارة الإلكترونية أو IoT
Serverlessدوال تُشغَّل بالأحداث ويديرها مزوّد سحابي (FaaS)أعباء عمل خفيفة ومدفوعة بالأحداث
Monolithicكل مكوّنات التطبيق مجمَّعة في وحدة واحدةتطبيقات صغيرة أو شركات ناشئة في مراحلها الأولى
Distributedالتطبيق منتشر عبر عدة أنظمة أو عُقَد مترابطةأنظمة عالية القابلية للتوسّع وتحمّل الأعطال

Layered Architecture بالتفصيل

بتنظّم التطبيق في طبقات منفصلة، كل واحدة مسؤولة عن مهام محدَّدة: Presentation Layer (تفاعلات المستخدم — متصفحات، تطبيقات موبايل)، Business Logic Layer (سيرفر التطبيق — معالجة الطلبات وتطبيق المنطق والتفاعل مع قاعدة البيانات)، وData Access Layer (إدارة تخزين واسترجاع البيانات). الطبقات بتتواصل هرميًا، غالبًا من أعلى لأسفل — الأنسب للتطبيقات التقليدية اللي محتاجة فصل واضح للأدوار.

Microservices Architecture بالتفصيل

بيقسّم التطبيق لخدمات صغيرة مستقلة، كل واحدة بتتعامل مع قدرة عمل محدَّدة (مصادقة المستخدم، معالجة الدفع). كل خدمة مفكوكة الارتباط (Loosely Coupled) وقابلة للنشر بشكل مستقل، بتتواصل مع خدمات تانية عبر APIs (REST، gRPC)، وغالبًا عندها قاعدة بياناتها الخاصة. مثالي للتطبيقات الكبيرة اللي محتاجة مرونة وقابلية توسّع ونشر مستمر، وبيسمح باستخدام تقنيات مختلفة لخدمات مختلفة (Polyglot Programming).


03مثال عملي: بنية طبقية لموقع تجارة إلكترونية

1
Client Layer

الواجهة الأمامية اللي العميل بيتفاعل معها — موقع بيوفّر تصفّح وبحث المنتجات، سلة الشراء، وإدارة الحساب. بيشتغل في متصفحات الويب وبيبعت طلبات HTTP للسيرفر.

2
Web Server Layer — Nginx

بيتعامل مع طلبات HTTP/HTTPS الواردة، بيقدّم الملفات الثابتة (صور، CSS، JS)، بيعمل كـ Reverse Proxy بيحوّل الطلبات الديناميكية لسيرفر التطبيق (uWSGI)، وبيوفّر موازنة الحمل لو فيه أكتر من سيرفر تطبيق.

3
Application Server Layer — uWSGI

بيعالج الطلبات الديناميكية اللي وصلت من Nginx، بينفّذ منطق العمل ويدير العمليات الخلفية — مصادقة المستخدم، منطق سلة الشراء، معالجة الطلبات.

4
API Layer

واجهات مهيكلة للتواصل بين سيرفر التطبيق والأنظمة الخارجية/الداخلية — API معلومات المنتج (توافر، سعر، وصف) وAPI إدارة الطلبات (تتبّع وحالة الطلب).

5
Database Layer — MongoDB

بتخزّن كتالوج المنتجات، بيانات العملاء، وسجل الطلبات والمعاملات — مستضافة على سيرفر منفصل لقابلية التوسّع والأمان. سيرفر التطبيق بيتصل بـ MongoDB عبر Driver زي PyMongo لـ Python.


04هجمات Server-Side — التعريف والمعايير

معنى "Server-Side"

بيشاور للعمليات والمنطق والبنية التحتية اللي بتشتغل على السيرفر مش على العميل — بيعالج مهام حرجة زي معالجة الطلبات، تنفيذ منطق العمل، التواصل مع قواعد البيانات وAPIs، والتكامل مع خدمات داخلية. هجمات Server-Side بتستغل ضعف في طريقة معالجة السيرفر للمدخلات، تواصله مع أنظمة تانية، وإدارته للموارد — بعكس هجمات Client-Side اللي بتستهدف المكوّنات المواجهة للمستخدم.

معايير التمييز

1سياق التنفيذ — الكود أو المنطق بيتنفّذ على السيرفر، مش المتصفح
2النطاق — بتأثّر على بنية أو إعداد السيرفر أو التواصل بين المكوّنات
3التفاعل مع المكوّنات — استغلال طريقة تفاعل السيرفر مع APIs أو خدمات مصغّرة أو أنظمة خارجية
4افتراضات الثقة — استغلال ثقة ضمنية (ثقة في مدخل المستخدم → Insecure Deserialization، ثقة في طلبات الشبكة الداخلية → SSRF)
5موارد السيرفر — استغلال نظام الملفات أو الذاكرة أو المعالج الخاص بالسيرفر

05الطبقات المستهدَفة وWeb Server مقابل App Server

الطبقات اللي بتستهدفها هجمات Server-Side

Web Server مقابل Application Server

الجانبWeb ServerApplication Server
الدوريقدّم محتوى ثابت، يوجّه الطلباتينفّذ منطق العمل، يولّد استجابات ديناميكية
التفاعليتواصل مع العملاء (HTTP/HTTPS)يتواصل مع قواعد البيانات وAPIs والخدمات
المعالجةمهام خفيفة (تقديم ملفات ثابتة)معالجة ثقيلة (معالجة بيانات)
المخرجاتملفات (HTML، CSS، JavaScript)بيانات محسوبة (JSON، HTML)
أمثلةApache، Nginx، IISNode.js، Django، Spring Boot

ثغرات طبقة Web Server

ثغرات طبقة Application Server


06مقدمة في SSRF

Server-Side Request Forgery ثغرة بتخلّي المهاجم يخدع السيرفر عشان ينفّذ طلبات غير مصرَّح بها لموارد داخلية أو خارجية نيابةً عنه — الطلبات دي بتبدأها التطبيق الضعيف لكن بيتحكّم فيها المهاجم، وغالبًا بتؤدي لكشف بيانات حساسة أو الوصول لأنظمة مقيَّدة.

1كشف بيانات حساسة
2سرقة معلومات مصادقة
3استطلاع الشبكة الداخلية
4RCE — نقطة دخول لهجمات متقدّمة زي تنفيذ كود عن بُعد أو تصعيد صلاحيات
5قراءة/تضمين ملفات

أسباب SSRF

سيناريوهات عرضة شائعة

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


07تشريح هجوم SSRF

1
تحديد Endpoint عرضة

البحث عن وظيفة بيجلب فيها التطبيق موارد أو محتوى من رابط يقدّمه المستخدم (أدوات تنزيل ملفات، Webhooks، أو أدوات اختبار API).

2
التلاعب في المدخل

صياغة رابط خبيث بيشاور لمورد داخلي أو غير مصرَّح به — سيرفرات داخلية (http://localhost، http://127.0.0.1) أو نقاط نهاية Metadata السحابية (http://169.254.169.254 على AWS).

3
السيرفر بيعالج الطلب

سيرفر التطبيق بيعالج الرابط اللي تحت تحكّم المهاجم وينفّذ الطلب — ثقة السيرفر في شبكته بتسمح بالوصول لموارد مقيَّدة أصلًا.

4
استخراج أو استغلال الاستجابة

المهاجم يقدر يسترجع معلومات حساسة (بيانات خدمة داخلية، بيانات اعتماد). في الحالات المتقدّمة، ممكن يستخدم SSRF لفحص منافذ على أنظمة داخلية أو ربط الهجوم بثغرات تانية (فك تسلسل، RCE).


08أنواع هجمات SSRF

01
Basic SSRF
المهاجم بيستخدم رابط خبيث لجلب موارد داخلية أو بيانات خارجية عبر السيرفر. مثال: http://example.com/fetch?url=http://attacker.com/malicious.png → يتعدّل لـ ...url=http://localhost/admin.
02
Blind SSRF
المهاجم مش بيشوف استجابة السيرفر مباشرة، لكن بيستنتج النتائج من آثار جانبية (سجلات السيرفر، حلّ DNS) — مثلًا إرسال استعلام DNS لنطاق يتحكّم فيه ومراقبة سجلاته.
03
SSRF للاستطلاع الداخلي
استخدام SSRF لفحص الشبكات أو الخدمات الداخلية الغير مكشوفة خارجيًا — مثلًا اختبار منافذ مفتوحة عبر http://127.0.0.1:80.
04
SSRF Chaining
دمج SSRF مع ثغرات تانية لاستغلال متقدّم — الوصول لخدمات Metadata السحابية (بيانات اعتماد AWS IAM عبر http://169.254.169.254/latest/meta-data/)، أو الوصول لخدمات داخلية حساسة تؤدي لتصعيد صلاحيات أو حركة جانبية.

09مقدمة في التسلسل وفك التسلسل

ما هو Serialization؟

عملية تحويل أوبجكت أو بنية بيانات (أوبجكت Python، Java، أو C#) لصيغة سهلة التخزين أو النقل، وبعدين يُعاد بناؤها (Deserialization) لاحقًا. الصيغة المُسلسَلة غالبًا بتكون Byte Stream، صيغة نصية (JSON، XML)، أو تمثيل ثنائي. المستلم المفروض يقدر يعيد بناء الأوبجكت لشكله الأصلي من غير تغيير.

كيف تعمل عملية التسلسل

  1. تحويل الأوبجكت: التمثيل الموجود في الذاكرة (خصائصه، دواله، حالته) بيتحوّل لصيغة محدَّدة (ثنائية مضغوطة أو نصية قابلة للقراءة زي JSON/XML/YAML)
  2. التخزين أو النقل: البيانات المُسلسَلة ممكن تُخزَّن (ملف أو قاعدة بيانات) أو تُنقَل (عبر شبكة أو API)
  3. إعادة بناء الأوبجكت (فك التسلسل): البيانات المُسلسَلة بتُحلَّل لإعادة إنشاء الأوبجكت أو بنية البيانات الأصلية في الذاكرة
اعتبار أمني حاسم

البيانات المُسلسَلة عادة مش مشفَّرة ولا موقَّعة افتراضيًا — ده يعني إنها لو اتُعرِضت، ممكن يتم العبث بيها بحرّية، وده ممكن يؤدي لسلوك غير متوقَّع أو خبيث في المكوّن المسؤول عن فك التسلسل. بعض بروتوكولات النقل بتدمج التسلسل مع الضغط أو التشفير اللي ممكن يخفي أو يؤمّن البيانات، لكن غالبًا بتظهر بصيغة نصية غير محمية — ده بالضبط اللي بيديه فرصة للمختبر أو المهاجم يحلّل ويتلاعب في البيانات.


10فك التسلسل غير الآمن (Insecure Deserialization)

ثغرة بتحدث لما بيانات غير موثوقة أو يتحكّم فيها المستخدم بتتعرّض لعملية فك تسلسل بدون تحقّق أو فحوصات أمنية مناسبة — ممكن تؤدي لعواقب وخيمة زي تنفيذ كود عن بُعد (RCE)، تصعيد صلاحيات، أو تلاعب بالبيانات.

أسباب الثغرة

التأثيرات المحتملة

التأثيرالوصف
Remote Code Executionحقن حمولات تستغل عملية فك التسلسل لتنفيذ كود عشوائي على السيرفر
Privilege Escalationالعبث بالبيانات المُسلسَلة لتصعيد الصلاحيات أو انتحال مستخدمين بتعديل توكنات/أوبجكتس جلسة
Data Tamperingتغيير قيم البيانات المُسلسَلة للتلاعب في سلوك التطبيق (مثل زيادة رصيد حساب)
Application Logic Abuseحقن أوبجكتس تستدعي وظائف غير مقصودة أثناء فك التسلسل
Denial of Serviceصياغة بيانات مُسلسَلة تستنزف موارد السيرفر أثناء فك التسلسل وتسبّب تعطّل التطبيق

11مثال عملي: Pickle Deserialization

Pickle موديول Python لتسلسل وفك تسلسل أوبجكتس Python — بيحوّل الأوبجكت لـ Byte Stream يمكن تخزينه أو نقله، والعكس عبر فك التسلسل لإعادة بناء الأوبجكت الأصلي في الذاكرة.

python — pickle serialize/deserialize
import pickle

# أوبجكت مثال:
data = {"name": "Alice", "age": 30, "roles": ["admin", "user"]}

# تسلسل الأوبجكت:
serialized_data = pickle.dumps(data)
print("Serialized Data:", serialized_data)

# فك تسلسل الأوبجكت:
deserialized_data = pickle.loads(serialized_data)
print("Deserialized Data:", deserialized_data)
خطر Pickle الحقيقي

pickle.loads() على بيانات قادمة من مصدر غير موثوق خطر جدًا — صيغة Pickle قادرة تنفّذ كود عشوائي أثناء فك التسلسل عبر دوال زي __reduce__، وده بيخليها من أخطر أشكال فك التسلسل غير الآمن في بايثون.


12فك التسلسل غير الآمن في Java

آلية التسلسل في Java

Java بتستخدم واجهة Serializable لتحديد الأوبجكتس القابلة للتسلسل، ومدعومة بشكل مدمج عبر كلاسات ObjectOutputStream وObjectInputStream. أي بيانات ثنائية تبدأ بالبايتات ac ed 00 05 غالبًا تحتوي أوبجكتس Java مُسلسَلة — ده توقيع صيغة Java Serialized القياسي.

شروط فك التسلسل غير الآمن

حالة قابلة للاستغلال في Java بتحدث لما readObject() أو دالة مشابهة تُستدعى على أوبجكت يتحكّم فيه المستخدم، وبعدين دالة على الأوبجكت ده بتُستدعى. المهاجم يقدر يصنع أوبجكت بخصائص متداخلة متعدّدة، بحيث عند استدعائها بتنفّذ شيء مختلف تمامًا — مثلًا اختطاف الدالة المُستدعاة عبر Dynamic Proxy وInvocation Handler في خصائص الأوبجكت المُسلسَل.

Gadgets وGadget Chains

كل خاصية أو دالة جزء من أوبجكت استغلال متداخل بتُسمى Gadget. بعض مكتبات Java معروفة باحتوائها Gadgets عامة تُستخدَم لبناء أوبجكتس استغلال مُسلسَلة — بتُسمى Gadget Libraries. ده مش معناه إن المكتبات دي غير آمنة بالتصميم، لكن لو فك تسلسل غير آمن حصل وهي محمَّلة جوه Classpath التطبيق، المهاجم يقدر يستغلها لبناء سلسلة Gadgets معروفة تؤدي لاستغلال ناجح. أشهر مثال: CommonsCollections (الإصدارات 1-6).

Ysoserial

أداة بـ Java مصمَّمة لتوليد حمولات مُسلسَلة خبيثة لاستغلال ثغرات فك التسلسل غير الآمن — بتستغل ثغرات معروفة في مكتبات Java شهيرة (Apache Commons Collections، Spring، وغيرها) لصنع حمولات تنفّذ أوامر عشوائية أثناء فك التسلسل.

ysoserial — generate malicious payload
java -jar ysoserial.jar CommonsCollections1 "whoami" > payload.ser

# الحمولة الناتجة بتتبعت للتطبيق الهدف عبر Cookies أو طلبات HTTP أو ملفات
# لما التطبيق يفكّ تسلسل الحمولة، الأمر "whoami" بيتنفّذ على السيرفر

13فك التسلسل غير الآمن في PHP

صياغة تسلسل PHP

دالة serialize() بتحوّل أوبجكت أو مصفوفة أو قيمة PHP لسلسلة نصية، ودالة unserialize() بتعكس العملية. الصياغة العامة:

php serialization syntax
O:<length>:"<class_name>":<num_properties>:{<property_name>;<property_value>;}

# مثال فعلي لكلاس User بخاصيتين:
O:4:"User":2:{s:4:"name";s:5:"Alice";s:4:"role";s:5:"admin";}
# O = Object | 4 = طول اسم الكلاس | "User" = اسم الكلاس | 2 = عدد الخصائص
# s:4:"name" = اسم الخاصية (نص بطول 4) | s:5:"Alice" = القيمة (نص بطول 5)

Magic Methods الحرجة في فك التسلسل

الدالةمتى تُستدعى
__wakeup()تلقائيًا أثناء فك التسلسل — غالبًا لإعادة تهيئة خصائص الأوبجكت
__destruct()عند تدمير الأوبجكت (مثلًا في نهاية السكريبت)
__toString()لما الأوبجكت يُعامَل كنص
__sleep()أثناء التسلسل — لتنظيف أو تجهيز خصائص الأوبجكت
__call()عند استدعاء دالة غير مُعرَّفة
كيف يُستغَل

المهاجمون بيستغلوا الـ Magic Methods بزرع منطق خبيث جوه الحمولة المُسلسَلة — لما التطبيق يفكّ تسلسل الحمولة، دوال زي __wakeup() أو __destruct() بتتنفّذ تلقائيًا بدون أي تدخّل إضافي من المهاجم.

PHP Object Injection — مثال عملي

php object injection — vulnerable code
<?php
class User {
    public $name;
    public $role;
    public function __destruct() {
        if ($this->role === "admin") {
            echo "Access Granted! Admin privileges.";
        }
    }
}
if (isset($_GET['data'])) {
    $data = $_GET['data'];
    $user = unserialize($data); // عرضة للاستغلال
}
?>
exploit — crafted payload via get request
# المهاجم بيصنع حمولة مُسلسَلة:
# O:4:"User":2:{s:4:"name";s:8:"EvilUser";s:4:"role";s:5:"admin";}

# ويبعتها عبر GET:
http://example.com/vuln.php?data=O:4:"User":2:{s:4:"name";s:8:"EvilUser";s:4:"role";s:5:"admin";}

# unserialize() بيعيد بناء الأوبجكت
# __destruct() بيتنفّذ تلقائيًا → "Access Granted! Admin privileges."

--سلسلة هجوم متكاملة: من SSRF إلى RCE

استطلاع نقطة الدخولEndpoint يجلب روابطاستغلال SSRFMetadata / Localhostالوصول لـ API داخليخدمة غير مكشوفةتصعيد / RCEبيانات اعتماد / فك تسلسل
SSRF نادرًا ما يكون هجوم مستقل — غالبًا نقطة دخول لسلسلة هجوم أعمق

--Cheat Sheet مرجعي

أهداف SSRF شائعة

common ssrf targets
http://localhost
http://127.0.0.1
http://169.254.169.254/latest/meta-data/        # AWS metadata
http://metadata.google.internal/computeMetadata/v1/  # GCP metadata
file:///etc/passwd
http://[::1]/                                    # IPv6 localhost bypass

أوامر Ysoserial سريعة

quick reference
java -jar ysoserial.jar CommonsCollections1 "id" > payload.ser
java -jar ysoserial.jar CommonsCollections5 "whoami" > payload.ser
java -jar ysoserial.jar Spring1 "touch /tmp/pwned" > payload.ser

PHP Magic Methods لفحصها أثناء الاختبار

Quick Wins — أسرع المسارات في هجمات Server-Side

#التحققالطريقةالنتيجة المحتملة
1فيه وظيفة بتجلب صورة أو محتوى من رابط يحدّده المستخدم؟تعديل المعامل لـ localhostSSRF أساسي
2التطبيق مستضاف على AWS/GCP/Azure؟طلب نقطة Metadata السحابيةتسريب بيانات اعتماد IAM
3كوكي أو باراميتر يبدأ ببايتات ac ed 00 05؟فحص Hex للقيمةJava Serialized Object
4كوكي أو باراميتر يبدأ بـ O: أو a:؟فحص الصياغةPHP Serialized Object
5فك تسلسل Python عبر Pickle على مدخل مستخدم؟فحص استخدام pickle.loads()RCE محتمل عبر __reduce__

الخلاصة العامة للموديول

الموديول ده غطّى هجمات جهة السيرفر بعمق — بدايةً من فهم بنية تطبيقات الويب الحديثة وطبقاتها، مرورًا بـ SSRF بكل أنواعه وتشريحه الكامل، ووصولًا لاستغلال فك التسلسل غير الآمن عبر Python وJava وPHP.

$ cat ./ewptx_module06_summary.txt

الفكرة الجوهرية للموديول: هجمات جهة السيرفر كلها بتستغل نفس الثغرة الجوهرية — ثقة ضمنية غير مُتحقَّق منها. سواء كانت ثقة في رابط يقدّمه المستخدم (SSRF) أو ثقة في بيانات مُسلسَلة قادمة من خارج التطبيق (Insecure Deserialization)، المبدأ واحد: السيرفر بيفترض إن اللي جاله شرعي بدون ما يتحقّق فعليًا.

Professional Mindset

قبل ما تفترض إن ثغرة SSRF أو فك تسلسل "محدودة التأثير"، افحص دايمًا إيه اللي ممكن توصله من خلالها — خدمات داخلية، Metadata سحابية، أو مكتبات فك تسلسل محمَّلة جوه Classpath التطبيق. أعظم تأثير في هجمات Server-Side بييجي من ربط الثغرة بسلسلة هجوم أكبر، مش من استغلالها بمعزل عن السياق.


نهاية نوتس الموديول السادس — Server-Side Attacks (eWPTXv3)