MSSQL Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
MSSQL sunucusu içinde SQL injection aracılığıyla alan kullanıcılarını listelemek mümkün olabilir, aşağıdaki MSSQL fonksiyonlarını kullanarak:
SELECT DEFAULT_DOMAIN()
: Mevcut alan adını alır.
master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))
: Alan adının adını biliyorsanız (DOMAIN bu örnekte) bu fonksiyon Administrator kullanıcısının SID'sini hex formatında döndürecektir. Bu, 0x01050000000[...]0000f401
gibi görünecektir, son 4 byte'ın 500 sayısı olduğunu not edin, bu da administrator kullanıcısının ortak ID'sidir.
Bu fonksiyon, alanın ID'sini bilmenizi sağlayacaktır (son 4 byte hariç tüm byte'lar).
SUSER_SNAME(0x01050000000[...]0000e803)
: Bu fonksiyon, belirtilen ID'nin kullanıcı adını döndürecektir (varsa), bu durumda 0000e803 big endian == 1000 (genellikle bu, oluşturulan ilk normal kullanıcı ID'sidir). O zaman 1000'den 2000'e kadar kullanıcı ID'lerini brute-force yapabileceğinizi ve muhtemelen alan kullanıcılarının tüm kullanıcı adlarını alabileceğinizi hayal edebilirsiniz. Örneğin, aşağıdaki gibi bir fonksiyon kullanarak:
Hata tabanlı SQL enjeksiyonları genellikle +AND+1=@@version--
gibi yapıları ve «OR» operatörüne dayanan varyantları andırır. Bu tür ifadeleri içeren sorgular genellikle WAF'lar tarafından engellenir. Bir geçiş olarak, aranan verilerde bir veri türü dönüşüm hatası tetikleyen belirli fonksiyon çağrılarının sonuçlarıyla %2b karakterini kullanarak bir dize birleştirin.
Bu tür fonksiyonlardan bazı örnekler:
SUSER_NAME()
USER_NAME()
PERMISSIONS()
DB_NAME()
FILE_NAME()
TYPE_NAME()
COL_NAME()
Fonksiyon USER_NAME()
kullanımına örnek:
Bu SSRF numaraları buradan alındı
fn_xe_file_target_read_file
Sunucuda VIEW SERVER STATE
izni gerektirir.
fn_get_audit_file
CONTROL SERVER
izni gerektirir.
fn_trace_gettabe
CONTROL SERVER
izni gerektirir.
xp_dirtree
, xp_fileexists
, xp_subdirs
Microsoft tarafından resmi olarak belgelenmemiş olmasına rağmen, xp_dirtree
gibi saklı yordamlar, MSSQL içindeki ağ işlemlerindeki faydaları nedeniyle çevrimiçi olarak başkaları tarafından tanımlanmıştır. Bu yordamlar genellikle, çeşitli örneklerde ve paylaşımlarda sergilendiği gibi, Band Dışı Veri sızdırma işlemlerinde kullanılır.
Örneğin, xp_dirtree
saklı yordamı, ağ istekleri yapmak için kullanılır, ancak yalnızca TCP port 445 ile sınırlıdır. Port numarası değiştirilemez, ancak ağ paylaşımlarından okuma yapmaya izin verir. Kullanımı aşağıdaki SQL betiğinde gösterilmektedir:
Bu yöntemin, varsayılan ayarlarla çalışan Windows Server 2016 Datacenter
üzerindeki Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
gibi tüm sistem yapılandırmalarında çalışmayabileceği dikkate değerdir.
Ayrıca, benzer sonuçlar elde edebilecek master..xp_fileexist
ve xp_subdirs
gibi alternatif saklı prosedürler de bulunmaktadır. xp_fileexist
hakkında daha fazla bilgiye bu TechNet makalesinden ulaşabilirsiniz.
xp_cmdshell
Açıkça, bir SSRF tetikleyen bir şeyi çalıştırmak için xp_cmdshell
de kullanabilirsiniz. Daha fazla bilgi için sayfadaki ilgili bölümü okuyun:
Özel işlevleri çalıştırmak için MSSQL içinde yüklenmek üzere herhangi bir .NET dilinde yazılmış ve DLL'ye derlenmiş bir CLR UDF (Common Language Runtime Kullanıcı Tanımlı Fonksiyonu) oluşturmak, dbo
erişimi gerektiren bir süreçtir. Bu, genellikle veritabanı bağlantısının sa
olarak veya bir Yönetici rolü ile yapılması durumunda mümkündür.
Binary'nin MSSQL'e CLR derlemesi olarak yüklenmesini kolaylaştırmak için bu Github deposunda bir Visual Studio projesi ve kurulum talimatları sağlanmıştır; böylece MSSQL içinden HTTP GET isteklerinin çalıştırılması sağlanmaktadır.
Bu işlevselliğin temeli, bir GET isteği gerçekleştirmek ve içeriği almak için WebClient
sınıfını kullanan http.cs
dosyasında kapsüllenmiştir; aşağıda gösterildiği gibi:
CREATE ASSEMBLY
SQL komutunu çalıştırmadan önce, derlemenin SHA512 hash'ini sunucunun güvenilir derlemeler listesine eklemek için aşağıdaki SQL kodunu çalıştırmanız önerilir (görüntülemek için select * from sys.trusted_assemblies;
):
Başarıyla assembly ekledikten ve fonksiyonu oluşturduktan sonra, HTTP istekleri gerçekleştirmek için aşağıdaki SQL kodu kullanılabilir:
Tek bir sorguda bir tablonun tam içeriğini çıkarmak için kullanılan özlü bir yöntem, FOR JSON
ifadesini kullanmaktır. Bu yaklaşım, "ham" gibi belirli bir mod gerektiren FOR XML
ifadesine göre daha kısadır. Kısalığı nedeniyle FOR JSON
ifadesi tercih edilmektedir.
İşte mevcut veritabanından şemayı, tabloları ve sütunları nasıl alacağınız:
Non-standard whitespace characters: %C2%85 или %C2%A0:
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
https://vuln.app/getItem?id=0xunion+select+null,@@version,null--
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
So for example, multiple queries such as:
Can be reduced to:
Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)