@OxyGeN arkadaşımız makaleler arşivinde aspx türleri için injection fixleme işlemini anlatmış.
Bknz : http://www.turkz.org/Forum/makaleler/sql-injection-vulnerability-engelleme.33/
Bizde bu yazımızda php türlerinde Sql injection nasıl kapatılır onu öğreneceğiz. Tavsiyem her zaman şu yöndedir kendi kurduğunuz sisteme her zaman ilk giren açığını bulan kişi olmanızdır.
Konuyu fazla uzatmadan gelelim fixleme işlemine..
Dilerseniz Panel Bypass ile başlayıp örnek fixlenmiş login formunu paylaşalım..
'=' 'or' Ve Diğer Panel Bypasslar için.
PHP:
<?php
$ourLogin = "admin";$ourPassword = "turkz";
session_start();
if ($_SESSION['login']!=$ourLogin && $_SESSION['password']!=$ourPassword) {
if ($_POST['login']==$ourLogin && $_POST['password']==$ourPassword) {
$_SESSION['login'] = $_POST['login'];$_SESSION['password'] = $_POST['password'];header("Location: index.php");
}
else {
echo "
<form action=index.php method=post>
K. Adi :<br>
<input type=text name=login value=''><br>
Gizlilik :<br>
<input type=password name=password value=''><br>
<input type=submit value=' Tamam '>
</form>
";
exit;
}
Lamer düzey Sql Atakları İçin;
KOD:
$injectcheck = preg_replace("[^À-ÿa-zA-Z0-9\\\-\.\,\:\s\r\t\n ]",'',$injectcheck);
Sql Injection Basit Ataklar ( ' -- 'a - * - 9999 vb.) İçin..
Fixlenmiş php kodları aşağıdaki gibidir, sql tehlikesi olan tüm sayfalara include ediniz. Tavsiyem sorgulama & form içeren tüm sayfalardır..
PHP:
function clearMethod($mVar){
if(is_array($mVar)){
foreach($mVar as $gVal => $gVar){
if(!is_array($gVar)){
$mVar[$gVal] = htmlspecialchars(strip_tags(urldecode(mysql_escape_string(addslashes(stripslashes(stripslashes(trim(htmlspecialchars_decode($gVar))))))))); // -> Dizi olmadığını fark edip temizledik.
}else{
$mVar[$gVal] = clearMethod($gVar);
}
}
}else{
$mVar = htmlspecialchars(strip_tags(urldecode(mysql_escape_string(addslashes(stripslashes(stripslashes(trim(htmlspecialchars_decode($mVar))))))))); // -> Dizi olmadığını fark edip temizledik.
}
return $mVar;
}
// Kullanım
$_GET = clearMethod($_GET); // -> GET verilerini temizledik.$_POST = clearMethod($_POST); // -> POST verilerini temizledik.$_SESSION = clearMethod($_SESSION); // -> SESSION verilerini temizledik.$_COOKIE = clearMethod($_COOKIE); // -> COOKIE verilerini temizledik.?>
Basit ataklar bu yönde engellemiş olduk..
Peki bypass engelleme nasıl yapılır?
Mysql_escape_string filtreleme işlemlerini duymuşsunuzdur. Bilmeyenler googleden araştırıp öğrenebilir.. String filtreleme işlemleri bittikten sonra Sql üzerindeki kullanıcı yetkilerini gözden geçiriniz, gereksiz gördüğünüz yetkileri sınırlandırın ve ardından aşağıdaki komutlarla devam edelim..
PHP:
if(!function_exists('stripos')) {
function stripos_clone($haystack, $needle, $offset=0) {
return strpos(strtoupper($haystack), strtoupper($needle), $offset);
}
} else {
function stripos_clone($haystack, $needle, $offset=0) {
return stripos($haystack, $needle, $offset=0);
}
}
if(isset($_SERVER['QUERY_STRING'])) {
$queryString = strtolower($_SERVER['QUERY_STRING']);
if (stripos_clone($queryString,'%select%20') OR stripos_clone($queryString,'%20union%20') OR stripos_clone($queryString,'union/*') OR stripos_clone($queryString,'c2nyaxb0') OR stripos_clone($queryString,'+union+') OR stripos_clone($queryString,'http://') OR stripos_clone($queryString,'https://') OR (stripos_clone($queryString,'cmd=') AND !stripos_clone($queryString,'&cmd')) OR (stripos_clone($queryString,'exec') AND !stripos_clone($queryString,'execu')) OR stripos_clone($queryString,'union') OR stripos_clone($queryString,'concat') OR stripos_clone($queryString,'ftp://')) {
echo base64_decode("c2lrdGlyZ2l0IGFtaW5hIGtvZHVtdSBsYW1lciBpYm5lc2k=");
exit;
}
}
Bugünlük bu kadardı..
Selametle..