يعمل كل تطبيق على شكل 4 حاويات Docker موزعة بموازنة التحميل خلف مجموعات nginx upstream، ويمكن الوصول إليها عبر الوكيل العكسي nginx على الجهاز الافتراضي. تضمن الجلسات اللاصقة توجيهاً متسقاً للتطبيقات ذات الحالة (Juice Shop وDVWA وVAmPI وCSD Demo). جميع التطبيقات قابلة للاختراق عن قصد وصُممت لاختبار الأمان.
استبدل <ORIGIN> بـ http://<PUBLIC_IP> في جميع الأمثلة أدناه. بعد النشر عبر Terraform، احصل على عنوان IP بالأمر terraform output -raw public_ip.
المسار التطبيق طريقة HTTP الاستجابة المتوقعة /صفحة الهبوط GET 200 HTML مع روابط لجميع التطبيقات /healthفحص الصحة GET 200 JSON {"status":"healthy","component":"origin-server",...} /juice-shop/Juice Shop GET 200 HTML (Angular SPA، ~75 KB) /juice-shop/rest/products/search?q=Juice Shop API GET 200 JSON {"status":"success","data":[...]} (36 منتجاً) /dvwa/DVWA GET 302 إعادة توجيه إلى /dvwa/login.php /dvwa/login.phpتسجيل الدخول إلى DVWA GET 200 HTML نموذج تسجيل الدخول /dvwa/setup.phpإعداد DVWA GET 200 HTML (تهيئة قاعدة البيانات عند التشغيل الأول) /vampi/VAmPI GET 200 HTML (توثيق API) /vampi/users/v1VAmPI API GET 200 JSON {"users":[...]} /vampi/users/v1/registerVAmPI API POST 200 JSON {"status":"success",...} /vampi/users/v1/loginVAmPI API POST 200 JSON {"auth_token":"...","status":"success"} /httpbin/gethttpbin GET 200 JSON مع تفاصيل الطلب /httpbin/posthttpbin POST 200 JSON مع البيانات المُرسلة /httpbin/headershttpbin GET 200 JSON {"headers":{...}} /httpbin/status/:codehttpbin GET يُعيد كود حالة HTTP المحدد /whoami/whoami GET 200 نص عادي يتضمن اسم المضيف وعنوان IP وجميع الترويسات /csd-demo/CSD Demo GET 200 HTML نموذج الدفع مع لوحة الهجوم /csd-demo/dashboardعرض المهاجم في CSD GET 200 HTML يعرض البيانات المُستخرجة /csd-demo/healthصحة CSD GET 200 JSON {"status":"healthy","component":"csd-demo",...} /csd-demo/exfil/logسجل استخراج CSD GET 200 JSON مصفوفة من البيانات المُلتقطة /dvga/DVGA GraphiQL GET 200 HTML (GraphiQL IDE) /dvga/graphqlDVGA GraphQL API POST 200 JSON استجابة GraphQL /restaurant/RESTaurant GET 200 (إعادة توجيه إلى التوثيق) /restaurant/docsRESTaurant Swagger GET 200 HTML (FastAPI Swagger UI) /restaurant/openapi.jsonRESTaurant OpenAPI GET 200 JSON مواصفة OpenAPI http://<PUBLIC_IP>:8888crAPI GET 200 HTML (SPA) http://<PUBLIC_IP>:8888/identity/api/auth/signupتسجيل crAPI POST 200 JSON http://<PUBLIC_IP>:8888/identity/api/auth/loginتسجيل الدخول إلى crAPI POST 200 JSON {"token":"..."}
المسار /juice-shop/الصورة bkimminich/juice-shop:latestالنسخ 4 (المنافذ 3001-3004)، لاصقة عبر hash $cookie_token، ذاكرة تخزين مؤقت للوكيل (مدة صلاحية 60 ثانية) الموارد 2 CPU / 1 GiB RAM لكل نسخة الإطار Node.js / Angular المشروع owasp.org/www-project-juice-shop
OWASP Juice Shop هو تطبيق الويب القابل للاختراق الأكثر حداثةً وصيانةً نشطة. يغطي OWASP Top 10 بالكامل مع أكثر من 100 تحدٍّ ضمن تطبيق تجارة إلكترونية واقعي.
السيناريو الفئة ناقل الهجوم تجاوز تسجيل الدخول عبر SQL Injection جدار حماية تطبيقات الويب (WAF) ' OR 1=1-- في حقل البريد الإلكتروني لتسجيل الدخولReflected XSS جدار حماية تطبيقات الويب (WAF)، الدفاع من جهة العميل حقن سكريبت عبر معامل البحث DOM-based XSS الدفاع من جهة العميل حمولة في جزء URL المصادقة المعطوبة جدار حماية تطبيقات الويب (WAF) هجوم القوة الغاشمة على تسجيل الدخول، والتلاعب بـ JWT إساءة استخدام API أمان API وصول غير مصرح به إلى نقاط النهاية /api/ كشف البيانات الحساسة أمان API الوصول إلى بيانات المستخدم دون تصريح CSRF جدار حماية تطبيقات الويب (WAF) تزوير الطلبات عبر المواقع على تغييرات الملف الشخصي
curl -s " http://<PUBLIC_IP>/juice-shop/ " -o /dev/null -w " %{http_code} "
المسار /dvwa/الصورة مخصصة dvwa-fpm:latest (php-fpm + nginx، مبنية من ghcr.io/digininja/dvwa:latest) النسخ 4 (المنافذ 8101-8104)، لاصقة عبر hash $cookie_PHPSESSID الموارد 0.5 CPU / 256 MiB RAM لكل نسخة قاعدة البيانات MariaDB 10.11 مشتركة (حاوية dvwa-db، 1 CPU / 768 MiB) الإطار PHP 8 / php-fpm / MariaDB بيانات الاعتماد admin / password
DVWA هو المعيار الصناعي لاختبار جدار حماية تطبيقات الويب (WAF). يتميز بمستويات أمان قابلة للضبط (منخفض، متوسط، عالٍ، مستحيل) تضيف تدريجياً التحقق من المدخلات وترميز المخرجات.
السيناريو الفئة مستوى الأمان SQL Injection جدار حماية تطبيقات الويب (WAF) منخفض: ' OR 1=1# بسيط، عالٍ: SQLi أعمى Command Injection جدار حماية تطبيقات الويب (WAF) منخفض: ; ls، عالٍ: أحرف مُصفّاة File Inclusion جدار حماية تطبيقات الويب (WAF) منخفض: اجتياز مسار مباشر، عالٍ: مُعقَّم XSS (منعكس) جدار حماية تطبيقات الويب (WAF)، الدفاع من جهة العميل منخفض: <script> أساسي، عالٍ: تجاوز بالترميز XSS (مخزّن) جدار حماية تطبيقات الويب (WAF)، الدفاع من جهة العميل منخفض: سكريبت دائم في سجل الزوار File Upload جدار حماية تطبيقات الويب (WAF) منخفض: رفع shell بـ PHP، عالٍ: تصفية الامتدادات Brute Force دفاع Bot القياسي محاولات تسجيل دخول آلية
اضبط مستوى الأمان من /dvwa/security.php بعد تسجيل الدخول:
منخفض — لا يوجد تحقق من المدخلات. تنجح جميع الهجمات. مناسب لعروض توقيعات جدار حماية تطبيقات الويب (WAF).
متوسط — تصفية أساسية. تتطلب بعض الهجمات ترميزاً أو تقنيات تجاوز.
عالٍ — تصفية قوية. تنجح فقط التقنيات المتقدمة. مناسب لإظهار قيود جدار حماية تطبيقات الويب (WAF).
مستحيل — تطبيق آمن بالكامل. يُوضّح أسلوب الترميز الدفاعي الصحيح.
يتطلب DVWA إعداد قاعدة بيانات لمرة واحدة بعد النشر الأول:
انتقل إلى http://<PUBLIC_IP>/dvwa/setup.php
انقر على Create / Reset Database
سجّل الدخول باستخدام admin / password
المسار /vampi/الصورة erev0s/vampi:latest مع نقطة دخول gunicorn (4 عمال)النسخ 4 (المنافذ 5101-5104)، لاصقة عبر ip_hash (SQLite لكل نسخة) الموارد 0.5 CPU / 512 MiB RAM لكل نسخة الإطار Python / Flask / gunicorn المشروع github.com/erev0s/VAmPI
صُمّم VAmPI خصيصاً لاختبار OWASP API Security Top 10. يوفر واجهة REST API واقعية بثغرات متعمدة. تشغّل كل نسخة gunicorn بـ 4 عمال وقاعدة بيانات SQLite خاصة بها. تضمن الجلسة اللاصقة ip_hash أن عمليات التسجيل وتسجيل الدخول من نفس IP العميل تصل دائماً إلى النسخة ذاتها.
السيناريو OWASP API Top 10 الطريقة التخويل المعطوب على مستوى الكائن (BOLA) API1 الوصول إلى بيانات مستخدمين آخرين عبر التلاعب بالمعرّفات المصادقة المعطوبة API2 معالجة رمز ضعيفة، لا تقييد للمعدل الكشف المفرط عن البيانات API3 يُعيد API بيانات أكثر مما يحتاجه العميل التعيين الجماعي API6 تعديل حقول المسؤول عبر معاملات غير متوقعة SQL Injection API8 الحقن عبر معاملات API إدارة الأصول غير الملائمة API9 نقاط نهاية API غير موثّقة
curl -X POST " http://<PUBLIC_IP>/vampi/users/v1/register " \
-H " Content-Type: application/json " \
-d ' {"username":"test","password":"test123","email":"test@test.com"} '
curl -X POST " http://<PUBLIC_IP>/vampi/users/v1/login " \
-H " Content-Type: application/json " \
-d ' {"username":"test","password":"test123"} '
# سرد المستخدمين (كشف مفرط عن البيانات)
curl " http://<PUBLIC_IP>/vampi/users/v1 "
المسار /httpbin/الصورة kennethreitz/httpbin:latest مع تجاوز CMD لـ gunicorn (-w 4 -k gevent --timeout 30)النسخ 4 (المنافذ 8201-8204)، round-robin (عديم الحالة) الموارد 0.5 CPU / 256 MiB RAM لكل نسخة الإطار Python / Flask / gunicorn + gevent المشروع httpbin.org
httpbin هي خدمة بسيطة للطلبات/الاستجابات HTTP مفيدة لعروض API الأساسية، واختبار ترويسات الطلبات، والتحقق من سلوك الوكيل.
نقطة النهاية الغرض /httpbin/getيُعيد بيانات طلب GET (الترويسات، المعاملات، المصدر) /httpbin/postيُعيد بيانات طلب POST (الجسم، النموذج، JSON) /httpbin/headersيُعيد ترويسات الطلب /httpbin/ipيُعيد عنوان IP المصدر /httpbin/user-agentيُعيد ترويسة User-Agent /httpbin/status/:codeيُعيد كود حالة HTTP المحدد /httpbin/delay/:secondsيؤخّر الاستجابة لـ N ثانية /httpbin/anythingيُعيد كل ما يُمرَّر في الطلب
# تحقق من الترويسات التي يراها الخادم المصدر (مفيد للتحقق من حقن ترويسات F5 XC)
curl -s " http://<PUBLIC_IP>/httpbin/headers " | jq .
# اختبار كود حالة HTTP محدد
curl -s -o /dev/null -w " %{http_code} " " http://<PUBLIC_IP>/httpbin/status/403 "
المسار /whoami/الصورة traefik/whoami:latestالنسخ 4 (المنافذ 8082-8085)، round-robin (عديم الحالة) الموارد 0.25 CPU / 64 MiB RAM لكل نسخة الإطار Go المشروع github.com/traefik/whoami
whoami هو خادم صدى الطلبات الخفيف الوزن من Traefik. يعرض كل تفاصيل طلب HTTP الوارد كما يراها خادم المصدر — اسم المضيف، وعناوين IP، وجميع الترويسات، والطريقة، وعنوان URL. وهو أهم أداة تشخيصية واحدة عند التحقق من أن F5 XC يحقن الترويسات الصحيحة.
حالة الاستخدام ما يجب البحث عنه التحقق من حقن ترويسات F5 XC ترويسات X-Forwarded-For وTrue-Client-IP وX-Volterra-* تأكيد رؤية IP العميل X-Real-IP مقابل RemoteAddrتصحيح الإيجابيات الكاذبة لجدار حماية تطبيقات الويب (WAF) مقارنة ترويسات الطلب قبل F5 XC وبعده التحقق من وسم دفاع Bot ترويسات X-Volterra-Bot-Type وX-Volterra-Bot-Verified التحقق من إنهاء TLS يُظهر X-Forwarded-Proto قيمة https عند إنهاء TLS في F5 XC
# طلب أساسي -- انظر ما يتلقاه الخادم المصدر
curl " http://<PUBLIC_IP>/whoami/ "
# محاكاة طلب عبر F5 XC (مع ترويسات محقونة)
curl " http://<PUBLIC_IP>/whoami/ " \
-H " X-Forwarded-For: 203.0.113.50 " \
-H " True-Client-IP: 203.0.113.50 " \
-H " X-Forwarded-Proto: https "
مثال على الإخراج:
RemoteAddr: 172.17.0.1:55118
True-Client-Ip: 203.0.113.50
X-Forwarded-For: 203.0.113.50, 10.0.0.1
X-Real-Ip: 104.219.105.84
صُمّم DVGA خصيصاً لاختبار ثغرات GraphQL المحددة. يوفر GraphiQL IDE على /dvga/ لاستكشاف الاستعلامات بشكل تفاعلي، ونقطة نهاية GraphQL API على /dvga/graphql. تستخدم كل نسخة قاعدة بيانات SQLite خاصة بها، لذا تضمن الجلسات اللاصقة ip_hash حالة متسقة.
السيناريو الفئة ناقل الهجوم GraphQL Injection أمان API استعلامات خبيثة عبر استيفاء السلاسل رفض الخدمة أمان API استعلامات متداخلة بعمق، استعلامات دفعية، استنزاف الموارد تجاوز التخويل أمان API الوصول إلى بيانات غير مصرح بها عبر GraphQL الكشف عن المعلومات أمان API استعلامات الاستبطان التي تكشف تفاصيل المخطط هجوم الدُّفعات أمان API عمليات متعددة في طلب واحد
# واجهة GraphiQL (IDE تفاعلي)
curl -sf " http://<PUBLIC_IP>/dvga/ " -o /dev/null -w " %{http_code} "
# استعلام الاستبطان -- تعداد المخطط الكامل
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"{ __schema { types { name fields { name } } } }"} '
# سرد المقاطع (مثال استعلام)
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"{ pastes { title content } }"} '
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"mutation { createPaste(title:\"test\", content:\"hello\", public:true) { paste { title } } }"} '
المسار /restaurant/الصورة بناء مخصص من theowni/Damn-Vulnerable-RESTaurant-API-Game النسخ 4 (المنافذ 8301-8304)، round-robin (PostgreSQL مشترك) الموارد 0.5 CPU / 256 MiB RAM لكل نسخة قاعدة البيانات PostgreSQL 15.4 مشترك (حاوية restaurant-db، 0.5 CPU / 512 MiB) الإطار Python / FastAPI / PostgreSQL بيانات الاعتماد admin / password (PostgreSQL)المشروع github.com/theowni/Damn-Vulnerable-RESTaurant-API-Game
RESTaurant هي واجهة REST API قابلة للاختراق بأسلوب اللعبة، وتغطي OWASP API Security Top 10 لعام 2023. تستخدم FastAPI مع توثيق Swagger UI التلقائي على /restaurant/docs. تشترك جميع النسخ الأربع في قاعدة بيانات PostgreSQL واحدة، لذا تعمل موازنة التحميل round-robin دون الحاجة إلى جلسات لاصقة.
السيناريو OWASP API Top 10 2023 الطريقة التخويل المعطوب على مستوى الكائن (BOLA) API1 الوصول إلى طلبات مستخدمين آخرين عبر التلاعب بالمعرّفات المصادقة المعطوبة API2 معالجة رمز ضعيفة، حشو بيانات الاعتماد التخويل المعطوب على مستوى خاصية الكائن API3 التعيين الجماعي على حقول ملف المستخدم استهلاك الموارد غير المقيّد API4 لا تقييد للمعدل على نقاط النهاية التخويل المعطوب على مستوى الوظيفة (BFLA) API5 الوصول إلى نقاط نهاية المسؤول كمستخدم عادي تزوير الطلبات من جانب الخادم (SSRF) API7 التلاعب بطلبات URL من جانب الخادم سوء تهيئة الأمان API8 رسائل خطأ مفصّلة، بيانات اعتماد افتراضية
curl -sf " http://<PUBLIC_IP>/restaurant/docs " -o /dev/null -w " %{http_code} "
curl -s " http://<PUBLIC_IP>/restaurant/openapi.json " | jq .info
# BOLA -- الوصول إلى طلب مستخدم آخر (بعد المصادقة)
curl -s " http://<PUBLIC_IP>/restaurant/orders/1 " \
-H " Authorization: Bearer <token> "
# BFLA -- محاولة إجراء إداري كمستخدم عادي
curl -s -X POST " http://<PUBLIC_IP>/restaurant/admin/users " \
-H " Authorization: Bearer <user_token> " \
-H " Content-Type: application/json "
المنفذ 8888 (مخصص — بدون بادئة مسار)الصور crapi/crapi-web، crapi/crapi-identity، crapi/crapi-community، crapi/crapi-workshop، PostgreSQL، MongoDB، MailHogالنسخ 7 خدمات مصغّرة (نسخة واحدة لكل منها) الموارد ~3.0 CPU / ~2.0 GiB RAM إجمالاً الإطار React SPA + خدمات مصغّرة Java/Go/Python المشروع github.com/OWASP/crAPI
crAPI هو المشروع الرائد لـ OWASP لاختبار أمان API. يعمل على شكل 7 خدمات مصغّرة على منفذ مخصص (8888) لأن React SPA يُرمّز مسارات API الخاصة به بشكل ثابت ولا يمكن تقديمه خلف بادئة مسار. تسمح NSG بحركة المرور الواردة على المنفذ 8888.
يلتقط MailHog جميع رسائل البريد الإلكتروني المُرسلة بواسطة crAPI (التحقق من الحساب، إعادة تعيين كلمة المرور). يمكن الوصول إلى MailHog عبر نفق SSH على المنفذ 18025.
الفئة الثغرات BOLA (التخويل المعطوب على مستوى الكائن) الوصول إلى مركبات المستخدمين الآخرين وطلباتهم وتقاريرهم BFLA (التخويل المعطوب على مستوى الوظيفة) التصعيد إلى مسؤول، والوصول إلى نقاط النهاية المقيّدة التعيين الجماعي تعديل الحقول المحمية (الدور، الرصيد) عبر API SSRF (تزوير الطلبات من جانب الخادم) التلاعب بجلب URL من جانب الخادم التلاعب بـ JWT تزوير رموز JWT أو تعديلها لتصعيد الصلاحيات NoSQL Injection حقن استعلامات في نقاط النهاية المدعومة بـ MongoDB الكشف المفرط عن البيانات يُعيد API بيانات حساسة للمستخدم
curl -sf " http://<PUBLIC_IP>:8888 " -o /dev/null -w " %{http_code} "
curl -s -X POST " http://<PUBLIC_IP>:8888/identity/api/auth/signup " \
-H " Content-Type: application/json " \
-d ' {"name":"Test User","email":"test@example.com","number":"1234567890","password":"Test1234!"} '
curl -s -X POST " http://<PUBLIC_IP>:8888/identity/api/auth/login " \
-H " Content-Type: application/json " \
-d ' {"email":"test@example.com","password":"Test1234!"} '
# الوصول إلى MailHog (عبر نفق SSH للتحقق من البريد الإلكتروني)
# ssh -L 18025:localhost:18025 azureuser@<PUBLIC_IP>
# ثم افتح http://localhost:18025 في متصفحك
Port 8888 -> crapi-web (React SPA + nginx)
-> crapi-identity (Java, user auth, JWT)
-> crapi-community (Go, forums, posts)
-> crapi-workshop (Python, vehicle service)
-> crapi-postgres (PostgreSQL)
-> crapi-mailhog (email capture, port 18025)
حالة استخدام العرض التوضيحي التطبيق الأساسي التطبيق الثانوي جدار حماية تطبيقات الويب (WAF) — SQL Injection DVWA Juice Shop جدار حماية تطبيقات الويب (WAF) — XSS DVWA Juice Shop جدار حماية تطبيقات الويب (WAF) — Command Injection DVWA — أمان API — BOLA VAmPI — أمان API — تجاوز المصادقة VAmPI Juice Shop أمان API — كشف البيانات VAmPI httpbin دفاع Bot القياسي — القوة الغاشمة DVWA Juice Shop دفاع Bot القياسي — الاستخراج Juice Shop — الدفاع من جهة العميل — DOM XSS Juice Shop — الدفاع من جهة العميل — XSS المخزّن DVWA Juice Shop الدفاع من جهة العميل — ناشل بطاقات CSD Demo — الدفاع من جهة العميل — اختطاف النماذج CSD Demo — الدفاع من جهة العميل — مسجّل لوحة المفاتيح CSD Demo — الدفاع من جهة العميل — تعدين العملات المشفرة CSD Demo — الدفاع من جهة العميل — اختطاف DOM CSD Demo — أمان API — حقن GraphQL DVGA — أمان API — رفض خدمة GraphQL DVGA — أمان API — OWASP API Top 10 2023 RESTaurant crAPI أمان API — BFLA RESTaurant crAPI أمان API — التعيين الجماعي crAPI RESTaurant أمان API — SSRF crAPI RESTaurant أمان API — التلاعب بـ JWT crAPI — أمان API — حقن NoSQL crAPI — اختبار الاتصال الأساسي httpbin — تشخيص الطلبات whoami httpbin التحقق من حقن الترويسات whoami —