SQL Güvenliği Tehlikede (LFI açığı)

  • Konbuyu başlatan Konbuyu başlatan Dogukan
  • Başlangıç tarihi Başlangıç tarihi
Konu Yazar

Dogukan

Member
May
430
5
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ı :
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ı.';
        } 
?>
Ö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 ;
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ı.';
        } 
?>
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
PHP:
$sayfa = $_GET["sayfa"];
switch ($sayfa) {
case 'clanranking':
include("clanranking.php");
break;
case 'userranking':
include("userranking.php");
break;
default:
include("index.php");
}
tarzında yapabilirsiniz veya
PHP:
$g = array("clanranking","userranking","register");
if (in_array($_GET["sayfalar"],$g)) {
include($_GET["sayfalar"].".php");
}
else {
include("index.php");
}
gibi birçok methodla fixleyebilirsiniz.
 
Son düzenleme:
Cevap: SQL Güvenliği Tehlikede (LFI açığı)

Tabikide switch kullanmak daha mantıklı ancak kısayoldan fixlemek istiyorsaniz en basiti
..
Function sql($text){
$gkod = array("boot","..","/");
$dkod = array("","","");
$ykod = str_replace($gkod,$dkod,$text);
return $ykod;
}

Kullanimi ise ; $sayfa = sql($_GET["sayfa"]);
 
Son düzenleme:
Geri
Üst Alt