Session stealing

Zdravím, aké máte skúsenosti z odcudzením session premenných? Má niekto z vás predstavu, ako by mohol vyzerať jednoduchý skript na databázovú správu session relácií?, t. j. session handler, ktorý bude ukladať session do databázy? Vďaka za odpoveď.
nechápu, proč chceš session ukládat do databáze :-(

od toho přece te proměnná existuje - pro přenos info do dalších stránek, pokud chceš něco ukládat do databáze nevím proč session, když mi máš dostupnou, dokud ji nezrušíš

pokud chceš používat proměnnou i po opětovném otevření prohlížeče - použij cookies
existuje možnost v konfigurací apache, která sessions skutečně ukládá do db.
Zkušenosti s tím nemám, ale vzhledem k tomu, že možnost ukládání sesion dat do db řeší snad každý www server, není to asi tak tupá myšlenka.
Jinak o zcizováním sessions a jiná bezpečnostní udělátka jsou komentovaná na mnoha místech na netu. Třeba http://interval.cz/clanky/bezpecnost-predevsim-cross-site-skripting-a-session-stealing/
Já mám zkušenosti s odcizováním session :)
Zkoušel jsem to, a vypracoval jsem metodu, jak číst i zapisovat do libovolných proměnných ve skriptech, včetně těch uvnitř funkcí a jde to :) Za určitých podmínek nastavení php.ini samozřejmě.

Dá se proti tomu bránit třemi způsoby. Databáze je jedním z nich a je to nejjednodušší a nejbezpečnější.

Aby bylo jasné jak, toto je náznak postupu:

1) Načtu cílový skript, vytvoří se session.
2) V jiném svém skriptu nastavím stejné session a přečtu si proměnné.
3) Nastavím proměnné session tak jak chci a nechám je uložit
4) Načtu znovu cílový skript a tentokrát už s falešnými hodnotami proměnných

Nevěříte? Věřte! :+)
Vďaka za reakcie.

To Elektrostraka:

Možeš mi tie záškodnícke skripty poslať na email, alebo zverejniť?Ktorá voľba v php.ini teda umožňuje ukladanie session do databázy, a ako je to riešené na webhostingu, ukladajú sa všetky session od všetkých užívateľov do tej istej databázy? Nieže by som chcel programovať nejakú kritickú aplikáciu, ale zaujímam sa o túto oblasť :-)
Hmmm, no....
ten skript raději nepošlu. Jednak není dotažený do dokonalosti - jen ve fázi experimentu, a jednak nemusí fungovat pro všechna nastavení PHP.INI.
Vysvětlil jsem jeho princip a to by mělo stačit, aby si jej každý mohl napsat sám. Není to těžké.

Kromě toho... nechtěl bych podporovat jeho zneužití ;+)

Co se týká ukládání session do databáze, sám to nepoužívám - právě z důvodů závislosti na MySQL servru a ten je třeba tady velmi často mimo provoz. Navíc by to pak hodně zpomalovalo zobrazování stránek. Nezkoumal jsem, jakými způsoby se dá session do databáze ukládat. Asi se budou muset použít elementární funkce pro práci s databází a session a pak použít funkce session_decode(String) a session_encode(String), kde String by byl právě řetězec uložený v databázi pro každé PHPSESSID - a pak bych ještě obstaral, aby se po čase nepoužívání smazaly dlouho nepoužívané řádky PHPSESSID. - to je principiální návod.
No, teď koukám do PHP manuálu, že se tam má použít ještě session_set_save_handler() - doporučuju si to nastudovat v manuálu. V PHP manuálu pro stažení jsem našel i jakýsi jednoduchý příklad, který se dá přepsat pro práci s databází.

Sám raději používám ukládání session do souborů, ale do vlastních adresářů s dobře nastavenými právy a .htaccess pro odepření přístupu všem - aby se soubory nedaly vypsat pomocí HTTP. Přijde mi to dostatečně bezpečné a jednoduché. ;+)
= Elektrostraka =
Tak jako vypsani sesnu neni problem:
foreach($_SESSION as $key = $value)
{echo "\n".$key."=".$value;}

jinak zajimavy napad, na tom samem serveru si zkopirovat sesny do sveho programu a v nem si to vypsat. Nejlepe, kdyz si tak vypises nezasifrovane heslo, ze? :))

= barguzin =
volba, ktera tomu muze zabrani, tak to bude neco jako:
- session vazane na webadresar (pokud to jde nastavit)
- session ukladane do sveho adresare + .htaccess
$pathtemp='/local/web/websites/4323143523/www/web/tmp';
ini_set('session.save_path' ,$pathtemp);
ini_set('upload_tmp_dir' ,$pathtemp);
ini_set('temp_dir' ,$pathtemp);
- PHP mod_rewrite - prepisovat URL tak, aby se nezobrazilo sessionid :)
Neni zadny problem to co Elektrostraka zde popsal, dokonce lze krast i cizi session pro zapis a cteni je to jednoduche, nejlepe session nepouzivat vubec, pouzit radeji vnitrni promennou a DB pokud to de tam kde uz je nutne pouzit session tak jen nedulezite data :-D.
Mam otazku. Na interval.cz (ten dokaz ktory bol psolany vyssie) bolo napisane toto:

# Jak jsme viděli, k infiltraci vede vždy jen interpretace HTML, ať už tak, jak bylo zadáno, nebo nějakým vedlejším efektem (například v chatu zadáte adresu a ta se přetransformuje na odkaz, záludné jsou také HTML přílohy mailů). Této interpretaci je třeba se za každou cenu vyhnout. Je nutno zvolit určitý kompromis mezi komfortem uživatele a bezpečností, jde totiž o nejčastější typ útoku.

Ak vsak napriek tomu kcem urobit to aby sa mi z liniek spravili odkazy mozem to riesit tak ze si spravim nejaky subor otvor_linku.php ktora by mala parameter ?url=http://nieconieco.nieco.nieco a ta by otvorila dany link (tym padom by sa nepreniesli ani sessions ani cookies ani nic..) dalo by sa to takto vyriesit? alebo tam predsa nieco nesedi?
Mno.. Minimalizovat podvrhnout znamená spojit IP+session, respektive ukládat hodnotu sessionid do cookie, což by neměl být problém. Pak už záleží na PHP kódu, jak je napsaný. Pokud budete spravovat session přes db, dostanete něco podobného. V tomto případě lze zanedbat to, že má útočník přístup ke stejnému serveru, protože šance, že se trefí je 1:2^128, nebo možná méně, což lze zanedbat.

Pak už vše záleží jen na tom, jak dobře je ochráněn web proti kompromitaci
Jinak dalsi moznost je mit zapnute cookies, potom se sesny neukazuji v adresnim radku. Ale to je sporne reseni.

= Majkls (majkls.wz.cz) =
jak to chces kontrolovat s tou IP?

login -> session[heslo]=md5(ip+heslo)
if (ip==jakemasip(ip) & heslo==heslo) {}

vnitropodnikova sit ma obvykle stejne IP