
مختبر محلي لـ GeoServer/PostGIS يعيد إنتاج حقن SQL في OGC Filter (CVE-2023-25157/25158) مع أوضاع اختبار A/B للنسخ المصابة والمصححة والمخففة.
يستخدم هذا المختبر GeoServer/PostGIS لدراسة حقن SQL في OGC Filter ضمن بيئة محلية، مع فصل واضح بين وضع المشغّل/الإعداد ووضع المهاجم.
GeoServer 2.22.0 يتضمن GeoTools المصابة. GeoServer 2.22.2 يتضمن GeoTools المُرقّعة. يحافظ المختبر على نفس المخطط/الطلب لاختبار A/B للإصدار، والتخفيف، وحدود الصلاحيات.
| الوضع | السطح | الغرض |
|---|
| Setup/operator REST | حاوية cve-operator الداخلية | إعداد REST، والتحقق، ومراجعة سجلات الواجهة الخلفية |
| بوابة واحدة | 127.0.0.1:8889 | منفذ واحد لواجهة المشغّل ومسارات OWS |
| Operator Web UI | 127.0.0.1:8889/geoserver/web/ | واجهة GeoServer للمشغّل؛ مع Basic Auth proxy |
| Attacker vulnerable | 127.0.0.1:8889/vuln/geoserver/ows | WFS/OWS مصاب، وأخطاء قاعدة البيانات تظهر في الاستجابة |
| Attacker patched | 127.0.0.1:8889/patched/geoserver/ows | GeoServer 2.22.2 / GeoTools 28.2 |
| Attacker realistic | 127.0.0.1:8889/realistic/geoserver/ows | WFS/OWS مصاب لكن البوابة تحذف تفاصيل الأخطاء |
| Mitigation function | 127.0.0.1:8889/mit-functions/geoserver/ows | GeoServer 2.22.0، encode functions=false |
| Mitigation FeatureId | 127.0.0.1:8889/mit-featureid/geoserver/ows | GeoServer 2.22.0، preparedStatements=true |
لا ينشر PostgreSQL/PostGIS منفذاً إلى المضيف. لا ينشر GeoServer المنفذ 8080 مباشرة إلى المضيف؛ يرى المضيف فقط cve-gateway على 127.0.0.1:8889. حاوية cve-attacker موجودة فقط في attacker-net؛ ليس لديها مسار إلى PostgreSQL أو خدمة GeoServer الداخلية. يمر إعداد REST عبر الحاوية الداخلية cve-operator على geoserver-net.
افتح في المتصفح:
http://127.0.0.1:8889/geoserver/web/
تسجيل الدخول بطبقتين:
operator / operator_labadmin / geoserverكل شيء يمر عبر نفس البوابة 8889، دون الحاجة لتذكر منافذ متعددة. يمكن لـ Burp الاحتفاظ بالبروكسي الافتراضي 127.0.0.1:8080.
.\lab.ps1 reset all
.\lab.ps1 validate
powershell -ExecutionPolicy Bypass -File .\verify-lab.ps1
powershell -ExecutionPolicy Bypass -File .\negative-controls.ps1
powershell -ExecutionPolicy Bypass -File .\attack-chain.ps1
أوامر الإدارة:
.\lab.ps1 start vulnerable
.\lab.ps1 start patched
.\lab.ps1 start mitigated
.\lab.ps1 start worstcase
.\lab.ps1 reset all
.\lab.ps1 stop
.\lab.ps1 status
جداول البذور:
cities: مفتاح أساسي صحيح، عمود name نصي، يُستخدم لـ strStartsWith/strEndsWith.sensors_text: مفتاح أساسي نصي، يُستخدم لحقن FeatureId.sensors_int: مفتاح أساسي صحيح، ضابط سلبي لـ FeatureId.events: طبقة بحث JSONB.internal_assets: غير منشور، يحتوي على LAB-CANARY-<UUID> جديد بعد كل إعادة تعيين.local_points: ضابط سلبي shapefile غير JDBC.الأدوار:
geoserver_readonly: CONNECT، USAGE على المخطط، SELECT فقط على الجداول المنشورة.geoserver_impact: SELECT إضافي على internal_assets لتوضيح مستخدم قاعدة بيانات التطبيق عبر صلاحيات واسعة.geoserver_worstcase: ملف تعريف منفصل، يمتلك pg_read_server_files لقراءة ملف canary المزيف /lab/flag.txt.ينفذ attack-chain.ps1 ما يلي:
GetCapabilities.DescribeFeatureType.encode functions=false.preparedStatements=true.internal_assets، وفرع impact يسرب canary، وpatched/realistic لا يكشفان canary.يُحفظ الدليل في evidence/attack-chain-*. يحتفظ المجلد الحالي فقط بأحدث دليل ناجح لتجنب الفوضى.
هذا الملف ليس ضمن السيناريو الرئيسي:
.\lab.ps1 start worstcase
powershell -ExecutionPolicy Bypass -File .\worstcase-demo.ps1
يقرأ فقط ملف canary المزيف /lab/flag.txt، ولا يقرأ /etc/passwd، ولا يفرّغ التجزئات، ولا يكسر كلمات المرور.