php ile güvenli kod geliştirme
TRANSCRIPT
-
8/14/2019 Php ile gvenli kod gelitirme
1/34
Ar. Gr. Ouzhan YALIN
ULAK CSIRT
-
8/14/2019 Php ile gvenli kod gelitirme
2/34
erikTemel gvenlik problemi kullancdan
gelen verilerKullancdan gelen veriler nasl gelir ve bu
verilere nasl eriilir? Eriim problemleri
Verilerin kontrol edilmesi Rakamsal deerlerin kontrol URLlerin kontrol IP Email kontrol HTML tipli verilerin kontrol Dosya yollarnn kontrol
-
8/14/2019 Php ile gvenli kod gelitirme
3/34
erik
Temel saldrlar ve engelleme yollarYant Paralama XSS
SQL enjeksiyonu Komut Enjeksiyonu Kod Enjeksiyonu
Ek Bilgi ve neriler Hata Raporlama Veritaban gvenlii
Soru ve Sorunlar.
-
8/14/2019 Php ile gvenli kod gelitirme
4/34
Verilere eriim
Kullancdan gelen veriyeeriebilmek iin kullanlan evrensel
deikenler$_POST
$_GET
$_COOKIE$_FILE
$_SERVER
$_ENV
$_REQUEST
-
8/14/2019 Php ile gvenli kod gelitirme
5/34
Eriim Problemleri (RegisterGlobals)
Sunucu tarafna gelen herhangitipteki (g/p/c) parametre
deiken olarak kayt edilir.x.php?a=1 $a=1
Tanmlanmam (un-initalized)deikenler sorun oluturabilir.Nasl m?
-
8/14/2019 Php ile gvenli kod gelitirme
6/34
Eriim Problemleri (RegisterGlobals)
//Script.php
if(authenticated_user())
$authorized=1;if($authorized)
include(onemliveri.php);
Script.php?authorized=1 ????
-
8/14/2019 Php ile gvenli kod gelitirme
7/34
Korunma yollar
Kullanlmas gerekmiyorsa:
Sunucuda bulunan php.ini dosyas
ierisinden kapatmakKullanlmas gerekliyse:
Hata raporlamalarnn kstlanmas
Tip duyarl karlatrma
if ($authorized===TRUE) { }
-
8/14/2019 Php ile gvenli kod gelitirme
8/34
Deerlerin kontrol
Kullanc tarafndan gelen deeritayan deikenlerde bulunma
olana vereceimiz tipleribelirlemeliyiz.
Script ya da tag zellikleri ile
verdiimiz deerlere gvenerekhareket etmemeli bunlar herdurumda kontrol etmeliyiz.
-
8/14/2019 Php ile gvenli kod gelitirme
9/34
-
8/14/2019 Php ile gvenli kod gelitirme
10/34
Metinsel Deerler
Ctype ile metin kontrol
if (!ctype_alnum($_GET['login']))echo Sadece A-Za-z0-9 olabilir.";
if (!ctype_alpha($_GET[login']))
echo Sadece A-Za-z olabilir.";
-
8/14/2019 Php ile gvenli kod gelitirme
11/34
Metinsel Deerler
Trke dorulama (ereg* - preg*)
if ( eregi("^[a-z-0-9/_ \.]*$,$_GET['login']))echo Sadece belirli karakterler
olabilir.";
-
8/14/2019 Php ile gvenli kod gelitirme
12/34
Metinsel Deerler
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 REGE
-
8/14/2019 Php ile gvenli kod gelitirme
13/34
Dosya yollar
Kullanc tarafndan gnderilen dosyabilgileri incelenmelidir.
// http://example.com/script.php?path=../../etc/passwd
fopen(/anadizin/.$_GET[path], r);
-
8/14/2019 Php ile gvenli kod gelitirme
14/34
Dosya yollar
nceki slayttaki gibi bir saldrdankorunmak iin :
$_GET[path] =basename($_GET[path]);
fopen(/anadizin/.$_GET[path], r);
-
8/14/2019 Php ile gvenli kod gelitirme
15/34
Balk Paralama
//yonlendir.phpheader(Location:{$_SERVER[HTTP_REFERER]});
return;
$_SERVER[HTTP_REFERER] =
\r\n\r\nBye bye content!;
-
8/14/2019 Php ile gvenli kod gelitirme
16/34
Korunma yolu
PHPyi en son srmne ykseltin.Yeni srmlerde bir seferde birden
fazla balk bilgisi gnderilemez.
Eski srmler iinse \r\n bulunup
bulunmad kontrol edilebilir.
-
8/14/2019 Php ile gvenli kod gelitirme
17/34
XSS XSS aklar uygulama kullancdan
veri alp, bunlar herhangi bir kodlamaya da dorulama ilemine tabitutmadan sayfaya gndermesi ile
oluur.
XSS saldrgann kurbann taraycsndakullanc oturumlar bilgilerin
alnmasna, web sitesinin tahrifedilmesine veya solucanyklenmesinesebep olan betik altrmasna izin
verir .
-
8/14/2019 Php ile gvenli kod gelitirme
18/34
Korunma Yolu
htmlspecilachars(); ,,,& iaretlerini evirir
htmlentities(); Html verisi olarak kabul edilen hereyi
evirir.
strip_tags();Tag olarak kabul edilen hereyi
kaldrr.
-
8/14/2019 Php ile gvenli kod gelitirme
19/34
Korunma Yolu
stenirse strip_tags fonksiyonunun bazhtml taglarn kaldrmamas salanabilir.
$str=strip_tags($_GET[veri],
);
-
8/14/2019 Php ile gvenli kod gelitirme
20/34
SQL Enjeksiyonu
Enjeksiyon saldrlarna, zellikleSQLenjeksiyonu, web sitelerindeska rastlanmaktadr. Enjeksiyon
kullanc tarafndan alnan verininyorumlaycya komut ya dasorgunun bir paras olarakgnderilmesi durumunda oluur.
Saldrgann dmanca gnderdiiveriler yorumlaycnn istenmeyenkomutlar altmasna veya veriyideitirmesine sebep olur.
-
8/14/2019 Php ile gvenli kod gelitirme
21/34
SQL Enjeksiyonu naslyaplrEn sk kullanlan sql injection sorgu
rnei;$strSql=select * from kullanicilar
where ad=$ad and sifre=$sifre;$ad= or 1=1-- ya da$ad= or 1=1 /* olursa
$strSql=select * from kullanicilarwhere ad= or 1=1 /* andsifre=$sifre
-
8/14/2019 Php ile gvenli kod gelitirme
22/34
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]);
-
8/14/2019 Php ile gvenli kod gelitirme
23/34
Korunma YollarBurada ne yapacaz;
//deneme.php
$id=mysql_real_escape_string($_GET[id]);
mysql_query(select * from kullanicilarwhere id=$id);
deneme.php?id=20;delete%20from%20kullanicilar
-
8/14/2019 Php ile gvenli kod gelitirme
24/34
Korunma Yollar
Peki ya burada?
//deneme.php
$id=0xBF . 0x27; //
$id=mysql_real_escape_string($id); //
-
8/14/2019 Php ile gvenli kod gelitirme
25/34
Korunma Yollar
Grnen en iyi zm preparedstatements$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();
-
8/14/2019 Php ile gvenli kod gelitirme
26/34
-
8/14/2019 Php ile gvenli kod gelitirme
27/34
Komut Enjeksiyonu
$_POST[x]=rm rf /*;
$_POST[y]=`cat /etc/passwdpublic_html/p.html; echo 65`;
-
8/14/2019 Php ile gvenli kod gelitirme
28/34
Korunma Yollar
$_POST[x]=rm rf /*;$_POST[y]=`cat /etc/passwdpublic_html/p.html; echo 65`;
escapeshellarg();
escapeshellcmd();
-
8/14/2019 Php ile gvenli kod gelitirme
29/34
Kod Enjeksiyonu
Sebep oluturabilecek noktalar:Include ve require kullanlan yerler.Eval kullanlan yerler.
include(templates/.$tmpname;//$tmpname=../../../../etc/passwdeval($value=array(doQuery({$id}));
);//$id=));file_put_contents(exec.php,)
-
8/14/2019 Php ile gvenli kod gelitirme
30/34
Dier neriler
Hata bildirimiVeritaban gvenlii
-
8/14/2019 Php ile gvenli kod gelitirme
31/34
Hata Bildirimi
Hata bildirimini kapatmak iinmethodlar:php.ini iinden display_errors=0
yapmak,Kod iinde
ini_set(display_errors,false) yapmak,Kod iinde error_reporting(0); yazmak
Hatalar gelitiriciler iin nemlidir.Bu sebeple bir dosyada loglanmasuygun olabilir.
-
8/14/2019 Php ile gvenli kod gelitirme
32/34
Veritaban gvenlii
Her vhost iin verilen db ifrelerinivhostlarn sahibine teslim etmekve kiinin bir dosya ierisinde
tanmlayarak kullanmasnsalamaktansa ifreyi sadece o siteiinde kullanlabilecek ve eriimikstlamayacak ekildeayarlamalyz.
-
8/14/2019 Php ile gvenli kod gelitirme
33/34
Veritaban gvenlii
/vhmysql/deneme/mysql.cnfmysql.default_host=localhost;mysql.default_user=site;
mysql.default_password=gizli;
//httpd.conf
Include /vhmysql/deneme/mysql.cnf
-
8/14/2019 Php ile gvenli kod gelitirme
34/34
CSIRT yaplan almalar
Ouzhan [email protected]://viki.csirt.ulakbim.gov.tr
Kaynaklar; http://ilia.ws/files/phptek2007_security.pd http://ilia.ws/files/phptek2007_secpitfalls. http://www.amazon.com/php-architects-G
mailto:[email protected]://viki.csirt.ulakbim.gov.tr/http://ilia.ws/files/phptek2007_security.pdfhttp://ilia.ws/files/phptek2007_secpitfalls.pdfhttp://www.amazon.com/php-architects-Guide-PHP-Security/dp/0973862106/ref=sr_1_1?ie=UTF8&s=books&qid=1196330670&sr=8-1http://www.amazon.com/php-architects-Guide-PHP-Security/dp/0973862106/ref=sr_1_1?ie=UTF8&s=books&qid=1196330670&sr=8-1http://ilia.ws/files/phptek2007_secpitfalls.pdfhttp://ilia.ws/files/phptek2007_security.pdfhttp://viki.csirt.ulakbim.gov.tr/mailto:[email protected]