
SQL इंजेक्शन शोषण उपकरण
#BBQSQL# एक ब्लाइंड SQL इंजेक्शन शोषण उपकरण
ब्लाइंड SQL इंजेक्शन का शोषण करना एक परेशानी हो सकती है। जब उपलब्ध उपकरण काम करते हैं, तो वे अच्छा काम करते हैं, लेकिन जब वे काम नहीं करते, तो आपको कुछ कस्टम लिखना पड़ता है। यह समय लेने वाला और थकाऊ है। BBQSQL उन समस्याओं को हल करने में आपकी मदद कर सकता है।
BBQSQL एक ब्लाइंड SQL इंजेक्शन फ्रेमवर्क है जो Python में लिखा गया है। यह तब अत्यंत उपयोगी होता है जब ट्रिकी SQL इंजेक्शन कमजोरियों पर हमला किया जाता है। BBQSQL एक अर्ध-स्वचालित उपकरण भी है, जो उन SQL इंजेक्शन खोजों के लिए काफी अनुकूलन की अनुमति देता है जिन्हें ट्रिगर करना कठिन होता है। यह उपकरण डेटाबेस-अज्ञेयवादी और अत्यंत बहुमुखी है। इसके अलावा, इसमें एक सहज UI है जो हमलों को सेट करना बहुत आसान बनाता है। Python gevent भी लागू किया गया है, जो BBQSQL को अत्यंत तेज़ बनाता है।
हमने उपकरण को इस प्रकार लिखने का प्रयास किया है कि UI में हमला सेट करते समय यह अत्यधिक स्वयं-व्याख्यात्मक हो। हालांकि, पूर्णता के लिए हमने एक विस्तृत Readme शामिल किया है जो आपको प्रत्येक कॉन्फ़िगरेशन विकल्प की बारीकियों पर अतिरिक्त जानकारी प्रदान करेगा। एक बात ध्यान देने योग्य है कि UI में प्रत्येक कॉन्फ़िगरेशन विकल्प के साथ एक विवरण जुड़ा हुआ है, इसलिए यदि आप इस पृष्ठ को पढ़े बिना उपकरण चालू करने का निर्णय लेते हैं, तो आप एक हमले के माध्यम से अपना रास्ता निकाल सकते हैं।
अन्य SQL इंजेक्शन उपकरणों की तरह, आप कुछ अनुरोध जानकारी प्रदान करते हैं।
निम्नलिखित सामान्य जानकारी प्रदान करनी होगी:
फिर निर्दिष्ट करें कि इंजेक्शन कहाँ जा रहा है और हम किस सिंटैक्स को इंजेक्ट कर रहे हैं। विवरण के लिए आगे पढ़ें।
यह सीधा होना चाहिए, लेकिन क्या वास्तव में है। निम्नलिखित चलाने का प्रयास करें:
sudo pip install bbqsql
यदि यह आपके लिए काम नहीं करता है, तो आप स्रोत से स्थापित कर सकते हैं। उपकरण को gevent, requests की आवश्यकता है।
मेनू में आप BBQSQL विकल्पों के लिए एक स्थान देखेंगे। यहाँ आप निम्नलिखित विकल्प निर्दिष्ट करते हैं:
इसका नीचे विस्तार से वर्णन किया गया है क्वेरी सिंटैक्स अवलोकन।
एक फ़ाइल का नाम जिसमें परिणाम आउटपुट किए जाएंगे। यदि आप फ़ाइल में आउटपुट नहीं चाहते हैं तो इसे खाली छोड़ दें।
BBQSQL ब्लाइंड SQL इंजेक्शन हमला करते समय दो तकनीकों का उपयोग करता है। पहली और डिफ़ॉल्ट तकनीक binary_search है। अधिक जानकारी के लिए Wikipedia देखें।
दूसरी तकनीक जिसका आप उपयोग कर सकते हैं वह frequency_search है। फ्रीक्वेंसी सर्चिंग अंग्रेजी भाषा के विश्लेषण पर आधारित है ताकि यह निर्धारित किया जा सके कि कोई अक्षर कितनी बार आएगा। यह खोज विधि गैर-एन्ट्रॉपिक डेटा के खिलाफ बहुत तेज़ है, लेकिन गैर-अंग्रेजी या अस्पष्ट डेटा के खिलाफ धीमी हो सकती है।
आप इस पैरामीटर के मान के रूप में binary_search या frequency_search निर्दिष्ट कर सकते हैं।
यह उस प्रकार के SQL इंजेक्शन को निर्दिष्ट करता है जिसे आपने खोजा है। यहाँ आप सेट कर सकते हैं कि सही/गलत निर्धारित करने के लिए bbqsql को HTTP प्रतिक्रिया की किस विशेषता को देखना चाहिए।
आप निर्दिष्ट कर सकते हैं: status_code, url, time, size, text, content, encoding, cookies, headers, या history
यदि आपने SQL इंजेक्शन की पहचान की है जिसके परिणामस्वरूप एक अलग सर्वर स्थिति कोड होता है, तो यहाँ 'status_code' सेट करें। यदि कुकी अलग है, तो 'cookie' सेट करें। यदि प्रतिक्रिया का आकार अलग है, तो 'size' सेट करें। आप समझ गए होंगे।
समवर्तीता Python में gevent लाइब्रेरी पर आधारित है। कार्यात्मक रूप से, यह थ्रेडिंग की तरह दिखता है लेकिन यह कैसे काम करता है इसकी बारीकियों को हमारे DefCon वार्ता में देखा जा सकता है [लिंक यहाँ डालें]। यह सेटिंग हमले को चलाने के लिए समवर्तीता की मात्रा को नियंत्रित करती है। यह अनुरोधों को थ्रॉटल करने और हमले के समय को तेज़ करने के लिए उपयोगी है। वास्तव में उच्च प्रदर्शन वाले वेब-सर्वर जैसे nginx के लिए, हम समवर्तीता को 75 पर सेट करने में सक्षम रहे हैं। डिफ़ॉल्ट रूप से इसे '30' पर सेट किया गया है।
यदि आप किसी SQL इंजेक्शन कमजोरी पर ठोकर खाते हैं जिसमें कुछ अजीब quirks हैं (जैसे कि कुछ वर्ण शामिल नहीं किए जा सकते या ASCII/CHAR जैसे फ़ंक्शन काम नहीं करते), तो आपने शायद अपने आप को एक स्क्रिप्ट लिखते हुए पाया होगा जिसमें आपका कस्टम इंजेक्शन सिंटैक्स है। BBQSQL स्क्रिप्टिंग भाग को हटा देता है और आपको अपने कस्टम क्वेरी सिंटैक्स को चिपकाने और आसानी से शोषण करने का एक तरीका प्रदान करता है।
क्वेरी इनपुट वह जगह है जहाँ आप डेटाबेस से जानकारी निकालने के लिए उपयोग की जाने वाली अपनी क्वेरी का निर्माण करेंगे। यह मान लिया गया है कि आपने पहले से ही एक कमजोर पैरामीटर पर SQL इंजेक्शन की पहचान की है, और एक क्वेरी का परीक्षण किया है जो सफल है।
नीचे एक उदाहरण क्वेरी है जिसका उपयोग आप अपनी क्वेरी बनाने के लिए कर सकते हैं।
इस उदाहरण में, हमलावर डेटाबेस संस्करण का चयन करना चाहता है:
vulnerable_parameter'; if(ASCII(SUBSTRING((SELECT @@version LIMIT 1 OFFSET ${row_index}) , ${char_index} ,1))) ${comparator:>}ASCII(${char_val}) WAITFOR DELAY '0\:0\:0${sleep}'; --
क्वेरी सिंटैक्स प्लेसहोल्डर पर आधारित है जो BBQSQL को बताते हैं कि हमले को कैसे निष्पादित किया जाए।
हमले के लिए काम करने के लिए आपको निम्नलिखित प्लेसहोल्डर जानकारी प्रदान करनी होगी। एक बार जब आप इन्हें अपनी क्वेरी में डाल देते हैं, तो bbqSQL बाकी काम करेगा:
${row_index}: यह bbqSQL को बताता है कि यहाँ पंक्तियों को iterrate करना है। चूंकि हम LIMIT का उपयोग कर रहे हैं, हम ${row_index} मान के आधार पर n संख्या में पंक्तियाँ देख सकते हैं।
${char_index}: यह bbqSQL को बताता है कि उप-चयन से कौन सा वर्ण क्वेरी करना है।
${char_val}: यह bbqSQL को बताता है कि परिणाम को मान्य करने के लिए उप-चयन से परिणामों की तुलना कहाँ करनी है।
${comparator}: यह है कि आप BBQSQL को कैसे बताते हैं कि प्रतिक्रियाओं की तुलना करके यह निर्धारित करें कि परिणाम सत्य है या नहीं। डिफ़ॉल्ट रूप से, > प्रतीक का उपयोग किया जाता है।
${sleep}: यह वैकल्पिक है लेकिन bbqSQL को बताता है कि समय-आधारित SQL इंजेक्शन करते समय सोने के लिए सेकंड की संख्या कहाँ डालनी है।
इन सभी प्लेसहोल्डर की आवश्यकता नहीं है। उदाहरण के लिए, यदि आपने अर्ध-ब्लाइंड बूलियन-आधारित SQL इंजेक्शन की खोज की है, तो आप ${sleep} पैरामीटर को छोड़ सकते हैं।
BBQSQL में कई HTTP पैरामीटर हैं जिन्हें आप अपना हमला सेट करते समय कॉन्फ़िगर कर सकते हैं। कम से कम आपको URL प्रदान करना होगा, जहाँ आप इंजेक्शन क्वेरी चलाना चाहते हैं, और विधि। निम्नलिखित विकल्प सेट किए जा सकते हैं:
आप टेम्पलेट ${injection} का उपयोग करके निर्दिष्ट करते हैं कि इंजेक्शन क्वेरी कहाँ डाली जानी चाहिए। इंजेक्शन टेम्पलेट के बिना उपकरण को पता नहीं चलेगा कि क्वेरी कहाँ डालनी है।
अनुरोध के साथ भेजी जाने वाली फ़ाइलें प्रदान करें। मान को पथ पर सेट करें और BBQSQL फ़ाइल को खोलने/शामिल करने का ध्यान रखेगा।
अनुरोधों के साथ भेजे जाने वाले HTTP हेडर। यह एक स्ट्रिंग या शब्दकोश हो सकता है। उदाहरण के लिए:
{"User-Agent":"bbqsql"}
या
"User-Agent: bbqsql"
अनुरोध के साथ भेजी जाने वाली कुकीज़ का एक शब्दकोश या स्ट्रिंग। उदाहरण के लिए:
{"PHPSESSIONID":"123123"}
या
PHPSESSIONID=123123;JSESSIONID=foobar
एक URL निर्दिष्ट करें जिसमें अनुरोध भेजे जाने चाहिए।
यह एक बूलियन है जो निर्धारित करता है कि अनुरोध करते समय HTTP रीडायरेक्ट का पालन किया जाएगा या नहीं।
अनुरोध के लिए उपयोग किए जाने वाले HTTP प्रॉक्सी को एक शब्दकोश के रूप में निर्दिष्ट करें। उदाहरण के लिए:
{"http": "10.10.1.10:3128","https": "10.10.1.10:1080"}
अनुरोध के साथ भेजे जाने वाले पोस्ट डेटा को निर्दिष्ट करें। यह एक स्ट्रिंग या शब्दकोश हो सकता है। उदाहरण के लिए:
{"input_field":"value"}
या
input_field=value
HTTP अनुरोध के लिए विधि निर्दिष्ट करें। मान्य विधियाँ हैं
'get','options','head','post','put','patch','delete'
HTTP बुनियादी प्रमाणीकरण के लिए उपयोगकर्ता नाम और पासवर्ड का एक टपल निर्दिष्ट करें। उदाहरण के लिए:
("myusername","mypassword")
UI में अपना हमला सेट करने के बाद, आप कॉन्फ़िगरेशन फ़ाइल निर्यात कर सकते हैं। जब आप उपकरण चलाते हैं तो आपको विकल्प दिखाई देगा। निर्यात की गई कॉन्फ़िगरेशन फ़ाइल ConfigParser का उपयोग करती है, और पढ़ने में आसान है। एक उदाहरण कॉन्फ़िगरेशन फ़ाइल नीचे देखी जा सकती है:
`[Request Config] url = http://example.com/sqlivuln/index.php?username=user1&password=secret${injection} method = GET
[HTTP Config] query = ' and ASCII(SUBSTR((SELECT data FROM data LIMIT 1 OFFSET ${row_index:1}),${char_index:1},1))${comparator:>}${char_val:0} # technique = binary_search comparison_attr = size concurrency = 30`
यह उपयोगी है यदि आप किसी हमले को फिर से शुरू करने की योजना बना रहे हैं या शायद केवल क्वेरी को समायोजित करना चाहते हैं लेकिन प्रत्येक विकल्प को पुन: कॉन्फ़िगर करने की परेशानी से नहीं गुजरना चाहते।
आप कमांड लाइन या उपयोगकर्ता इंटरफ़ेस से भी एक कॉन्फ़िग आयात कर सकते हैं। कमांड लाइन से एक कॉन्फ़िग आयात करने के लिए निम्नलिखित विकल्पों के साथ bbqsl चलाएँ:
bbqsql -c config_file
जब आप कॉन्फ़िग फ़ाइल को कमांड लाइन या उपयोगकर्ता इंटरफ़ेस के माध्यम से लोड करते हैं, तो पैरामीटर पर वही मान्यता रूटीन चलाए जाते हैं ताकि यह सुनिश्चित किया जा सके कि वे मान्य हैं।
कभी-कभी आपको कुछ बहुत ही पागलपन भरा करने की आवश्यकता होती है। शायद आपको अनुरोध भेजने से पहले किसी फ़ील्ड में जाने वाले मानों को एन्क्रिप्ट करने की आवश्यकता है या शायद आपको तिहरा URL एन्कोड करने की आवश्यकता है। भले ही, ये स्थितियाँ अन्य उपकरणों का उपयोग करना असंभव बना देती हैं। BBQSQL आपको "हुक" फ़ंक्शन परिभाषित करने की अनुमति देता है जिसे उपकरण अनुरोध के दौरान विभिन्न बिंदुओं पर कॉल करेगा। उदाहरण के लिए, आप एक pre_request फ़ंक्शन निर्दिष्ट कर सकते हैं जो अपने तर्क के रूप में अनुरोध लेता है, आवश्यक उत्परिवर्तन करता है, और संशोधित अनुरोध को सर्वर पर भेजने के लिए लौटाता है।
इसे लागू करने के लिए, एक Python फ़ाइल बनाएँ और हुक फ़ंक्शन निर्दिष्ट करें। उपलब्ध फ़ंक्शन नाम नीचे सूचीबद्ध हैं। अपनी हुक्स फ़ाइल में, आप जितने चाहें उतने या कम हुक फ़ंक्शन परिभाषित कर सकते हैं। फिर, मेनू के bbqsql_options अनुभाग में, आप अपने hooks_file का स्थान निर्दिष्ट कर सकते हैं। BBQSQL इस फ़ाइल को ग्रहण करेगा और आपके द्वारा परिभाषित किसी भी हुक का उपयोग करेगा।
यह महत्वपूर्ण है कि आपके द्वारा निर्दिष्ट हुक फ़ंक्शन के नाम बिल्कुल नीचे दिए गए नामों के समान हों, अन्यथा BBQSQL को पता नहीं चलेगा कि कब किस हुक को कॉल करना है। args फ़ंक्शन एक पैरामीटर प्राप्त करता है जिसमें वे सभी तर्क होते हैं जिनका उपयोग HTTP अनुरोध बनाने के लिए किया जा रहा है। pre_request फ़ंक्शन अनुरोध भेजे जाने से पहले अनुरोध ऑब्जेक्ट प्राप्त करता है। post_request फ़ंक्शन अनुरोध भेजे जाने के बाद अनुरोध ऑब्जेक्ट प्राप्त करता है। response फ़ंक्शन BBQSQL को लौटाए जाने से पहले प्रतिक्रिया ऑब्जेक्ट प्राप्त करता है।
निम्नलिखित हुक उपलब्ध कराए गए हैं:
args: Request() पर भेजे जा रहे तर्कों का एक शब्दकोश।
pre_request: अनुरोध ऑब्जेक्ट, भेजे जाने से ठीक पहले।
post_request: अनुरोध ऑब्जेक्ट, भेजे जाने के ठीक बाद।
response: एक अनुरोध से उत्पन्न प्रतिक्रिया।
इन हुक्स के काम करने के तरीके और आपकी hooks डिक्शनरी कैसी दिखनी चाहिए, इसके बारे में अधिक जानकारी के लिए, अनुरोध लाइब्रेरी दस्तावेज़ीकरण इसके हुक्स पर देखें।
एक उदाहरण हुक्स फ़ाइल इस प्रकार दिख सकती है:
# file: hooks.py
import time
def pre_request(req):
"""
यह हुक एक प्लेसहोल्डर को वर्तमान समय से बदल देता है
url इस प्रकार दिखने की उम्मीद है:
http://www.google.com?k=v&time=PLACEHOLDER
"""
req.url = req.url.replace('PLACEHOLDER',str(time.time()))
return req
किसी भी बग फिक्स या सुविधा अनुरोध को https://github.com/Neohapsis/bbqsql/ पर सबमिट करें।
कृपया! हम देखते हैं कि यह एक पूर्ण SQL इंजेक्शन फ्रेमवर्क बनाने के लिए एक शानदार शुरुआती बिंदु है। बेझिझक कोड को फोर्क करें और यदि आपके परिवर्तन उपयोगी हैं तो हम उन्हें मर्ज कर सकते हैं।
BBQ बेहद स्वादिष्ट है और SQL इंजेक्शन भी!