SQLi: इंजेक्शन हमला
एसक्यूएल इंजेक्शन क्या है?
SQLi वेब आधारित एप्लिकेशन में एक प्रकार का हमला है जहां हमलावर वेबसाइट के डेटाबेस में दुर्भावनापूर्ण क्वेरी चला सकता है। SQL एक कोड इंजेक्शन तकनीक है जिसका उपयोग दुर्भावनापूर्ण SQL कथनों को निष्पादित करने के लिए किया जाता है।
उदाहरण के लिए, यदि आप वेबसाइट पर लॉगिन करना चाहते हैं और आप उपयोगकर्ता नाम और पासवर्ड भूल गए हैं, तो SQLi इंजेक्शन का उपयोग करके हम पासवर्ड जाने बिना वेबपेज पर लॉगिन या एक्सेस कर सकते हैं।
एसक्यूएल इंजेक्शन कैसे काम करता है?
SQL इंजेक्शन में क्लाइंट से एप्लिकेशन में इनपुट डेटा के माध्यम से SQL क्वेरी डालें या इंजेक्ट करें। ये डेटा-प्लेन में इंजेक्ट किए जाते हैं जो पूर्वनिर्धारित SQL कमांड को प्रभावित करते हैं।
SQL इंजेक्शन डायनेमिक SQL स्टेटमेंट में कमजोरियों को लक्षित करता है। एक गतिशील SQL कथन के बारे में सोचें जैसे कि एक बहुभिन्नरूपी गणितीय फ़ंक्शन जिसका पैरामीटर निश्चित है जबकि परिणाम स्वतंत्र चर में रखे गए मानों द्वारा निर्धारित किया जाता है।
इसी तरह, एक डायनेमिक SQL स्टेटमेंट में भी मापदंडों का एक पूर्वनिर्धारित सेट होता है (जैसे कि एक वेब फॉर्म) और पूरा स्टेटमेंट तभी उत्पन्न होता है जब उपयोगकर्ता इनपुट प्रदान करता है।
लॉगिन फॉर्म के SQL स्टेटमेंट का निम्न उदाहरण देखें:
SELECT * FROM users WHERE username = '$username' AND password = bcrypt ('$password')
यदि डायनेमिक SQL स्टेटमेंट में कोई भेद्यता मौजूद है, तो एक हमलावर मौजूदा मापदंडों को दूषित करने और पूरे स्टेटमेंट का अर्थ बदलने के लिए जटिल स्क्रिप्ट को एक रूप में दर्ज कर सकता है।
SQL इंजेक्शन के प्रकार:
इन-बैंड SQLi: इन-बैंड SQL इंजेक्शन एक प्रकार का SQL इंजेक्शन है जहां हमलावर उसी संचार चैनल के माध्यम से सीधे प्रतिक्रिया के रूप में परिणाम प्राप्त करता है। उदाहरण के लिए, यदि कोई हमलावर मैन्युअल रूप से अपने वेब ब्राउज़र के माध्यम से हमला करता है, तो हमले के परिणाम उसी वेब ब्राउज़र में प्रदर्शित होंगे। इन-बैंड SQL इंजेक्शन को पारंपरिक SQL इंजेक्शन के रूप में भी जाना जाता है।
त्रुटि-आधारित SQL इंजेक्शन - यहां हमलावर कुछ क्रियाएं करता है जो डेटाबेस को एक त्रुटि संदेश उत्पन्न करने का कारण बनता है। आप त्रुटि संदेश का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि किस डेटाबेस का उपयोग किया जा रहा है, हैंडलर किस सर्वर संस्करण का उपयोग कर रहा है, आदि।
संघ-आधारित SQL इंजेक्शन - एक HTTP प्रतिक्रिया प्राप्त करने के लिए डेटाबेस द्वारा उत्पन्न एक बयान। आप URL में क्वेरी का निर्माण कर सकते हैं या उत्तर उत्पन्न करने का प्रयास करने के लिए इनपुट फ़ील्ड में कई कथनों को जोड़ सकते हैं
ब्लाइंड एसक्यूआई: ब्लाइंड एसक्यूएल इंजेक्शन एक प्रकार का एसक्यूएल इंजेक्शन है जिसमें हमलावर को डेटाबेस पर हमला किए जाने से स्पष्ट प्रतिक्रिया नहीं मिलती है, बल्कि इसके बजाय डेटाबेस संरचना के पुनर्निर्माण के लिए डेटाबेस सर्वर और एप्लिकेशन के व्यवहार का अवलोकन करता है। ब्लाइंड SQL इंजेक्शन को इंफ़रेंशियल SQL इंजेक्शन के रूप में भी जाना जाता है।
बूलियन आधारित - यहां, हमलावर डेटाबेस को एक SQL क्वेरी भेजता है और एप्लिकेशन को अलग-अलग परिणाम देने के लिए कहता है, जो इस बात पर निर्भर करता है कि क्वेरी सही है या गलत।
समय आधारित - इस हमले में, एक हमलावर एक SQL क्वेरी को एक डेटाबेस में जमा करता है और परिणाम साझा करने से पहले डेटाबेस को निर्दिष्ट समय तक प्रतीक्षा करने का कारण बनता है। प्रतिक्रिया समय एक हमलावर को यह निर्धारित करने में मदद करता है कि कोई क्वेरी सही है या गलत।
आउट-ऑफ़-बैंड SQLi: आउट-ऑफ़-बैंड SQL इंजेक्शन (OOB SQLi) एक प्रकार का SQL इंजेक्शन है जिसमें हमलावर को उसी संचार चैनल पर हमला किए जा रहे एप्लिकेशन से कोई प्रतिक्रिया नहीं मिलती है, लेकिन भेजने में धोखा दिया जा सकता है हमलावर द्वारा नियंत्रित एक दूरस्थ समापन बिंदु पर डेटा। आउट-ऑफ़-बैंड SQL इंजेक्शन तभी संभव है जब आप जिस सर्वर का उपयोग कर रहे हैं उसमें DNS या HTTP अनुरोधों को ट्रिगर करने वाले कमांड हों। हालाँकि, यह सभी लोकप्रिय SQL सर्वर पर लागू होता है।
SQLi पर उदाहरण
पहला उदाहरण बहुत ही सरल है। यह दिखाता है कि कैसे एक हमलावर SQL इंजेक्शन भेद्यता का उपयोग अनुप्रयोग सुरक्षा से बचने और व्यवस्थापक के रूप में प्रमाणित करने के लिए कर सकता है।
निम्न स्क्रिप्ट एक वेब सर्वर पर निष्पादित स्यूडोकोड है। यह उपयोगकर्ता नाम और पासवर्ड के साथ प्रमाणीकरण का एक सरल उदाहरण है। usersउदाहरण डेटाबेस में निम्न कॉलम के साथ एक तालिका है: usernameऔर password।
# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']
# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”
# Execute the SQL statement
database.execute(sql)
password' OR 1=1
SELECT id FROM users WHERE username='username' AND password='password' OR 1=1'
-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16
SQL इंजेक्शन हमलों से सुरक्षा के लिए संगठन निम्नलिखित नीतियों को लागू कर सकते हैं।
- उपयोगकर्ता इनपुट पर भरोसा न करें। डायनेमिक SQL स्टेटमेंट में उनका उपयोग करने से पहले उन्हें हमेशा साफ किया जाना चाहिए।
संग्रहीत कार्यविधियाँ - आपको SQL कथनों को समाहित करने और सभी इनपुटों को मापदंडों के रूप में मानने की अनुमति देता है। - तैयार कथन — तैयार कथन जो पहले एक SQL कथन का निर्माण करके काम करते हैं और फिर सबमिट किए गए उपयोगकर्ता डेटा को पैरामीटर के रूप में संसाधित करते हैं। यह SQL कथनों के सिंटैक्स को प्रभावित नहीं करता है।
नियमित अभिव्यक्तियाँ - संभावित दुर्भावनापूर्ण कोड का पता लगाने और SQL कथन निष्पादित होने से पहले इसे हटाने के लिए उपयोग किया जा सकता है। - डेटाबेस कनेक्शन उपयोक्ता अनुमतियाँ — डेटाबेस से कनेक्ट करने के लिए प्रयुक्त खाते को केवल आवश्यक अनुमतियाँ दी जानी चाहिए। यह सर्वर पर SQL कथनों के प्रदर्शन को कम करने में मदद करता है।
- त्रुटि संदेश — ये संवेदनशील जानकारी या त्रुटि के सटीक स्थान को प्रकट नहीं करते हैं। "क्षमा करें, एक तकनीकी त्रुटि हुई है। मैंने तकनीकी टीम से संपर्क किया है। त्रुटि के कारण SQL कथन प्रदर्शित करने के बजाय बाद में पुनः प्रयास करें"।
ठीक यही काम एक वेब एप्लिकेशन फ़ायरवॉल (WAF) करता है। संदिग्ध कोड वाले मिलानों के लिए अपने वेब एप्लिकेशन के सभी उपयोगकर्ता इनपुट का विश्लेषण करें।
हम आशा करते हैं कि आप तुलना को समझ गए होंगे और अवधारणाओं के साथ स्पष्ट होंगे।
एक टिप्पणी छोड़ें और अपने विचार साझा करें !!
लेखक का:
आकाश शेखावत, माधुरी शेल्के, चेतन शिंदे, स्वराली सोले
संदर्भ:
https://learn.microsoft.com/en-us/sql/relational-databases/security/sql-injection?view=sql-server-ver16
https://systemweakness.com/sql-injection-attacks-53e942aae1f8
https://qawerk.com/blog/what-is-sql-injection/
https://brightsec.com/blog/sql-injection-attack/

![क्या एक लिंक्ड सूची है, वैसे भी? [भाग 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































