SORU
22 ŞUBAT 2011, Salı


PHP Oturum tespiti / Kaçırma

Hakkında daha fazla Session Fixation & kaçırma PHP ve bu sorunları önlemek için nasıl anlamaya çalışıyorum. Chris Shiflett web sitesinde aşağıdaki iki makale okuyorum:

Ancak, işler doğru anladığıma emin değilim.

Oturum tespiti önlemek için yeterli session_regenerate_id(true); başarıyla giriş yaptıktan sonra birini aramak mı? Doğru anlıyorum sanırım.

Ayrıca belirteçleri $_GET URL üzerinden geçti birlikte kullanarak ilgili oturum kaçırma önlemek için konuşuyor. Bu tam olarak Nasıl yapılacak? Birisi size onların belirteç oluşturmak günlükleri & oturumda saklayın değişken zaman tahmin ediyorum, o zaman her sayfada oturum $_GET değişken değeri ile değişken mukayese edersin?

Her sayfa yük seans başına ya da yalnızca bir kez değiştirilmesi bu token gerekir?

Ayrıca kendi URL ile birlikte bir değer geçmek zorunda kalmadan kaçırma önlemenin iyi bir yolu? bu çok daha kolay olurdu.

CEVAP
22 ŞUBAT 2011, Salı


Tamam, iki ayrı fakat ilgili sorunlar var, ve her biri farklı şekilde ele alınır.

Oturum Tespiti

Bu saldırgan, açıkça bir kullanıcı için bir oturum oturum tanımlayıcısı ayarlar. Genellikle PHP onları http://www.example.com/index...?session_name=sessionid gibi bir url vererek bitti. Saldırganın istemci url verir sonra, saldırının bir oturum olarak aynı kaçırma, saldırı.

Oturum tespiti (hepsi) önlemek için bir kaç yolu vardır:

  • php.ini dosyasında session.use_trans_sid = 0 ayarlayın. Bu URL tanımlayıcı eklemek için PHP söyle, ve tanımlayıcıları URL okumak için değil.

  • php.ini dosyasında session.use_only_cookies = 1 ayarlayın. Bu PHP hiç oturum tanımlayıcıları ile URL kullanmak için söyleyecektir.

  • Oturumun durum değişiklikleri her zaman oturum KİMLİĞİ oluştur. Bu şu demek:

    • Kullanıcı kimlik doğrulaması
    • Oturumda hassas bilgileri saklamak
    • Oturum hakkında bir şey değişiyor
    • vb...

Oturum Ele Geçirme

Bu saldırgan bir oturum kimliği eline alır ve eğer o kullanıcı gibi istekleri göndermek mümkün. Bu saldırgan kimliğe sahip bu yana, ancak sunucu açısından geçerli kullanıcının tüm ayırt edilemez olduğu anlamına gelir.

Doğrudan oturum ele geçirme önlemek. Ancak adım adım çok zor ve zor kullanmak için koyabilirsiniz.

  • Güçlü bir oturum hash ıdentifier kullanımı: php.ini 36*. PHP < 5.3, SHA1 session.hash_function = 1 olarak ayarlayın. PHP >= 5.3, session.hash_function = sha256 session.hash_function = sha512 olarak ayarlayın.

  • Güçlü bir karma gönderin: php.ini 37*. session.hash_bits_per_character = 5 Set bu. Bu hiç mantıklı değilzorçatlak, saldırganın oturum kimliği tahmin etmeye çalıştığında bir fark yaratıyor. KİMLİĞİ daha kısa olacak, ama daha fazla karakter kullanır.

  • php.ini dosyasında session.entropy_file session.entropy_length ile ek bir entropi ayarlayın. Entropi dosyasından okunacak bayt sayısı session.entropy_file = /dev/urandom ve ikincisi için eski ayarlayın, örneğin session.entropy_length = 256.

  • Varsayılan PHPSESSİD oturumdan adını değiştirin. Bu kendi tanımlayıcı adı ile session_name() ilk parametre session_start aramadan önce olarak çağırarak gerçekleştirilir.

  • Eğer varsagerçektenparanoyak bu (örneğin, eğer zaman bağımlı yaparsanız) değiştirirseniz oturumu da adını döndürmek olabilir, ama tüm oturumları otomatik olarak geçersiz olacağına dikkat edin. Ama kullanım durumunda bağlı olarak, bir seçenek olabilir...

  • Oturum tanımlayıcı sık sık çevirin. Bu her istek (sen olmadıkça . yapmazdım ^strong>gerçektengüvenlik seviyesi gerekir), ama rastgele aralıklarla. Genellikle, eğer bir saldırgan, onları uzun süre kullanabilmek için istemediğin bir oturumu kaçırmak yaparsa beri bunu değiştirmek istiyorum.

  • Oturum user agent from $_SERVER['HTTP_USER_AGENT'] vardır. Oturum başladığında temelde, $_SESSION['user_agent'] gibi bir şey içinde saklayın. Sonra, sonraki her istek üzerine uygun olduğundan emin olun. Bu 100% güvenilir değil yani sahte olabilir, ama daha iyi olduğunu unutmayın.

  • Oturum user's IP address from $_SERVER['REMOTE_ADDR'] vardır. Oturum başladığında temelde, $_SESSION['remote_ip'] gibi bir şey içinde saklayın. Bu kullanıcılar (AOL yaptığı gibi) için birden çok IP adresi kullanan bazı ISS'ler, sorunlu olabilir. Eğer kullanırsanız, çok daha güvenli olacak. Saldırgan bir sahte IP adresi için tek yol gerçek kullanıcı ile sizin aranızda bir noktada ağ fedakarlıktı. Ve onlar ağ uzlaşma, bir kaçırma (saldırılar, vb MITM gibi) çok daha kötü yapabilir.

  • Oturum token ve tarayıcılar bu yana bir artış vardır ve genellikle karşılaştırın. Temelde, her istek için, sunucu tarafında $_SESSION['counter'] . Ayrıca aynı şeyi tarayıcılar tarafında JS bir şey (yerel bir depolama kullanarak). Bir isteği gönderdiğiniz zaman, sadece bir simge bir sonuç almak ve sonuç sunucuda aynı olduğunu doğrulayın. Yaparak bu gerekir algılamak için bir kaçırıldı oturum saldırgan olmayacak tam sayacı, ya da eğer onlar yapmak zorundasın 2 sistemler verici aynı saymak ve belli bir dövme. Bu tüm uygulamalar için çalışmaz, ama bu sorunla başa çıkabilirsiniz.

İki üzerinde bir not

Oturum tespiti ve ele geçirme arasındaki farkı oturum tanımlayıcısı tehlikeye hakkında sadece. Fiksasyon, tanımlayıcı saldırganın elini önce bilen bir değere ayarlanır. Kaçırma ya da kullanıcı, çalınan tahmin etti. Aksi takdirde iki etkilerini tanımlayıcı bir kere ele geçirilirse aynıdır.

Oturum KİMLİĞİ Yenileme

Oturum session_regenerate_id kullanarak tanımlayıcı yeniden ne zaman eski oturumu silinmelidir. Bu şeffaf core oturum işleyicisi ile olur. Ancak bazı custom session handlers using session_set_save_handler() bunu yapmayın ve eski oturum tanımlayıcıları saldırı açıktır. Emin olun kullanıyorsanız, bir özel oturum işleyicisi, takip edin tanımlayıcı bunu açın, ve eğer değil senin kaydetmek açıkça sil (veya değiştirmek) tanımlayıcı eski bir.

Varsayılan oturum işleyicisi kullanarak, sadece session_regenerate_id(true) arama iyisin. O senin için eski oturum bilgilerini kaldıracaktır. Eski KİMLİĞİ artık geçerli değil ve eğer saldırgan (ya da bu konuda herkesten) kullanmaya çalışırsa oluşturulacak yeni bir oturum neden olur. Oturum işleyicileri rağmen özel dikkat....

Bir Oturum yok

Eğer bir oturum (örneğin çıkış) yok etmek için gidiyoruz, sen iyice yok emin olun. Bu tanımlama örneğidir içerir. session_destroy kullanarak:

function destroySession() {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
    session_destroy();
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 1881 Animation

    1881 Animati

    5 EKİM 2013
  • cekehechu

    cekehechu

    20 HAZİRAN 2006
  • MyTiredBones

    MyTiredBones

    2 Temmuz 2013