Injection Saldırılarında ‘replace’ Bypass ve Fixleme

Merhaba arkadaşlar. Tüm sosyal medya hesaplarım ve blogumu sıfırdan yenileme işlemlerine başladım. Hepsi tek konsept olacak. Yeni konsepte geçmeden bir yazı daha paylaşayım dedim. Bu yazıdaki konumuz başlığından da anlaşılabileceği gibi injection saldırılarında str_replace filtresinin nasıl bypass edildiği, ve bu bypass’ın nasıl patch edilebileceği. Hadi başlayalım

Örnek olarak hemen sıradan güvenlik açığı olan kodu yazalım :

$uyeadi = $_GET["uyeadi"];
$sorgu = "SELECT * FROM uyeler WHERE nick = '$uyeadi' ";

Buraya kadar herkes tamam. Klasik, basit, sql injectionun cirit attığı bir kod. Hadi bunu str_replace ile kelime filtresinden geçirelim.

$uyeadi = $_GET["uyeadi"];
$yasah = array("'", '"', "select", "from", "union"); // kısa kesiyorum
$uyeadi = str_replace($yasah, "", $uyeadi);
$sorgu = "SELECT * FROM uyeler WHERE nick = '$uyeadi' ";
 
mysql_ bla bla bla...

Şimdi ne yapmış olduk, yasah dizindeki kelimelere rastladığı an null basacak. Ve böylece yasahlı kelime filtrelenmiş(!) olacak. Peki bu filtre nasıl bypass edilebilir? Hadi şimdide ona bakalım

Normal str_replace ile filtrelenmiş haline bakalım ilk önce:
URL:

https://localhost/omer/uyeler.php?uyeadi=omercitak' union select * bla bla bla

Sorgu :

SELECT * FROM uyeler WHERE nick = 'omercitak '

URL kısmında yazdığımız tüm kelimeler filtrelendiğinden hepsi silinecek ve yukarıdaki gibi bir sorgumuz olacak. Görünürde güvenli değil mi? Hayır değil. Hadi bypass edelim

URL :

https://localhost/omer/uyeler.php?uyeadi=omercitak'' ununionion selselectect bla bla bla

Sorgu :

SELECT * FROM uyeler WHERE nick = 'omercitak' union select bla bla bla

Aaa bakın ne oldu. str_replace kelimeleri sadece 1 kez filtreden geçirdiğinden, biz seselectlect gibi bir kelime yollarsak, ortadaki select‘i silip, başındaki se ve sonundaki lect hecelerini birleştiriyor. Böylece bu filtreyi aşmış oluyoruz. Ne kadar da basit değil mi? Ummadığın taş baş yarar demiyorlar boşuna. Gel gelelim patch etme kısmına. İlla bu filtreyi kullanacak kadar str_replace milliyetçisi değilseniz veyahut yazdığınız uygumala illa bunu kullanmanızı gerektirmiyor ise kullanmayın. Injection saldırılarını engellemek için envai çeşit yöntem var. Varsayılımki str_replace kullanmak zorundasınız. Ozaman şöyle birşey yapacaz, sonsuz bir döngü içerisinde sürekli gelen kelime içinden yasah kelimeleri filtreleyip, tekrardan kontrol ettireceğiz; nezamanki bizim yasah kelimelerimizden biri, kelimemizin içinde bulunamadı ozaman döngüyü kırıp son hali ile sorgumuza sokabileceğimiz bir kod yazabiliriz.

İlk önce, kelimemizin içinde yasahlı kelimelerimizden biri var mı yokmu onu bizde döndürecek bir fonsksiyon yazmalıyız. “E zaten pehepe de öyle bir fonksiyon varki” diyenlerinizi duydum. Evet var, strpos. Ama strpos, metin içinde arayacağı kelimeleri bir dizi olarak alamıyor ne yazıkki. Tek bir kelime alabiliyor. Madem tek bir kelime alabiliyor, bizim istediğimizi yapamıyor, ozaman bizde Öz Kardeşler Strpos fonksiyonumuzu yazarız.

function kardesler_strpos($metin, $aranacaklar, $index=0){
 if(!is_array($aranacaklar)):
 $aranacaklar = array($aranacaklar);
 endif;
 foreach($aranacaklar as $kelime):
 if(strpos($metin, $kelime, $index)!==false):
 return true;
 endif;
 endforeach;
 return false;
}

Yukarıdaki kardeşler strpos fonksiyonumuzda gördüğünüz gibi 2. parametresini dizi olarak alabiliyor. ve dizideki değerleri teker teker strpos fonksiyonuna gönderiyor. Eğer hala kelimemizin içinde yasah kelimelerimizden biri varsa true döndürecek. yok ise false. Şimdi bunu nasıl kullanacağız ona bakalım.

// url : https://localhost/omer/uyeler.php?uyeadi=omercitak'' ununionion selselectect bla bla bla
$uyeadi = $_GET["uyeadi"];
$yasah = array("'", '"', "select", "from", "union");
 
while(true):
 if(kardesler_strpos($uyeadi, $yasah)==true):
 $uyeadi = str_replace($yasah, "", $uyeadi);
 else:
 break;
 endif;
endwhile;
 
$sorgu = "SELECT * FROM uyeler WHERE nick = '$uyeadi' ";
// Çıktı : SELECT * FROM uyeler WHERE nick = 'omercitak bla bla bla'

Gördüğünüz gibi yasahlı kelimeler dizimizdeki tüm kelimeler silinene kadar tekrar tekrar str_replace fonksiyonundan geçirdik. Hepinize bol yassahlı listeli, çok güvenli, az yakan çok kaçan kodlamalar ^^

Comments on this post

No comments.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Trackbacks and Pinbacks

No trackbacks.

TrackBack URL