Konuyu Oyla:
  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Basit bir PHP açığı ve kapatma metodu
#1
Merhaba arkadaşlar,
Bugün ki PHP dersimde sizlere şimdi PHP'deki basit bir açığı bulup kapatmayı göstereceğim.

Öncelikle anlatayım.
PHP'de formla gönderilen veriler (html sayfasından php'ye gönderilen veriler) her zaman tehlikelidir ve kullanıcının nasıl bir veri gönderip göndermeyeceğini bilemeyiz. Buna karşın önlem almalıyız, formdan gönderilen verilerle şayet açık varsa sistemdeki ciddi bilgilere erişilebilir. Biz her halükarda bunun önüne geçmek istiyoruz.

Şimdi atıyorum index.php adında bir dosyam var. Ve içerisinde de şöyle bir form var:

Kod:
<form action="actions.php" method="GET"/>
  <input type="text" name="adiniz"/>
  <input type="submit"/>
</form>

actions.php dosyamda da şu kodlar var:

PHP Kod:
<?php
 
echo $_GET['adiniz'];
?>

PHP dosyasında, gördüğünüz gibi o kadar basit şekilde yazılmış ki... Hiçbir kontrolü, denetimi vs... yapılmadan ekrana yazdırılmış. İşte böyle yaparsanız sonucu da acı biter. :)

Şimdi index.php den formunuza adınızı yazın. Sonra göndere tıklayın. Actions.php?adiniz=(ADINIZ) adlı sayfaya gideceksiniz ve o sayfada da kendi isminiz yazıyor olacak.

Buraya kadar tamam. Peki sıkıntı ney.

Esas sıkıntı şu ki, bazı uyanıklar, adres çubuğundaki GET değerini değiştirerek istediği herşeyi yaptırabiliyor. Eğer hiçbir kontrol yaptırmadan, direkt GET değerini ekrana yazdırırsanız ya da bir yerde kullanırsanız şöyle bir sonla karşılaşabilirsiniz.

Adres çubuğuna direkt şunu yazın: (SİTE-ADRESİNİZ)/actions.php?adiniz=<style>body{background:red}h1{color:white}</style><center><h1>!!HACKED!!</h1></center>

Gördüğünüz gibi, acı son.
Ekranda kırmızı bir duvar kağıdında büyükçe bir "!!Hacked!!" yazıyor.

İşte bu bir güvenlik açığıdır ve kesinlikle kapatılması gerekir. GET metodu her zaman risklidir o yüzden işlerinizi hep POST la yapın çünkü bilgiler açıktan gönderilmez gizli olarak öteki sayfaya iletilir.

Peki bunu nasıl yaptık?

Direkt ekrana yazdırıyorduk hatırlarsanız. Biz adres değerindeki GET değerini değiştirdik. echo, print gibi yazdırma fonksiyonları HTML kodları çalıştırdığı için böyle bir şey yaşadık. Formumuzdan gelen GET değerini,

Kod:
<style>
body {
background: red;
}

h1 {
color: white;
}
</style>

<h1>!!Hacked!!</h1>

olarak değiştirmiş olduk. Adres satırındaki bilgileri değiştirerek sayfaya hükmediyoruz yani. :)

Peki bu tür bir açığı nasıl kapatabiliriz?

Basit bir fonksiyonla bu sorunun üstesinden gelebiliriz.

Fonksiyonumuz: htmlspecialchars();
İşlevi: HTML kodlarını işlevsiz hale getirir.

Kullanımı: htmlspecialchars($veri.NULL);
Dikkat! htmlspecialchars fonksiyonuna, verinizi girdikten sonra sonuna mutlaka .NULL yazınız. Eğer yazmazsanız, fonksiyon içeriği tam tamamlanmamış gibi görünecek ve güvenlik zaafı meydana gelecek. Yani verinin(değişkenin) en sonuna .NULL koymazsanız açık bırakırsınız haberiniz olsun.

actions.php sayfamızı şununla değiştirelim:
PHP Kod:
<?php
 
if (isset($_GET['adiniz'])) 
// GET verimiz var mı yok mu kontrol ettik. Bunu eklemeseydik, adres satırına sadece (site-adresi)/actions.php yazsaydık ve GET verimizi belirtmeseydik hata ile karşılaşacaktık dolayısıyla da bir güvenlik zaafı meydana gelecekti.
 
echo htmlspecialchars($_GET['adiniz'].NULL); // Burada ise, öncelikle GET verisindeki varsa HTML kodlarını etkisiz hale getirdik. Sonra da GET verimizi belirttik.
}
?>

Şimdiki sonucumuz:

Kod:
<style>body{background:red}h1{color:white}</style><center><h1>!!HACKED!!</h1></center>

Gördüğünüz gibi.
İleride bu konuda daha fazla kaynak paylaşacağım.

Bunlar sadece temel. Elbette bu işin daha ileri boyutu da var.
Kolay gelsin, iyi çalışmalar.
Ara
Cevapla PGM
Teşekkür verenler:
#2
Teşekkürler Kaan. Şu işlerim bitsin/projeler, bende böyle konular açmaya başlayacağım.
Ara
Cevapla PGM
Teşekkür verenler:


Hızlı Menü:


Şu anda bu konuyu okuyanlar: 2 Ziyaretçi


Online Shopping App
Online Shopping - E-Commerce Platform
Online Shopping - E-Commerce Platform
Feinunze Schmuck Jewelery Online Shopping