SQL Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
RootedCON स्पेन में सबसे प्रासंगिक साइबर सुरक्षा कार्यक्रम है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने के मिशन के साथ, यह कांग्रेस हर अनुशासन में प्रौद्योगिकी और साइबर सुरक्षा पेशेवरों के लिए एक उबालता हुआ बैठक बिंदु है।
एक SQL injection एक सुरक्षा दोष है जो हमलावरों को एक एप्लिकेशन के डेटाबेस क्वेरी में हस्तक्षेप करने की अनुमति देता है। यह भेद्यता हमलावरों को देखने, संशोधित करने या हटाने की अनुमति दे सकती है, जो उन्हें एक्सेस नहीं करना चाहिए, जिसमें अन्य उपयोगकर्ताओं की जानकारी या कोई भी डेटा शामिल है जिसे एप्लिकेशन एक्सेस कर सकता है। ऐसे कार्य एप्लिकेशन की कार्यक्षमता या सामग्री में स्थायी परिवर्तन या यहां तक कि सर्वर का समझौता या सेवा का इनकार कर सकते हैं।
जब एक साइट SQL injection (SQLi) के लिए संवेदनशील प्रतीत होती है, जो SQLi-संबंधित इनपुट के लिए असामान्य सर्वर प्रतिक्रियाओं के कारण होती है, तो पहला कदम यह समझना है कि क्वेरी में डेटा को बिना बाधित किए कैसे इंजेक्ट करें। इसके लिए वर्तमान संदर्भ से सफलता से बचने के तरीके की पहचान करना आवश्यक है। ये कुछ उपयोगी उदाहरण हैं:
फिर, आपको यह जानने की आवश्यकता है कि क्वेरी को कैसे ठीक करें ताकि कोई त्रुटियाँ न हों। क्वेरी को ठीक करने के लिए आप डेटा इनपुट कर सकते हैं ताकि पिछली क्वेरी नए डेटा को स्वीकार कर सके, या आप बस अपना डेटा इनपुट कर सकते हैं और अंत में एक टिप्पणी प्रतीक जोड़ सकते हैं।
ध्यान दें कि यदि आप त्रुटि संदेश देख सकते हैं या आप देख सकते हैं कि जब क्वेरी काम कर रही है और जब यह काम नहीं कर रही है तो इसमें अंतर है, तो यह चरण अधिक आसान होगा।
SQL injection vulnerability की पुष्टि करने के लिए एक विश्वसनीय विधि logical operation को निष्पादित करना और अपेक्षित परिणामों का अवलोकन करना है। उदाहरण के लिए, एक GET पैरामीटर जैसे ?username=Peter
को ?username=Peter' या '1'='1
में संशोधित करने पर समान सामग्री उत्पन्न होना SQL injection vulnerability का संकेत देता है।
इसी तरह, mathematical operations का उपयोग एक प्रभावी पुष्टि तकनीक के रूप में किया जाता है। उदाहरण के लिए, यदि ?id=1
और ?id=2-1
तक पहुँचने पर समान परिणाम उत्पन्न होते हैं, तो यह SQL injection का संकेत है।
Examples demonstrating logical operation confirmation:
यह शब्द-सूची SQLinjections को प्रस्तावित तरीके से पुष्ट करने के लिए बनाई गई थी:
कुछ मामलों में आप पृष्ठ पर कोई परिवर्तन नहीं देखेंगे जिसे आप परीक्षण कर रहे हैं। इसलिए, ब्लाइंड SQL injections का पता लगाने का एक अच्छा तरीका है कि DB को क्रियाएँ करने के लिए मजबूर करना और इसका प्रभाव समय पर पड़ेगा जो पृष्ठ को लोड करने में लगेगा। इसलिए, हम SQL क्वेरी में एक ऑपरेशन को जोड़ने जा रहे हैं जो पूरा होने में बहुत समय लेगा:
कुछ मामलों में sleep functions की अनुमति नहीं होगी। फिर, उन फ़ंक्शनों का उपयोग करने के बजाय, आप क्वेरी को जटिल ऑपरेशंस करने के लिए बना सकते हैं जो कई सेकंड लेगी। इन तकनीकों के उदाहरणों को प्रत्येक तकनीक पर अलग से टिप्पणी की जाएगी (यदि कोई हो)।
बैक-एंड की पहचान करने का सबसे अच्छा तरीका विभिन्न बैक-एंड के फ़ंक्शंस को निष्पादित करने की कोशिश करना है। आप पिछले अनुभाग के sleep functions या इनका उपयोग कर सकते हैं (तालिका payloadsallthethings:
Also, if you have access to the output of the query, you could make it print the version of the database.
एक निरंतरता में हम विभिन्न प्रकार के SQL Injection का शोषण करने के लिए विभिन्न तरीकों पर चर्चा करने जा रहे हैं। हम उदाहरण के रूप में MySQL का उपयोग करेंगे।
If you can see the output of the query this is the best way to exploit it. First of all, हमें यह पता लगाना है कि प्रारंभिक अनुरोध कितने स्तंभ वापस कर रहा है। इसका कारण यह है कि दोनों प्रश्नों को समान संख्या में स्तंभ लौटाना चाहिए। इस उद्देश्य के लिए आमतौर पर दो विधियों का उपयोग किया जाता है:
To determine the number of columns in a query, incrementally adjust the number used in ORDER BY or GROUP BY clauses until a false response is received. Despite the distinct functionalities of GROUP BY and ORDER BY within SQL, both can be utilized identically for ascertaining the query's column count.
जांच सही होने तक अधिक से अधिक नल मान चुनें:
आपको null
मानों का उपयोग करना चाहिए क्योंकि कुछ मामलों में क्वेरी के दोनों पक्षों के कॉलम का प्रकार समान होना चाहिए और null हर मामले में मान्य है।
अगले उदाहरणों में हम सभी डेटाबेस के नाम, एक डेटाबेस की तालिका का नाम, तालिका के कॉलम नाम प्राप्त करने जा रहे हैं:
हर अलग-अलग डेटाबेस पर इस डेटा को खोजने का एक अलग तरीका है, लेकिन यह हमेशा एक ही पद्धति होती है।
जब एक क्वेरी का आउटपुट दिखाई देता है, लेकिन यूनियन-आधारित इंजेक्शन असंभव लगता है, तो यह छिपे हुए यूनियन-आधारित इंजेक्शन की उपस्थिति का संकेत देता है। यह परिदृश्य अक्सर एक ब्लाइंड इंजेक्शन स्थिति की ओर ले जाता है। एक ब्लाइंड इंजेक्शन को यूनियन-आधारित में बदलने के लिए, बैकएंड पर निष्पादित क्वेरी को पहचानना आवश्यक है।
यह आपके लक्षित डेटाबेस प्रबंधन प्रणाली (DBMS) के लिए विशिष्ट डिफ़ॉल्ट तालिकाओं के साथ ब्लाइंड इंजेक्शन तकनीकों का उपयोग करके किया जा सकता है। इन डिफ़ॉल्ट तालिकाओं को समझने के लिए, लक्षित DBMS की दस्तावेज़ीकरण की सलाह दी जाती है।
एक बार जब क्वेरी निकाली जाती है, तो आपके पेलोड को मूल क्वेरी को सुरक्षित रूप से बंद करने के लिए अनुकूलित करना आवश्यक है। इसके बाद, आपके पेलोड में एक यूनियन क्वेरी जोड़ी जाती है, जो नए सुलभ यूनियन-आधारित इंजेक्शन के शोषण की सुविधा प्रदान करती है।
अधिक व्यापक अंतर्दृष्टि के लिए, Healing Blind Injections पर उपलब्ध पूर्ण लेख को देखें।
यदि किसी कारणवश आप क्वेरी का आउटपुट नहीं देख सकते हैं लेकिन आप त्रुटि संदेश देख सकते हैं, तो आप इन त्रुटि संदेशों का उपयोग करके डेटाबेस से डेटा को एक्स-फिल्ट्रेट कर सकते हैं। यूनियन आधारित शोषण में समान प्रवाह का पालन करते हुए, आप DB को डंप करने में सक्षम हो सकते हैं।
इस मामले में आप क्वेरी के परिणाम या त्रुटियों को नहीं देख सकते, लेकिन आप distinguished कर सकते हैं जब क्वेरी return एक true या false प्रतिक्रिया क्योंकि पृष्ठ पर विभिन्न सामग्री होती है। इस मामले में, आप उस व्यवहार का दुरुपयोग करके डेटाबेस को अक्षर दर अक्षर डंप कर सकते हैं:
यह पहले के समान मामला है लेकिन क्वेरी से सही/गलत प्रतिक्रिया के बीच भेद करने के बजाय आप भेद कर सकते हैं कि SQL क्वेरी में एक त्रुटि है या नहीं (शायद क्योंकि HTTP सर्वर क्रैश हो जाता है)। इसलिए, इस मामले में आप हर बार SQLerror को मजबूर कर सकते हैं जब आप सही अक्षर का अनुमान लगाते हैं:
इस मामले में कोई तरीका नहीं है जिससे आप पृष्ठ के संदर्भ के आधार पर क्वेरी की प्रतिक्रिया को पहचान सकें। लेकिन, आप पृष्ठ को लोड होने में अधिक समय ले सकता है यदि अनुमानित वर्ण सही है। हमने पहले इस तकनीक का उपयोग SQLi vuln की पुष्टि करने के लिए देखा है।
आप स्टैक्ड क्वेरीज़ का उपयोग एक के बाद एक कई क्वेरीज़ निष्पादित करने के लिए कर सकते हैं। ध्यान दें कि जबकि बाद की क्वेरीज़ निष्पादित होती हैं, परिणाम ऐप्लिकेशन को वापस नहीं किए जाते। इसलिए यह तकनीक मुख्य रूप से ब्लाइंड कमजोरियों के संबंध में उपयोगी है जहाँ आप एक दूसरी क्वेरी का उपयोग करके DNS लुकअप, शर्तीय त्रुटि, या समय विलंब को ट्रिगर कर सकते हैं।
Oracle स्टैक्ड क्वेरीज़ का समर्थन नहीं करता। MySQL, Microsoft और PostgreSQL उनका समर्थन करते हैं: QUERY-1-HERE; QUERY-2-HERE
यदि कोई अन्य शोषण विधि काम नहीं करती, तो आप डेटाबेस को जानकारी को आपके द्वारा नियंत्रित बाहरी होस्ट पर निकालने के लिए प्रयास कर सकते हैं। उदाहरण के लिए, DNS क्वेरीज़ के माध्यम से:
Check the SQLMap Cheatsheet to exploit a SQLi vulnerability with sqlmap.
हम पहले ही SQL Injection vulnerability का फायदा उठाने के सभी तरीकों पर चर्चा कर चुके हैं। इस पुस्तक में कुछ और तकनीकें जो डेटाबेस प्रौद्योगिकी पर निर्भर हैं, खोजें:
या आप MySQL, PostgreSQL, Oracle, MSSQL, SQLite और HQL के बारे में बहुत सारी तकनीकें https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection में पाएंगे।
RootedCON स्पेन में सबसे प्रासंगिक साइबर सुरक्षा कार्यक्रम है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने के मिशन के साथ, यह कांग्रेस हर अनुशासन में प्रौद्योगिकी और साइबर सुरक्षा पेशेवरों के लिए एक उष्णकटिबंधीय बैठक बिंदु है।
लॉगिन कार्यक्षमता को बायपास करने के लिए प्रयास करने के लिए सूची:
Login bypass Listयह क्वेरी एक कमजोरियों को प्रदर्शित करती है जब MD5 को प्रमाणीकरण जांचों में कच्चे आउटपुट के लिए true के साथ उपयोग किया जाता है, जिससे सिस्टम SQL injection के प्रति संवेदनशील हो जाता है। हमलावर इसको इस तरह से भुनाने में सक्षम होते हैं कि वे ऐसे इनपुट तैयार करते हैं जो, जब हैश किए जाते हैं, अप्रत्याशित SQL कमांड भाग उत्पन्न करते हैं, जिससे अनधिकृत पहुंच होती है।
अनुशंसित सूची:
आपको सूची की प्रत्येक पंक्ति को उपयोगकर्ता नाम के रूप में और हमेशा पासवर्ड के रूप में उपयोग करना चाहिए: Pass1234. &#xNAN;(ये पेलोड भी इस अनुभाग की शुरुआत में उल्लेखित बड़ी सूची में शामिल हैं)
यदि ' को स्केप किया जा रहा है तो आप %A8%27 का उपयोग कर सकते हैं, और जब ' को स्केप किया जाता है तो यह बनेगा: 0xA80x5c0x27 (╘')
Python स्क्रिप्ट:
To do so you should try to create a new object named as the "master object" (probably admin in case of users) modifying something:
Create user named: AdMIn (uppercase & lowercase letters)
Create a user named: admin=
SQL Truncation Attack (when there is some kind of length limit in the username or email) --> Create user with name: admin [a lot of spaces] a
If the database is vulnerable and the max number of chars for username is for example 30 and you want to impersonate the user admin, try to create a username called: "admin [30 spaces] a" and any password.
The database will check if the introduced username exists inside the database. If not, it will cut the username to the max allowed number of characters (in this case to: "admin [25 spaces]") and the it will automatically remove all the spaces at the end updating inside the database the user "admin" with the new password (some error could appear but it doesn't means that this hasn't worked).
More info: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref
नोट: यह हमला नवीनतम MySQL इंस्टॉलेशन में ऊपर वर्णित तरीके से काम नहीं करेगा। जबकि तुलना डिफ़ॉल्ट रूप से ट्रेलिंग व्हाइटस्पेस की अनदेखी करती है, एक स्ट्रिंग डालने का प्रयास जो किसी फ़ील्ड की लंबाई से अधिक है, एक त्रुटि का परिणाम देगा, और डालना विफल हो जाएगा। इस जांच के बारे में अधिक जानकारी के लिए: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation
Add as much ','',''
as you consider to exit the VALUES statement. If delay is executed, you have a SQLInjection.
MySQL में ON DUPLICATE KEY UPDATE
क्लॉज़ का उपयोग तब किया जाता है जब एक पंक्ति को डालने का प्रयास किया जाता है जो UNIQUE इंडेक्स या PRIMARY KEY में डुप्लिकेट मान का परिणाम देगा। निम्नलिखित उदाहरण दिखाता है कि इस सुविधा का उपयोग एक व्यवस्थापक खाते का पासवर्ड संशोधित करने के लिए कैसे किया जा सकता है:
Example Payload Injection:
एक इंजेक्शन पेलोड इस प्रकार तैयार किया जा सकता है, जहाँ users
तालिका में दो पंक्तियाँ डालने का प्रयास किया जाता है। पहली पंक्ति एक धोखा है, और दूसरी पंक्ति एक मौजूदा व्यवस्थापक के ईमेल को लक्षित करती है जिसका उद्देश्य पासवर्ड को अपडेट करना है:
Here's how it works:
क्वेरी दो पंक्तियाँ डालने का प्रयास करती है: एक generic_user@example.com
के लिए और दूसरी admin_generic@example.com
के लिए।
यदि admin_generic@example.com
के लिए पंक्ति पहले से मौजूद है, तो ON DUPLICATE KEY UPDATE
क्लॉज सक्रिय होता है, MySQL को मौजूदा पंक्ति के password
फ़ील्ड को "bcrypt_hash_of_newpassword" में अपडेट करने के लिए निर्देशित करता है।
परिणामस्वरूप, प्रमाणीकरण admin_generic@example.com
का उपयोग करके किया जा सकता है, जिसमें bcrypt हैश के लिए संबंधित पासवर्ड है ("bcrypt_hash_of_newpassword" नए पासवर्ड के bcrypt हैश का प्रतिनिधित्व करता है, जिसे इच्छित पासवर्ड के वास्तविक हैश से बदलना चाहिए)।
जब एक नया उपयोगकर्ता और उपयोगकर्ता नाम बनाने का प्रयास किया जाता है, तो पासवर्ड और ईमेल की आवश्यकता होती है:
इस तकनीक के साथ आप केवल 1 खाता बनाकर जानकारी निकाल सकते हैं। यह ध्यान रखना महत्वपूर्ण है कि आपको कुछ भी टिप्पणी करने की आवश्यकता नहीं है।
hex2dec और substr का उपयोग करते हुए:
टेक्स्ट प्राप्त करने के लिए आप उपयोग कर सकते हैं:
हैक्स और रिप्लेस (और सब्स्ट्र) का उपयोग करते हुए:
RootedCON स्पेन में सबसे प्रासंगिक साइबर सुरक्षा कार्यक्रम है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने के मिशन के साथ, यह कांग्रेस हर अनुशासन में प्रौद्योगिकी और साइबर सुरक्षा पेशेवरों के लिए एक उबालता हुआ बैठक बिंदु है।
Routed SQL injection एक ऐसी स्थिति है जहाँ injectable query वह नहीं है जो आउटपुट देती है, बल्कि injectable query का आउटपुट उस query में जाता है जो आउटपुट देती है। (From Paper)
Example:
कोई स्पेस (%20) - व्हाइटस्पेस विकल्पों का उपयोग करके बायपास
No Whitespace - टिप्पणियों का उपयोग करके बायपास
No Whitespace - पेरेंटेसिस का उपयोग करके बायपास
No Comma - OFFSET, FROM और JOIN का उपयोग करके बायपास
कीवर्ड का उपयोग करके ब्लैकलिस्ट - अपरकेस/लोअरकेस का उपयोग करके बायपास
कीवर्ड का उपयोग करके ब्लैकलिस्ट केस-इंसेंसिटिव - समकक्ष ऑपरेटर का उपयोग करके बायपास करें
आप इस ट्रिक के बारे में अधिक गहन व्याख्या gosecure blog में पा सकते हैं। बुनियादी रूप से, आप WAF को बायपास करने के लिए वैज्ञानिक संकेतन का अप्रत्याशित तरीकों से उपयोग कर सकते हैं:
सबसे पहले, ध्यान दें कि यदि मूल क्वेरी और वह तालिका जहाँ आप ध्वज निकालना चाहते हैं, में समान संख्या में कॉलम हैं तो आप बस कर सकते हैं: 0 UNION SELECT * FROM flag
यह संभव है कि किसी तालिका के तीसरे कॉलम तक उसके नाम का उपयोग किए बिना पहुंचा जाए एक क्वेरी का उपयोग करके जैसे: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
, तो एक sqlinjection में यह इस तरह दिखेगा:
या कॉमा बायपास का उपयोग करके:
यह ट्रिक https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/ से ली गई थी।
RootedCON स्पेन में सबसे प्रासंगिक साइबरसिक्योरिटी इवेंट है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने के मिशन के साथ, यह कांग्रेस हर अनुशासन में प्रौद्योगिकी और साइबरसिक्योरिटी पेशेवरों के लिए एक उबालता हुआ बैठक बिंदु है।
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)