Скачать презентацию Arş Gör Oğuzhan YALÇIN ULAK CSIRT PHP İLE Скачать презентацию Arş Gör Oğuzhan YALÇIN ULAK CSIRT PHP İLE

9e526676282b19cb77ac6ef766ac13d4.ppt

  • Количество слайдов: 34

Arş. Gör. Oğuzhan YALÇIN ULAK CSIRT PHP İLE GÜVENLİ KODLAMA Arş. Gör. Oğuzhan YALÇIN ULAK CSIRT PHP İLE GÜVENLİ KODLAMA

İçerik Temel güvenlik problemi “kullanıcıdan gelen veriler…” Kullanıcıdan gelen veriler nasıl gelir ve bu İçerik Temel güvenlik problemi “kullanıcıdan gelen veriler…” Kullanıcıdan gelen veriler nasıl gelir ve bu verilere nasıl erişilir? ○ Erişim problemleri Verilerin kontrol edilmesi ○ Rakamsal değerlerin kontrolü ○ URL’lerin kontrolü ○ IP – Email kontrolü ○ HTML tipli verilerin kontrolü ○ Dosya yollarının kontrolü

İçerik Temel saldırılar ve engelleme yolları ○ Yanıt Parçalama ○ XSS ○ SQL enjeksiyonu İçerik Temel saldırılar ve engelleme yolları ○ Yanıt Parçalama ○ XSS ○ SQL enjeksiyonu ○ Komut Enjeksiyonu ○ Kod Enjeksiyonu Ek Bilgi ve Öneriler ○ Hata Raporlama ○ Veritabanı güvenliği Soru ve Sorunlar….

Verilere erişim Kullanıcıdan gelen veriye erişebilmek için kullanılan evrensel değişkenler… $_POST $_GET $_COOKIE $_FILE Verilere erişim Kullanıcıdan gelen veriye erişebilmek için kullanılan evrensel değişkenler… $_POST $_GET $_COOKIE $_FILE $_SERVER $_ENV $_REQUEST

Erişim Problemleri Sunucu tarafına gelen herhangi tipteki (g/p/c…) parametre değişken olarak kayıt edilir. x. Erişim Problemleri Sunucu tarafına gelen herhangi tipteki (g/p/c…) parametre değişken olarak kayıt edilir. x. php? a=1 (Register Globals) $a=1 Tanımlanmamış (un-initalized) değişkenler sorun oluşturabilir. Nasıl mı?

Erişim Problemleri (Register Globals) //Script. php if(authenticated_user()) $authorized=1; if($authorized) include(‘onemliveri. php’); Script. php? authorized=1 Erişim Problemleri (Register Globals) //Script. php if(authenticated_user()) $authorized=1; if($authorized) include(‘onemliveri. php’); Script. php? authorized=1 ? ?

Korunma yolları Kullanılması gerekmiyorsa: Sunucuda bulunan php. ini dosyası içerisinden kapatmak Kullanılması gerekliyse: Hata Korunma yolları Kullanılması gerekmiyorsa: Sunucuda bulunan php. ini dosyası içerisinden kapatmak Kullanılması gerekliyse: Hata raporlamalarının kısıtlanması Tip duyarlı karşılaştırma if ($authorized===TRUE) {…}

Değerlerin kontrolü Kullanıcı tarafından gelen değeri taşıyan değişkenlerde bulunma olanağı vereceğimiz tipleri belirlemeliyiz. Script Değerlerin kontrolü Kullanıcı tarafından gelen değeri taşıyan değişkenlerde bulunma olanağı vereceğimiz tipleri belirlemeliyiz. Script ya da tag özellikleri ile verdiğimiz değerlere güvenerek hareket etmemeli bunları her durumda kontrol etmeliyiz.

Rakamsal Değerler Bu tür verilerin kontrolü genelde basittir. Tip dönüşümü $gelen=(int)$_GET[‘id’]; $gelen=(float)$_GET[‘id’]; filter_var ile Rakamsal Değerler Bu tür verilerin kontrolü genelde basittir. Tip dönüşümü $gelen=(int)$_GET[‘id’]; $gelen=(float)$_GET[‘id’]; filter_var ile kontrol $gelen=filter_var($_GET[‘id’], FILTER_VALIDATE_INT); $gelen=filter_var($_GET[‘id’], FILTER_VALIDATE_FLOAT);

Metinsel Değerler Ctype ile metin kontrolü if (!ctype_alnum($_GET['login'])) echo “Sadece A-Za-z 0 -9 olabilir. Metinsel Değerler Ctype ile metin kontrolü if (!ctype_alnum($_GET['login'])) echo “Sadece A-Za-z 0 -9 olabilir. "; if (!ctype_alpha($_GET[‘login'])) echo “Sadece A-Za-z olabilir. ";

Metinsel Değerler Türkçe doğrulama (ereg* - preg*) if ( eregi( Metinsel Değerler Türkçe doğrulama (ereg* - preg*) if ( eregi("^[a-zç-şŞÖĞÇİÜı 0 -9/_ . ]*$“, $_GET['login'])) echo “Sadece belirli karakterler olabilir. ";

Metinsel Değerler Filter_var ile metin kontrolü filter_var($var, FILTER_VALIDATE_URL); filter_var($var, FILTER_VALIDATE_IP); filter_var($var, FILTER_VALIDATE_EMAIL); filter_var($var, FILTER_VALIDATE_REGEXP); Metinsel Değerler Filter_var ile metin kontrolü filter_var($var, FILTER_VALIDATE_URL); filter_var($var, FILTER_VALIDATE_IP); filter_var($var, FILTER_VALIDATE_EMAIL); filter_var($var, FILTER_VALIDATE_REGEXP);

Dosya yolları Kullanıcı tarafından gönderilen dosya bilgileri incelenmelidir. // http: //example. com/script. php? path=. Dosya yolları Kullanıcı tarafından gönderilen dosya bilgileri incelenmelidir. // http: //example. com/script. php? path=. . /etc/passwd fopen(“/anadizin/”. $_GET[‘path’], “r”);

Dosya yolları Önceki slayttaki gibi bir saldırıdan korunmak için : $_GET[‘path’] = basename($_GET[‘path’]); fopen(“/anadizin/”. Dosya yolları Önceki slayttaki gibi bir saldırıdan korunmak için : $_GET[‘path’] = basename($_GET[‘path’]); fopen(“/anadizin/”. $_GET[‘path’], “r”);

Başlık Parçalama //yonlendir. php header(“Location: {$_SERVER[‘HTTP_REFERER’]}”); return; $_SERVER[‘HTTP_REFERER’] = “rn. Bye bye content!”; Başlık Parçalama //yonlendir. php header(“Location: {$_SERVER[‘HTTP_REFERER’]}”); return; $_SERVER[‘HTTP_REFERER’] = “rn. Bye bye content!”;

Korunma yolu PHP’yi en son sürümüne yükseltin. Yeni sürümlerde bir seferde birden fazla başlık Korunma yolu PHP’yi en son sürümüne yükseltin. Yeni sürümlerde bir seferde birden fazla başlık bilgisi gönderilemez. Eski sürümler içinse rn bulunup bulunmadığı kontrol edilebilir.

XSS açıkları uygulama kullanıcıdan veri alıp, bunları herhangi bir kodlama ya da doğrulama işlemine XSS açıkları uygulama kullanıcıdan veri alıp, bunları herhangi bir kodlama ya da doğrulama işlemine tabi tutmadan sayfaya göndermesi ile oluşur. XSS saldırganın kurbanın tarayıcısında kullanıcı oturumları bilgilerin çalınmasına, web sitesinin tahrif edilmesine veya solucan yüklenmesine sebep olan betik çalıştırmasına izin verir.

Korunma Yolu htmlspecilachars(); ‘, ”, <, >, & işaretlerini çevirir htmlentities(); Html verisi olarak Korunma Yolu htmlspecilachars(); ‘, ”, <, >, & işaretlerini çevirir htmlentities(); Html verisi olarak kabul edilen herşeyi çevirir. strip_tags(); Tag olarak kabul edilen herşeyi kaldırır.

Korunma Yolu İstenirse strip_tags fonksiyonunun bazı html taglarını kaldırmaması sağlanabilir. $str=strip_tags($_GET[‘veri’], ’<p><b><i><u>’); <u onmouseover= Korunma Yolu İstenirse strip_tags fonksiyonunun bazı html taglarını kaldırmaması sağlanabilir. $str=strip_tags($_GET[‘veri’], ’

’);

SQL Enjeksiyonu Enjeksiyon saldırılarına, özellikle SQLenjeksiyonu, web sitelerinde sıkça rastlanmaktadır. Enjeksiyon kullanıcı tarafından alınan SQL Enjeksiyonu Enjeksiyon saldırılarına, özellikle SQLenjeksiyonu, web sitelerinde sıkça rastlanmaktadır. Enjeksiyon kullanıcı tarafından alınan verinin yorumlayıcıya komut ya da sorgunun bir parçası olarak gönderilmesi durumunda oluşur. Saldırganın düşmanca gönderdiği veriler yorumlayıcının istenmeyen komutları çalıştımasına veya veriyi değiştirmesine sebep olur.

SQL Enjeksiyonu nasıl yapılır En sık kullanılan sql injection sorgu örneği; $str. Sql=“select * SQL Enjeksiyonu nasıl yapılır En sık kullanılan sql injection sorgu örneği; $str. Sql=“select * from kullanicilar where ad=‘$ad’ and sifre=‘$sifre’”; $ad=“‘ or 1=1 --” ya da $ad=“’ or 1=1 /*” olursa $str. Sql=“select * from kullanicilar where ad=‘’ or 1=1 /* and sifre=‘$sifre’”

Korunma Yolları $ad=mysql_real_escape_string($_GET[‘ad’]); $ad=mysql_escape_string($_GET[‘ad’]); $ad=pg_escape_bytea($_GET[‘ad’]); $ad=pg_escape_string($_GET[‘ad’]); Korunma Yolları $ad=mysql_real_escape_string($_GET[‘ad’]); $ad=mysql_escape_string($_GET[‘ad’]); $ad=pg_escape_bytea($_GET[‘ad’]); $ad=pg_escape_string($_GET[‘ad’]);

Korunma Yolları Burada ne yapacağız; //deneme. php $id=mysql_real_escape_string($_GET[‘id’]); mysql_query(“select * from kullanicilar where id=$id”); Korunma Yolları Burada ne yapacağız; //deneme. php $id=mysql_real_escape_string($_GET[‘id’]); mysql_query(“select * from kullanicilar where id=$id”); deneme. php? id=20; delete%20 from%20 kullanicilar

Korunma Yolları Peki ya burada? //deneme. php $id=0 x. BF. 0 x 27; // Korunma Yolları Peki ya burada? //deneme. php $id=0 x. BF. 0 x 27; // ¿’ $id=mysql_real_escape_string($id); // ‘

Korunma Yolları Görünen en iyi çözüm “prepared statements” $DB=new PDO(); $stmt=$DB->prepare(‘insert into users (ad, Korunma Yolları Görünen en iyi çözüm “prepared statements” $DB=new PDO(); $stmt=$DB->prepare(‘insert into users (ad, sifre) values(‘: ad’, ’: sifre’)’); $ad=“asd”; $sifre=“qwe”; $stmt->bindparam(“: ad”, $ad); $stmt->bindparam(“: sifre”, $sifre); $stmt->execute();

Komut Enjeksiyonu $cmd =“mogrify –size {$_POST[‘x’]} x”; $cmd. =“ {$_POST[‘y’]}”; $cmd. = $_FILES[‘image’][‘tmp_name’]; $cmd. Komut Enjeksiyonu $cmd =“mogrify –size {$_POST[‘x’]} x”; $cmd. =“ {$_POST[‘y’]}”; $cmd. = $_FILES[‘image’][‘tmp_name’]; $cmd. = “public_html/“; $cmd. =$_FILES[‘image’][‘name’]; shell_exec($cmd);

Komut Enjeksiyonu $_POST[‘x’]=“rm –rf /*”; $_POST[‘y’]=‘`cat /etc/passwd public_html/p. html; echo 65`’; Komut Enjeksiyonu $_POST[‘x’]=“rm –rf /*”; $_POST[‘y’]=‘`cat /etc/passwd public_html/p. html; echo 65`’;

Korunma Yolları $_POST[‘x’]=“rm –rf /*”; $_POST[‘y’]=‘`cat /etc/passwd public_html/p. html; echo 65`’; escapeshellarg(); escapeshellcmd(); Korunma Yolları $_POST[‘x’]=“rm –rf /*”; $_POST[‘y’]=‘`cat /etc/passwd public_html/p. html; echo 65`’; escapeshellarg(); escapeshellcmd();

Kod Enjeksiyonu Sebep oluşturabilecek noktalar: Include ve require kullanılan yerler. Eval kullanılan yerler. include(“templates/”. Kod Enjeksiyonu Sebep oluşturabilecek noktalar: Include ve require kullanılan yerler. Eval kullanılan yerler. include(“templates/”. $tmpname; //$tmpname=. . /etc/passwd eval(“$value=array(do. Query({$id})); ”); //$id=)); file_put_contents(“exec. php”, ””)

Diğer Öneriler Hata bildirimi Veritabanı güvenliği Diğer Öneriler Hata bildirimi Veritabanı güvenliği

Hata Bildirimi Hata bildirimini methodlar: kapatmak için php. ini içinden display_errors=0 yapmak, Kod içinde Hata Bildirimi Hata bildirimini methodlar: kapatmak için php. ini içinden display_errors=0 yapmak, Kod içinde ini_set(“display_errors”, false) yapmak, Kod içinde error_reporting(0); yazmak Hatalar geliştiriciler için önemlidir. Bu sebeple bir dosyada loglanması uygun olabilir.

Veritabanı güvenliği Her vhost için verilen db şifrelerini vhost’ların sahibine teslim etmek ve kişinin Veritabanı güvenliği Her vhost için verilen db şifrelerini vhost’ların sahibine teslim etmek ve kişinin bir dosya içerisinde tanımlayarak kullanmasını sağlamaktansa şifreyi sadece o site içinde kullanılabilecek ve erişimi kısıtlamayacak şekilde ayarlamalıyız.

Veritabanı güvenliği /vhmysql/deneme/mysql. cnf mysql. default_host=localhost; mysql. default_user=site; mysql. default_password=gizli; //httpd. conf <Virtual. Host Veritabanı güvenliği /vhmysql/deneme/mysql. cnf mysql. default_host=localhost; mysql. default_user=site; mysql. default_password=gizli; //httpd. conf Include /vhmysql/deneme/mysql. cnf

CSIRT yapılan çalışmalar Oğuzhan YALÇIN oguzhanyalcin@gazi. edu. tr http: //viki. csirt. ulakbim. gov. tr CSIRT yapılan çalışmalar Oğuzhan YALÇIN oguzhanyalcin@gazi. edu. tr http: //viki. csirt. ulakbim. gov. tr Kaynaklar; http: //ilia. ws/files/phptek 2007_security. pdf http: //ilia. ws/files/phptek 2007_secpitfalls. pdf http: //www. amazon. com/php-architects-Guide. PHPSecurity/dp/0973862106/ref=sr_1_1? ie=UTF 8& s=books&qid=1196330670&sr=8 -1