Content Security Policy

connect-src : WebSocket, XHR, EventSource
font-src : https://themes.googleusercontent.com //fontları sadece ordan alabilir
frame-src: https://youtube.com //frame sadece youtube olabilir.
img-src : * -Her şeye izin ver- // self yazarsan sadece kendi resimleni alır
media-src : *.site.com // mediayi kendi domaninde izin ver
object-src : self // flash vb
script-src : ‘self’ ‘unsafe-eval’ ‘unsafe-inline’ //kendi için evala izin verme
style-src : self

Şeklinde headerda (X-WebKit-CSP) gönderilen güvenlik bilgileridir. Bunlar tarayıcı tarafından uygulanır.

Memcache injection

"SET deger " . $input

şeklinde bir kullanımda $input değerine rn karakterleri dahil edildiğinde 2. bir komut daha girilebilmektedir.

$input = "1 rn SET admin_password 12345";

şeklinde bir komut ile diğer memcache değerleri değiştirilebilir.

Çözüm : Alt satıra geçişe engel olmak.

PHP strcmp fonksiyonu açığı

strcmp fonksiyonu iki değer eşit olması durumunda 0 (false) döndürür

strcmp("5", 5) => 0
strcmp("15", 0xf) => 0
strcmp(61529519452809720693702583126814, 61529519452809720000000000000000) => 0
strcmp(NULL, false) => 0
strcmp(NULL, "") => 0
strcmp(NULL, 0) => -1
strcmp(false, -1) => -2
strcmp("15", NULL) => 2
strcmp(NULL, "foo") => -3
strcmp("foo", NULL) => 3
strcmp("foo", false) => 3
strcmp("foo", 0) => 1
strcmp("foo", 5) => 1
strcmp("foo", array()) => NULL + PHP Warning
strcmp("foo", new stdClass) => NULL + PHP Warning
strcmp(function(){}, "") => NULL + PHP Warning

Eğer sitenizde şöyle bir kullanım yaptıysanız.

if(!strcmp($_GET["ad"], "admin"))
 echo "hg";
else
 echo "dg";

bu admin ile kıyaslama, GET-ad değişkeni array,null,class veya fonksiyon olduğu zamanda TRUE değer döndürür ve hg(hoşgeldin) mesajı basar.

Şu şekilde bir kullanım ile get metodu üzerinde array gönderilebilirsiniz.

http://localhost/strcmp.php?ad[0]=omer

Eğer şifre ve kullanıcı adınızı bu şekilde doğruluyorsanız, birinin array göndererek admin panelinize erişmesi mümkündür.

Onun için == ile kıyaslama yapınki sistem dg (defol git) değeri döndürsün.

 

PHP Oturum Güvenliği

Session

Sunucu tarafında tutulan , oturum bilgileri (PHPde PHPSSID diye cookie tutulur.)

Cookie

Browser tarafında tutulan oturum bilgileri

PHP phpssid ‘de ağ dinlenerek elde edilebilir. Başkasının phpssid’ine sahip olduğunuz an onun oturumunu elde edersiniz.

Çözüm Yolları

  • session_regenerate_id fonksiyonu ile her seferinde phpssid’i yenileyin.
  • isteğin geldiği ip adresini kontrol et ve doğrula.
  • bir oturum aynı anda sadece bir yerde açık olabilsin. (yeniden üretilen ssid , yeniden giriş olma durumda, tekrar yenilenir.)

CSRF Açığı

CSRF : Cross Site Request Forgory

Siteler arası istek gönderebilme açığıdır.

A sitesinde, /paroladeğiş?yeniparola=xxx diğer bir istek ile şifre değiştirildiğini fark edelim.

B sitesinde <img src=”A/paroladeğiş?yeniparola=12345″/> şeklinde bir kullanımla, A sitesindeki kullanıcının parolasını değiştirebiliriz.

Dikkat edelim ki, A sitesinde kullanıcı oturum açmış olmalıdır. Bu işlem B’ye giren her ayrı kullanıcı için gerçtir.

Ancak isteklerin GET metodu dahilinde de olması gerekmez. Bir Ajax formu ile B sitesi, POST metodu da kullanılabilir.

Çözüm Yolu

Access-Control-Allow-Origin headeri kesinlikle gönderilmemelidir. Modern tarayıcılar bu headeri gördüğü müddetçe güvenliği sağlarlar. Ardından aşağıdaki iki yöntemden birini kullanmalısınız.

CSRF – Token

Form gönderilmeden önce rastgele bilet oluşturulur. Formun alıcı sayfası, bu biletin aynısını bekleyerek çalışır

Captcha

Form ve Form alıcı sayfaya bir captcha sistemi kurulur.

string replace fonksiyonların filtreleme zayıflığı

Bir çok programlama dilinde var olan, String Replace fonksiyonları, bir kelimenin kullanmasını engellemede çözüm yolu olduğu düşünülse bile bu fonksiyonun bir zayıflığı vardır.

 

herhangi bir dilde stringi replace etmeyi deneyelim. (ö: php)

$id = str_replace('union', '', strtolower($_GET['id']));

Bu fonksiyon dışardan aldığı bütün union kelimeleri yok edecektir.

"union-union"  : "-"

fakat biz yinede union kelimesi gönderebiliriz.

ununionion şeklindeki bir kullanımda fonksiyon, unionu yok edip yerine yine union bırakacaktır.

"ununionion" : "union"

 

Bu zayıflığı kapatmak için algoritma

while(kelime.deVarMı(silinecek)){
kelime = kelime.replace(silinecek,"");
}