Başka kullanıcıların oturumda PHP enjekte

6 Cevap

Her kullanıcı benzersiz bir PHPSESSID sahip olduğundan, bu iki kullanıcı için, bir sunucu üzerinde çalışan standart PHP kullanarak kahvalti OTURUM veri içine bilgi enjekte söylemek mümkündür.

Ben herhangi bir yanlış amaçlar için bu kullanarak değilim, unutmayın. DB erişimi olmadan sohbet için kullanmaya çalışıyor.

Zaman ayırdığınız için teşekkür ederiz.

6 Cevap

Ben nasılsa B oturumuna içine yerleştirilen alır bir mesaj göndererek B'ye bir sohbet etmek istiyorum varsayarak yaşıyorum.

Her şeyden önce, bir belki bir listeden adını seçerek, B oturum kimliğini öğrenmek gerekiyor. Neredeyse kesinlikle başka bir güzel güvenlik delik oluşturduk, bu oturum kimlikleri şifrelemek isteyeceksiniz!

Yani, hedef session id içeren sunucu ve bir mesajı bir mesaj veri. Burada geçici anahtarı oturum kimlikleri hedef oturumuna içine veri yazmak için nasıl bulunuyor:

//get data from form - I'll leave the encryption of the target
//session id up to you!
$target_session_id=decryptSessionId($_POST['target']);
$message=strip_tags($_POST['message']);

//remember our "real" session id and close the session
$original_session_id=session_id();
session_write_close();

//open the target session
session_id($target_session_id);
session_start();

//add message to target session
$_SESSION['chat'][]=$message;

//close target session
session_write_close();


//reopen the "real" session
session_id($original_session_id);
session_start();

session fixation üzerine kadar okuyun

Oturum kolayca istediğiniz gibi yapmak için reimplemented basit bir şeydir. Ben bir süre önce yazdığım bu basit Exemple bir göz atın: http://pastebin.com/f3ca0ae8d

Kullanımı:

  • new mySession(); session_start(); ile aynı şeyi
  • $_MYSESSION $_SESSION ile aynı şeyi
  • Eğer komut bitmeden oturumu serbest bırakmak istediğiniz sürece delete mySession(); kullanmak için session_write_close(); gerekli değil aynı yapıyor.

Bazı uyarlamalar böylece farklı kullanıcılar arasında da paylaştırabilirsiniz oturum kimliği kendiniz tanımlayarak gibi, belirli bir amaçla kullanmak için yapabilirsiniz. $ _MYSESSION Kullanıcıları arasında ortak olacak gibi, ayrıca $ _SESSION kullanıcının belirli bilgileri depolamak için onunla birlikte normal PHP oturumlar kullanabilirsiniz.

[Düzenle]

http://pastebin.com/f3c31737e

Exemple: kanal $ _SESSION ['channelid'] ve baskı tüm okunmamış satır girin.


session_start();
new mySession($_SESSION['channelid']);

while (count($_MYSESSION['chat']) > 100) unset($_MYSESSION['chat'][key($_MYSESSION['chat'])]);

while ($line = $_MYSESSION['chat'][$_SESSION['lastread']++])
        echo "$line
";

Exemple: kanala konuşun.


session_start();
new mySession($_SESSION['channelid']);

$_MYSESSION['chat'][] = $_SESSION['myname'] . ' says, "' . htmlspecialchars($_POST['message']) . '"';

vs ..

Bunun yerine ne etrafında osuruk, aslında, oturum sistemi üzerinden taşıma dolaylı dosyası, neden noktasına doğru gidin ve metin dosyaları kullanmak değil mi?

Bu saldırılara karşı daha savunmasız ve aynı zamanda daha az uçucu, gelecekteki PHP sürümlerinde güvenlik nedenleriyle oturum anahtarlama bu tür önlemek için karar verebilecek anlamda (varsayımsal tamamlamak, ama mantıklı).

Eminim diyemem ama oturum verileri bir dosyada saklanır varsayılan beri app diğer kullanıcı session id bilen varsa, değişmiş verilerle standart oturumu işlevleri tarafından yazılmıştır oturum dosyasında yerini alabilir. Diğer kullanıcı bir komut kere sefere değişmiş oturumu veri yüklenmiş olacaktır.

Sadece oturum işleme inşa üstüne bunu Ama eğer yarış koşulları ve çatışmaların her türlü riske vardır. Muhtemelen bu sorunların tüm başa böylece kendi ile oturum yönetimi fonksiyonlarını değiştirmek isteyeceksiniz. Konular muhtemelen çok daha karmaşık onlar yüzeyinde görünen daha vardır.

Bkz: http://www.php.net/manual/en/session.customhandler.php özel oturum işleyicileri hakkında bilgi için