MS Access SQL Injection
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Dize birleştirme & (%26)
ve + (%2b)
karakterleri ile mümkündür.
MS Access'te yorum yoktur, ancak görünüşe göre bir sorgunun sonunu NULL karakteri ile kaldırmak mümkündür:
Eğer bu çalışmıyorsa, sorgunun sözdizimini her zaman düzeltebilirsiniz:
Desteklenmiyorlar.
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.
Just like TOP you can use LAST
which will get the satırları sonundan.
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.
Bu, tablo adını bilmeden mevcut tablonun değerlerini dışarı aktarmanıza olanak tanır.
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.
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ışarı 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ışarı aktarabilirsiniz.
Eğer tablonun adını ve sütunu dökmek için biliyorsanız, Mid
, LAST
ve TOP
arasında bir kombinasyon kullanarak tüm bilgileri sızdırmak için boolean SQLi kullanabilirsiniz:
Feel free to check this in the online playground.
Chaining equals tekniğini kullanarak, tablo adlarını brute-force yapmak için şunları kullanabilirsiniz:
Daha geleneksel bir yol da kullanabilirsiniz:
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
http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html adresinde başka bir liste var.
Mevcut sütun adlarını brute-force ile bulmak için eşit zincirleme hilesini kullanabilirsiniz:
Veya group by ile:
Ya da farklı bir tablonun sütun adlarını brute-force ile bulabilirsiniz:
Zaten eşit zincirleme tekniği ile mevcut ve diğer tablolardan veri dökme konusunu tartıştık. Ancak başka yollar da var:
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.
https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN adresini kontrol edin.
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
buradan tablo isimlerini almak için bir sorgu görebilirsiniz:
Ancak, MSysObjects
tablosunu okumak için erişiminiz olmadığında SQL Enjeksiyonları bulmanın çok yaygın olduğunu unutmayın.
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.
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.
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
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ında 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.
Access PassView, 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.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)