Xss ye Karşı Güvenlik Önlemleri
Alt 17. July 2007, 03:07   #1 (permalink)
EDMİNİSTIR
 
ghostroot - ait Kullanıcı Resmi (Avatar)
 
ghostroot isimli Üye şimdilik offline konumundadır
Üyelik tarihi: Jun 2007
Uye No: 38
Mesajlar: 34

Seviye: 4 [Seviye DurumuSeviye DurumuSeviye Durumu]
Aktiflik: 0 / 89
Güç: 11 / 380
Deneyim: 59%


Ettiği Teşekkür: 0
9 Mesajına 10 Kere Teşekkür Edlidi
Tepki Sayısı: 0
4 Mesajına 5 Kere Tepki Gösterildi
ghostroot will become famous soon enough
Tecrübe Puanı: 20
Xss ye Karşı Güvenlik Önlemleri

Xss ye Karşı Güvenlik Önlemleri
Bu makaleyi okuyan PHP kod yazarları;
- XSS'in ne olduğunu,
- Çerezlerin (cookie) çalışma şeklini,
- XSS'den rahatça nasıl korunabileceklerini öğrenecekler.
XSS Nedir?
XSS (Cross Site Scripting - Çapraz Kod Çalıştırma) kısaca, HTML ve JavaScript yardımıyla bir sitede, siteye giren kullanıcıya tehlike arz edecek şekilde kod çalıştırmaya denir. Ziyaretçilerinizden bilgi almak amaçlı ya da onlara ait hesapları tekrar tekrar şifre girmeden kullanmaları için yollamış olduğunuz çerezleri -cookies- XSS yardımıyla çalabilirler ve kendilerini, sisteme o ziyaretçiymiş gibi gösterebilirler.

Çerezler Nasıl Çalışır?
Bir çerez, istemci -yani siz- tarafında herhangi bir bilgiyi, oturum numarasını vs. saklamaya yarayan ve sadece kendisinin yollandığı alan adı (domain) için bilgilerini veren bir araçtır denilebilir. Yani herhangi bir siteye girdiğinizde, karşı taraftan size bilgilerinizi tutmak için bir çerez yollanabilir. (Eğer tarayıcınızın güvenlik ayarları çok sıkı değilse, otomatik olarak kabul ediecektir bu çerezler )

Kullanım alanları, genel olarak kullanıcı bilgileri ya da sizin karşı taraftaki oturum numaranızı karşılaştırmak içindir. Bu noktada, karşı tarafın, sizin diğer çerezlerinizin içindeki bilgileri ele geçirmenizden şüphe edebilirsiniz belki; ancak başta da bahsettiğimiz gibi, tarayıcılar sadece çerezi isteyen yerin alan adı ve dosya yolu (örn. [Yalnızca Kayıtlı Üyeler Linkleri Görebilir. Ücretsiz Üye Olmak İçin Tıklayınız!] adresine ayarlı bir çerez, asla [Yalnızca Kayıtlı Üyeler Linkleri Görebilir. Ücretsiz Üye Olmak İçin Tıklayınız!] adresine yollanmaz) uyuşuyorsa bu bilgileri yollarlar, olağanüstü bir durum dışında bu bir güvenlik sorununa yol açmaz

XSS Nasıl Çalışır?
Bu yazının tehlikeli işler yapmaya meyilli olan kişiler tarafından da okunma ihitmali olduğu için açık açık anlatım yoluna gitmeyi düşünmüyorum Şöyle bir gözden geçirecek olursak;

JavaScript dilinde çerezleri yönetmeyi sağlayan bir cookie yöntemi bulunmaktadır. (yani; document.cookie) Bu yöntem yardımıyla sayfaya ait olan çerezler alınıp, okunabilir ve değiştirilebilir. [1] XSS açıklarından yararlanan kötü niyetli kişiler de, JavaScript'in bu özelliğinden yararlanarak sayfayı gezen kullanıcının çerez bilgilerini alıp, kendilerininkiyle değiştirmeye çalışırlar. Bu nedenle XSS açığı bulunan herhangi bir sayfayı gezen ziyaretçinin, eğer ilgili sayfadan bir hesabı da varsa çok dikkatli olması gerekmektedir; bunun yanında site sahiplerinin de bu konuda ciddi şekilde önlem almaları, olayların patlak vermesini de engeller. Çözüm yollarına birazdan değineceğiz...

[1] PHP'nin yeni sürümleriyle beraber gelen, HTTP başlıklarındaki Set-Cookie özelliğine eklenecek olan bir HttpOnly deyimiyle, tarayıcılar deyimin geçtiği çerezi JavaScript yoluyla almayacak/göstermeyecektir...

Şimdi bu saldırılardan nasıl korunulacağımızı öğrenelim...

Koruma Yolları Nelerdir?
Yukarıda bahsettiğimiz XSS saldırılarından iyi bir şekilde korunabilmek için, öncelikle kullanıcı tarafından gelen bilgileri nasıl filtreleyebileceğimizi düşünelim... Çerez çalmak için gerekli olan kodun çalıştırılması için, öncelikle <script></script> etiketleri (tags) arasına yazılması gerekir ki, buradan HTML etiklerinde kullanılması zorulu olan < ve > karakterlerini düzgünce filtrelemenin, sorunumuzun büyük bir kısmı çözebileceğimiz anlamına gelir. O hâlde:

<?php
htmlentities($xss_potansiyelli_veri);
// htmlentities() fonksiyonu, kendisine parametre olarak
// konulmuş verinin içindeki <, >, & gibi karakterleri
// '<', '>' gibi pratikte zararsız, HTML sayfada ise
// normal görünecek karakter gruplarıyla değiştirir.
// Daha fazla koruma için ikinci parametre olarak
// 'ENT_QUOTES' diyebilir ve tırnak işaretlerini de
// filtreleyebiliriz...
// (bkz. php.net/htmlentities)
?>


gibi birşeyler yapalım Peki sadece bu tek fonksiyon yeterli olabilir mi? Aslında, hayır... URL adresinden yollanacak olan bilgiler, herhangi bir ASCII karakterinin onaltılık (hexadecimal) formatında da olabileceği için (örn. boşluk için %20 gibi) bu işlemi atlatabilir. İşimizi sağlama almak için, URL'den gelen ASCII formatındaki bilgiler de dahil olmak üzere, gönderilen veriyi normal hâline getiren urldecode() fonksiyonunu kullanabiliriz:

<?php
htmlentities(urldecode($xss_potansiyelli_veri));
?>



Peki bu yeterli mi? Bazen, verinin kullanıldığı yere göre, farklı filtrelemeler yapmamız gerekebilir. Bu tür filtrelemeler için quote****() [2] ve addslashes() [3] fonksiyonları biçilmiş kaftandır. Tüm bunları göz önüne alarak, aşağıdaki gibi bir fonksiyon yazalım:

[2] . \ + * ? [ ^ ] ( $ ) karakterlerinin önüne \ (backslash) karakteri koyar.
[3] Tırnak işaretinin önüne \ karakteri koyar.

<?php
function dataFilter($data, $mod = 1, $op = 0) {
// Öntanımlı fonksiyon çalışma düzeyini 1, seçeneği 0 olarak ayarladık.
$data = urldecode($data);
// Güvenli filtreleme için URL'den gelen veriyi çözdük.

if($mod == 0) {
// Düzey 0 ise; sadece çözülmüş hâlini döndür:
return $data;
} else if($mod == 1) {
// Düzey 1 ise; htmlentities() uygulanmış hâlini döndür,
// Seçenek 1 ise; fonksiyonun tırnakları da filtrelemesini sağla:
return ($op == 0) ? htmlentities($data) : htmlentities($data, ENT_QUOTES);
} else if($data == 2) {
// Düzey 2 ise; sadece quote****() uygulanmış hâlini döndür,
// Seçenek 1 ise; htmlentities()'i de ekle,
// Seçenek 2 ise; tırnakları da filtrele:
return ($op == 0) ? quote****($data) :
(($op == 2) ? htmlentities(quote****($data), ENT_QUOTES) : htmlentities(quote****($data)));
} else if($mod == 3) {
// Düzey 3 ise; addslashes() uygulanmış hâlini döndür,
// Seçenek 1 ise; addslashes()\'a quote****() fonksiyonunu da ekle,
// Seçenek 2 ise; seçeneksiz duruma htmlentities() fonksiyonunu ekle,
// Seçenek 3 ise; 1. seçeneğe htmlentities() fonksiyonunu ekle:
if($op == 0)
return addslashes($data);
else if($op == 1)
return addslashes(quote****($data));
else if($op == 2)
return htmlentities(addslashes($data));
else if($op == 3)
return htmlentities(addslashes(quote****($data)));
}
}
?>



(Bu fonksiyonda bahsettiğimiz bilgilere bir de çalışma düzeyi ekleyerek hepsini bir arada kullanmayı amaçladım, daha farklı alanlarda tek fonksiyonla idare edilebilsin diye )
Yukarıdaki fonksiyonu daha genel bir şekilde yazının devamında kullanacağız, ancak ondan önce kullanımı hakkında kısa birkaç örnek;
- dataFilter($veri, 1): $veri değişkenine htmlentities() uygulanır. Ortalama bir filtreleme.
- dataFilter($veri, 2, 2): Tırnakların da htmlentities() ile filtrelendiği, quote****()'nın kullanıldığı bir düzey seçeneği... Çok fazla karakter filtrelediği için her veride kullanmanız sorun çıkarabilir.
- dataFilter($veri, 3, 3): Bahsettiğimiz tüm fonksiyonların kullanıldığı paranoyakça bir filtreleme Çok fazla gerek duyucağınızı sanmıyorum, genelde sorun çıkarır hepsi bir arada olunca

Kullanıcıdan Alınan $_POST ve $_GET Dizileri
Yazımızın bu son kısımında, hem yukarıda yazdığımız işe yarar ama çok karışık -kim ezberler ki zaten? - fonksiyonumuzu kullanabileceğimiz, hem de kullanıcıdan gelen iki önemli diziyi nasıl filtreleyeceğimizi göstereceğiz...

O hâlde;
- Bu iki sabit diziyi dataFilter() fonksiyonumuzun htmlentities() ve addslashes() fonksiyonlarının kullanıldığı çalışma düzeyinde filtreleyelim ve
- $_POSTS, $_GETS isimlerinde filtrelenmiş veriyi saklayan bir dizi oluşturalım:

<?php
$_GETS = array();
$_POSTS = array();

foreach($_GET as $key => $value) {
$_GETS[$key] = dataFilter($value, 3, 2);
}

foreach($_POST as $key => $value) {
$_POSTS[$key] = dataFilter($value, 3, 2);
}
?>



---

Yazdığım ilk uzun makale olduğu için bazı kısımları anlaşılmaz -heyecandan tabi :P- olabilir, sorularınızı yorumlar yardımıyla iletebilirsiniz...

yazar:Yns
  Alıntı ile Cevapla

Alt 12. September 2007, 13:43   #2 (permalink)
Misafir
 
cyntax - ait Kullanıcı Resmi (Avatar)
 
cyntax isimli Üye şimdilik offline konumundadır
Üyelik tarihi: Sep 2007
Uye No: 398
Mesajlar: 2

Seviye: 1 [Seviye Durumu]
Aktiflik: 0 / 0
Güç: 0 / 2
Deneyim: 2%


Ettiği Teşekkür: 0
0 Mesajına 0 Kere Teşekkür Edlidi
Tepki Sayısı: 0
0 Mesajına 0 Kere Tepki Gösterildi
cyntax is an unknown quantity at this point
Tecrübe Puanı: 0
Kodları Anlamaya çalıştım ; Ama Anlamaya Çalışırken Kafamı Karştıran Anlamsızlığı Bulmaya Çalıştım :P

Herneyse Bnm Sorunum BoastMachine 3.0 Platiunm daki search.php den yapılan sorgulama da

Kod:
="><script>alert(document.cookie)</script>
Verdiği md5 password ve username e nsl bir önlem alacağım bu konuyla?

Servern PHP versiyonu da zannedersem 4.4.7 idi; Bu sürüme uygunmdr?

Gerçekten çok yararlı bir döküman çok teşekkür ettm; Mümkünse Bu Soruya da Bir çözüm getirebilirsek sevineceğim..

# trianextern ( not cyntax (= ]
  Alıntı ile Cevapla

Alt 12. September 2007, 13:55   #3 (permalink)
Super Moderator
 
BatuCynic - ait Kullanıcı Resmi (Avatar)
 
BatuCynic isimli Üye şimdilik offline konumundadır
Üyelik tarihi: Jun 2007
Uye No: 42
Mesajlar: 275

Seviye: 15 [Seviye DurumuSeviye DurumuSeviye DurumuSeviye DurumuSeviye Durumu]
Aktiflik: 36 / 362
Güç: 91 / 1528
Deneyim: 51%


Ettiği Teşekkür: 5
13 Mesajına 14 Kere Teşekkür Edlidi
Tepki Sayısı: 1
2 Mesajına 2 Kere Tepki Gösterildi
Blog Entries: 1
BatuCynic will become famous soon enoughBatuCynic will become famous soon enough
Tecrübe Puanı: 4
Teşekkürler, çok bilgilendirdin walla... Ama bu Xss nasıl birşey biz bundan neden korunmamız gerekiyor???
__________________
ALWaYs FoR YoU!!!

Vatanımın ha ekmeğini yemişim, ha uğruna bir kurşun!...


  Alıntı ile Cevapla

Alt 12. September 2007, 14:31   #4 (permalink)
Administrator
 
lad_boy - ait Kullanıcı Resmi (Avatar)
 
lad_boy isimli Üye şimdilik offline konumundadır
Üyelik tarihi: Jun 2007
Uye No: 16
Yaş: 16
Mesajlar: 1,408
Takım:

Seviye: 32 [Seviye Durumu]
Aktiflik: 234 / 780
Güç: 469 / 3310
Deneyim: 21%


Ettiği Teşekkür: 25
44 Mesajına 57 Kere Teşekkür Edlidi
Tepki Sayısı: 1
10 Mesajına 12 Kere Tepki Gösterildi
lad_boy has a reputation beyond reputelad_boy has a reputation beyond reputelad_boy has a reputation beyond reputelad_boy has a reputation beyond reputelad_boy has a reputation beyond reputelad_boy has a reputation beyond reputelad_boy has a reputation beyond reputelad_boy has a reputation beyond reputelad_boy has a reputation beyond reputelad_boy has a reputation beyond reputelad_boy has a reputation beyond repute
Tecrübe Puanı: 20
paylaşımın çok güzel bilgilendirdiğin için saol ama bende batuya katılıorum
__________________
http://www.dosyaarsivi.com/image.php?type=sigpic&userid=16&dateline=1207566257
  Alıntı ile Cevapla

Alt 12. September 2007, 14:51   #5 (permalink)
Edministıratority işte öle bişi yaff
 
GrapH4N - ait Kullanıcı Resmi (Avatar)
 
GrapH4N isimli Üye şimdilik offline konumundadır
Üyelik tarihi: Jul 2007
Uye No: 59
Mesajlar: 1,459
Takım:

Seviye: 32 [Seviye DurumuSeviye Durumu]
Aktiflik: 237 / 791
Güç: 486 / 3232
Deneyim: 67%


Ettiği Teşekkür: 29
40 Mesajına 59 Kere Teşekkür Edlidi
Tepki Sayısı: 4
19 Mesajına 25 Kere Tepki Gösterildi
Blog Entries: 1
GrapH4N has a reputation beyond reputeGrapH4N has a reputation beyond reputeGrapH4N has a reputation beyond reputeGrapH4N has a reputation beyond reputeGrapH4N has a reputation beyond reputeGrapH4N has a reputation beyond reputeGrapH4N has a reputation beyond reputeGrapH4N has a reputation beyond reputeGrapH4N has a reputation beyond reputeGrapH4N has a reputation beyond reputeGrapH4N has a reputation beyond repute
Tecrübe Puanı: 20
hackten anlamayanlar lütfen konuya lüzusuz cwp atmaktan kaçınınız
__________________



grapH4N ®

  Alıntı ile Cevapla

Alt 12. September 2007, 14:56   #6 (permalink)
EDMİNİSTIR
 
ghostroot - ait Kullanıcı Resmi (Avatar)
 
ghostroot isimli Üye şimdilik offline konumundadır
Üyelik tarihi: Jun 2007
Uye No: 38
Mesajlar: 34

Seviye: 4 [Seviye DurumuSeviye DurumuSeviye Durumu]
Aktiflik: 0 / 89
Güç: 11 / 380
Deneyim: 59%


Ettiği Teşekkür: 0
9 Mesajına 10 Kere Teşekkür Edlidi
Tepki Sayısı: 0
4 Mesajına 5 Kere Tepki Gösterildi
ghostroot will become famous soon enough
Tecrübe Puanı: 20
Alıntı:
cyntax´isimli üyeden Alıntı Mesajı göster
Kodları Anlamaya çalıştım ; Ama Anlamaya Çalışırken Kafamı Karştıran Anlamsızlığı Bulmaya Çalıştım :P

Herneyse Bnm Sorunum BoastMachine 3.0 Platiunm daki search.php den yapılan sorgulama da

Kod:
="><script>alert(document.cookie)</script>
Verdiği md5 password ve username e nsl bir önlem alacağım bu konuyla?

Servern PHP versiyonu da zannedersem 4.4.7 idi; Bu sürüme uygunmdr?

Gerçekten çok yararlı bir döküman çok teşekkür ettm; Mümkünse Bu Soruya da Bir çözüm getirebilirsek sevineceğim..

# trianextern ( not cyntax (= ]
portalın o sürümünde açık varmıydı hatırlamıyorm ama arama bölümündeki o xss çalışmışsa senin cookieni vermiştir.

search.php de aranacak kelimeyi yazdığın formun input namesini bilmen gerek

search.php yi inceliyerek bakabilirsin

örnek

<form action=search.php method=post>

<input name=aramakelimes value=aranacak kelimeyigirin>
<input type=submit value=ara>
</form>

bu şekilde form varsa input name y e bakıyoruz

aramakelimes

o zmn search.php de şöyle bir if li yapı olması gerekir

if($_POST[aramakelimes]){

arama yapıcak kodlar

}

sen if li yapının üstünde

bizim fonksiyonu uygularsan , $_POST[aramakelimes] değişkenini temizliyebilirsin

$deisken=$_POST[aramakelimes];
htmlentities(addslashes(quote****($deisken)));
if($deisken){

arama yapıcak kodlar

}

  Alıntı ile Cevapla