MS Access SQL Injection
Last updated
Last updated
सीखें और AWS हैकिंग का अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) सीखें और GCP हैकिंग का अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
स्ट्रिंग संयोजन & (%26)
और + (%2b)
अक्षरों के साथ संभव है।
MS Access में कोई टिप्पणियाँ नहीं हैं, लेकिन स्पष्ट रूप से एक NULL कैरेक्टर के साथ क्वेरी के अंतिम भाग को हटाना संभव है:
यदि यह काम नहीं कर रहा है, तो आप हमेशा क्वेरी की सिंटैक्स को ठीक कर सकते हैं:
वे समर्थित नहीं हैं।
LIMIT
ऑपरेटर क्रियान्वित नहीं किया गया है। हालाँकि, SELECT क्वेरी परिणामों को पहले N तालिका पंक्तियों तक सीमित करना संभव है TOP
ऑपरेटर का उपयोग करके। TOP
एक पूर्णांक को तर्क के रूप में स्वीकार करता है, जो लौटाई जाने वाली पंक्तियों की संख्या का प्रतिनिधित्व करता है।
Just like TOP you can use LAST
which will get the rows from the end.
In a SQLi you usually will want to somehow execute a new query to extract information from other tables. MS Access हमेशा आवश्यक है कि subqueries या extra queries में FROM
को इंगित किया जाए।
तो, यदि आप UNION SELECT
या UNION ALL SELECT
या एक SELECT
को एक शर्त में कोष्ठक के बीच निष्पादित करना चाहते हैं, तो आपको हमेशा एक मान्य तालिका नाम के साथ FROM
को इंगित करने की आवश्यकता है।
इसलिए, आपको एक मान्य तालिका नाम जानने की आवश्यकता है।
यह आपको वर्तमान तालिका के मानों को निकालने की अनुमति देगा बिना तालिका के नाम को जाने।
MS Access अजीब सिंटैक्स की अनुमति देता है जैसे '1'=2='3'='asd'=false
। जैसा कि आमतौर पर SQL injection एक WHERE
क्लॉज के अंदर होगा, हम इसका दुरुपयोग कर सकते हैं।
कल्पना करें कि आपके पास एक MS Access डेटाबेस में SQLi है और आप जानते हैं (या अनुमान लगाते हैं) कि एक कॉलम का नाम username है, और यही वह फ़ील्ड है जिसे आप निकालना चाहते हैं। आप चेनिंग इक्वल्स तकनीक का उपयोग करते समय वेब ऐप की विभिन्न प्रतिक्रियाओं की जांच कर सकते हैं और संभावित रूप से Mid
फ़ंक्शन का उपयोग करके सबस्ट्रिंग प्राप्त करने के लिए boolean injection के साथ सामग्री निकाल सकते हैं।
यदि आप टेबल का नाम और कॉलम जानते हैं जिसे डंप करना है, तो आप Mid
, LAST
और TOP
के बीच एक संयोजन का उपयोग कर सकते हैं ताकि आप सभी जानकारी लीक कर सकें बूलियन SQLi के माध्यम से:
Feel free to check this in the online playground.
चेनिंग इक्वल्स तकनीक का उपयोग करके आप कुछ इस तरह से टेबल नामों का ब्रूट-फोर्स भी कर सकते हैं:
आप एक अधिक पारंपरिक तरीका भी उपयोग कर सकते हैं:
Feel free to check this in the online playground.
Sqlmap सामान्य तालिका नाम: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
आप वर्तमान कॉलम नामों को ब्रूट-फोर्स कर सकते हैं चेनिंग इक्वल्स ट्रिक के साथ:
या group by के साथ:
या आप अलग तालिका के कॉलम नामों को ब्रूट-फोर्स कर सकते हैं:
हमने पहले ही चेनिंग इक्वल्स तकनीक से वर्तमान और अन्य तालिकाओं से डेटा निकालने के बारे में चर्चा की है। लेकिन अन्य तरीके भी हैं:
In a nutshell, क्वेरी एक "if-then" स्टेटमेंट का उपयोग करती है ताकि सफलता की स्थिति में "200 OK" या अन्यथा "500 Internal Error" को ट्रिगर किया जा सके। TOP 10 ऑपरेटर का लाभ उठाते हुए, पहले दस परिणामों का चयन करना संभव है। LAST का बाद में उपयोग केवल 10वीं ट्यूपल पर विचार करने की अनुमति देता है। ऐसे मान पर, MID ऑपरेटर का उपयोग करके, एक सरल वर्ण तुलना करना संभव है। MID और TOP के इंडेक्स को सही ढंग से बदलकर, हम सभी पंक्तियों के लिए "username" फ़ील्ड की सामग्री को डंप कर सकते हैं।
Mid('admin',1,1)
स्थिति 1 से लंबाई 1 का उपस्ट्रिंग प्राप्त करें (प्रारंभिक स्थिति 1 है)
LEN('1234')
स्ट्रिंग की लंबाई प्राप्त करें
ASC('A')
वर्ण का ASCII मान प्राप्त करें
CHR(65)
ASCII मान से स्ट्रिंग प्राप्त करें
IIF(1=1,'a','b')
यदि तो
COUNT(*)
आइटम की संख्या गिनें
From here you can see a query to get tables names:
हालांकि, ध्यान दें कि SQL इंजेक्शन पाना बहुत सामान्य है जहाँ आपके पास टेबल MSysObjects
को पढ़ने का एक्सेस नहीं है।
वेब रूट का पूर्ण पथ जानने से आगे के हमलों में मदद मिल सकती है। यदि एप्लिकेशन की त्रुटियाँ पूरी तरह से छिपी नहीं हैं, तो एक गैर-मौजूद डेटाबेस से डेटा चुनने की कोशिश करते समय डायरेक्टरी पथ का पता लगाया जा सकता है।
http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
MS Access एक त्रुटि संदेश के साथ प्रतिक्रिया करता है जिसमें वेब डायरेक्टरी का पूरा पथ होता है।
निम्नलिखित हमलावर वेक्टर का उपयोग दूरस्थ फ़ाइल सिस्टम पर एक फ़ाइल के अस्तित्व का अनुमान लगाने के लिए किया जा सकता है। यदि निर्दिष्ट फ़ाइल मौजूद है, तो MS Access एक त्रुटि संदेश उत्पन्न करता है जो सूचित करता है कि डेटाबेस प्रारूप अमान्य है:
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
फ़ाइलों को एन्यूमरेट करने का एक और तरीका एक डेटाबेस.टेबल आइटम को निर्दिष्ट करना है। यदि निर्दिष्ट फ़ाइल मौजूद है, तो MS Access एक डेटाबेस प्रारूप त्रुटि संदेश प्रदर्शित करता है।
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00
डेटाबेस फ़ाइल का नाम (.mdb) निम्नलिखित क्वेरी के साथ अनुमानित किया जा सकता है:
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
जहाँ name[i] एक .mdb फ़ाइल नाम है और realTable डेटाबेस के भीतर एक मौजूदा तालिका है। हालांकि MS Access हमेशा एक त्रुटि संदेश उत्पन्न करेगा, लेकिन अमान्य फ़ाइल नाम और मान्य .mdb फ़ाइल नाम के बीच अंतर करना संभव है।
Access PassView एक मुफ्त उपयोगिता है जिसका उपयोग Microsoft Access 95/97/2000/XP या Jet Database Engine 3.0/4.0 का मुख्य डेटाबेस पासवर्ड पुनर्प्राप्त करने के लिए किया जा सकता है।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)