Birçok panelde bulunan lfi (local file injection) açığı yüzünden veritabanınız tehlikede. MDF dosyanızın bulunduğu yeri ve adını bilen birisi rahatlıkla dosyanızı çekebilir bir iki düzenleme ile çalışır hale getirebilir. (Başlangıç seviyesindeki kişiler yapamaz.) Uzun zamandır bildiğim bir açık ancak gözlemlemelerime göre birçok kişi copy/paste ile panel hazırladığı için bu açığı görememiş veya php güvenliği konusunda pek bilgisi olmayabilir.
Uzatmadan örnekle göstereyim:
nDesign isimli panel kodlaması :
Örnek : /index.php?sayfa=../../../../../boot.ini?
Çalıştığında;
include("sayfalar/../../../../../boot.ini?.php");
şeklinde include edecektir. ? eklendiği için boot.ini'den sonraki kısmı get methodu ile form gönderilmiş gibi algılayacak ve ekrana boot.ini 'yi yazdıracaktır. Daha fazla ayrıntı vermiyorum. Kritik seviye bir açıktır. Etrafdaki db'lerde birbirine çok benzer (hatta mdf dosyalarının isimleri-bulunduğu yerler aynı) olduğu için özellikle SQL güvenliği dedim. İşi uzatmak istemiyorsanız ;
bu şekilde fixlemeniz mümkündür. Ama kalıcı bir çözüm değildir, sisteminiz güvenlik zafiyeti gösterebilir. Switch-case tarzı fonksiyonlar ile $_GET["sayfa"] için ayrı ayrı atama yapabilirsiniz.
Mesela
tarzında yapabilirsiniz veya
gibi birçok methodla fixleyebilirsiniz.
Uzatmadan örnekle göstereyim:
nDesign isimli panel kodlaması :
PHP:
<?php
$name = $_GET['sayfa'];
$uz = ".php";
if($name=='') {
include ('anasayfa.php');
} elseif(!empty($name) && (file_exists('sayfalar/' . $_GET['sayfa'])) . '.php') {
include("sayfalar/$name.php");
}
elseif($name==$name&&$uz) {
include('sayfalar/'.$name.'');
} else {
echo 'Aradığınız Sayfa Bulunamadı.';
}
?>
Çalıştığında;
include("sayfalar/../../../../../boot.ini?.php");
şeklinde include edecektir. ? eklendiği için boot.ini'den sonraki kısmı get methodu ile form gönderilmiş gibi algılayacak ve ekrana boot.ini 'yi yazdıracaktır. Daha fazla ayrıntı vermiyorum. Kritik seviye bir açıktır. Etrafdaki db'lerde birbirine çok benzer (hatta mdf dosyalarının isimleri-bulunduğu yerler aynı) olduğu için özellikle SQL güvenliği dedim. İşi uzatmak istemiyorsanız ;
PHP:
<?php
$name = $_GET['sayfa'];
$uz = ".php";
$name = str_replace('.','',$name);
$name = str_replace('\\','',$name);
$name = str_replace('\/','',$name);
if($name=='') {
include ('anasayfa.php');
} elseif(!empty($name) && (file_exists('sayfalar/' . $_GET['sayfa'])) . '.php') {
if (!include("sayfalar/$name.php")){
include('anasayfa.php');
}
}
elseif($name==$name&&$uz) {
include('sayfalar/'.$name.'');
} else {
echo 'Aradığınız Sayfa Bulunamadı.';
}
?>
Mesela
PHP:
$sayfa = $_GET["sayfa"];
switch ($sayfa) {
case 'clanranking':
include("clanranking.php");
break;
case 'userranking':
include("userranking.php");
break;
default:
include("index.php");
}
PHP:
$g = array("clanranking","userranking","register");
if (in_array($_GET["sayfalar"],$g)) {
include($_GET["sayfalar"].".php");
}
else {
include("index.php");
}
Son düzenleme: