Professional Documents
Culture Documents
PHP İle Güvenlik
PHP İle Güvenlik
$name = $_POST['username'];
$pass = $_POST['pass'];
$sorgu = mysql_query("SELECT Count(id) FROM users WHERE name='$name' AN
D pass='$pass';");
$name = mysql_real_escape_string($_POST['username']);
$pass = mysql_real_escape_string($_POST['pass']);
$sorgu = mysql_query("SELECT Count(id) FROM users WHERE name='$name' AN
D pass='$pass';");
Şimdi bu fonksiyon ile süzülen veri, SQL sorgusuna nasıl yansır ona bakalım;
Gördüğünüz gibi ' ve " karakterleri hemen escape ediliyor. Yani \' \" şeklinde
kaydolduğu için, SQL sorgusu olmaktan çıkıp string olduğunu mySQL’e bildirmiş
oluyoruz. SQL Injection’dan kurtulduk mu peki bu kadarıyla? Tabii ki hayır.
Siz de bilirsiniz ki, SQL sorgularını sadece login’de kullanmıyoruz. O yüzden
önemli bir örneği vermeden geçemeyeceğim.
Şimdi escape fonksiyonumuzun ismine bir göz atalım.
mysql_real_escape_string(); Yani bu fonksiyon, sadece string türünü destekler.
Eee, bizler http://site.com/index.php?topic_no=12312312 olarak gelen integer
türündeki verileri nasıl süzeceğiz öyle ise? Bu da çok basittir. Ancak bu bilgiyi
atlarsanız, bütün DB bilgilerinizi çalarlar ama haberiniz olmaz.
$topic_no = $_GET['topic_no'];
Dersek, SQL sorgumuzda yine ' " gibi karakterlerle saldırıya uğrarız. O yüzden
doğrusu bu şekilde olmalıdır.
$topic_no = intval($_GET['topic_no']);
$topic_no = str_replace("-","",$topic_no);
$ayar['db']['host'] = 'localhost';
$ayar['db']['name'] = 'veritabani_adi';
$ayar['db']['user'] = 'username';
$ayar['db']['pass'] = 'pass';
Adam böyle bir dosyayı açtığı gibi bilgiler eline hemen geçer. O yüzden
şifreleme metoduyla şifreleyin. Daha sonra da şifrelenmiş metni çözerek
eval($cozulmus_config_dosyası) deyince, yine aynı dosyanın içindekileri almış olur
ve PHP’ye o değişkenleri tanıtmış olursunuz.
Bu kısımları geçtikten sonra RFI nasıl yersiniz dersek, şöyle olabilir. Mesela
index sayfamızdan bütün sayfaları çağırıyoruz diyelim.
http://site.com/index.php?sayfa=Anasayfa
http://site.com/index.php?sayfa=Iletisim
http://site.com/index.php?sayfa=Forum
http://site.com/index.php?sayfa=Sikayet
$sayfa = $_GET['sayfa'];
include($sayfa . ".php");
Böyle bir kod ile biz GET ile gelen veriye ne yazarsak yazalım. Onu include
edecektir. Adam da gelir shell adresini oraya yazar ve shell yükler sunucunuza. Tabi
SAFE MODE kapalı ise hackler sitenizi. Doğrusu şöyle olmalı;
http://site.com/index.php?cat_name=Belgesel
http://site.com/index.php?cat_name=<script>alert(document.cookie)</script>
Böyle bir linke çeviririz. Siz de direk olarak süzmeden sayfaya bunu
yazdırırsanız, otomatik olarak sayfada bu Javascript kodu çalışacaktır. Veya diyelim
ki, bir yorum yazdıracaksınız. HTML verilerini muhakkak süzmeniz gerekmektedir.
Yoksa adam yorum yazarken;
<script>location='http://www.hebelehubele.com/index.php';</script>
$_SESSION['login'] = "1";
$_SESSION['tip'] = "admin";
Adam hangi sayfaya girerse girsin hiçbir sorgulama yapmaksızın direk olarak
adminliği ilan etmiş oluyor. SESSION değiştirilemez sanan arkadaşlar, SESSION’u
ben de değiştirilemeyeceğini sanıyordum ancak değiştirilebildiğini öğrendiğimden
beri, gözümde COOKIE kadar değeri kaldı. Bunu nasıl değiştirildiğine dair ufak
bilgilendirme yapacağım. Muhakkak süzmekte fayda var SESSION bilgilerini de.
SESSION değişmesi için öncelikle aynı sunucudan bir başka kullanıcının sizin
SESSION değerlerinizi bilmesi gerekir.
$_SESSION['login'] = '1';
$_SESSION['tip'] = 'admin';
header('Location: http://hackleneceksite.com/admin.php');
• Nerelere bulaşır?
• index, home, main, default kelimeleri geçen tüm dosyalarınıza bulaşır.
• Kurtuluşu nedir?
• Crackli ftp programlarını kaldırın, FTP şifrenizi değiştirin, dosyalarınızın
içinde bulaşan kodları silin, Windows’un kendi FTP bağlantısını kullanın. Eğer
sorun çözülmezse format atın tekrar baştan itibaren aynı işlemleri yapın. Yine
sorun çözülmezse hosting sağlayıcınızla görüşün ve onlar çözsünler
sorununuzu.
http://hackleneceksite.com/my_profil...=profiledelete
http://hackleneceksite.com/my_profil...te&submit=true
böyle birer input olsun. Bu adreste siteden memnun değil isek sitenin bize tanıdığı bir
hak olsun profilimizi silmek için. Burada posttan gelen check true ise ve email
girilmiş ise, hemen profili silme işlemine geçiyor diyelim. O zaman biz de bir form
oluşturalım bir html sayfasında şu şekilde;
Biz eğer kullanıcının bilgilerinden emailini biliyorsak;