Jak jsem ukradl sezení administrátorovi a objednal ruskou vodku za kvintiliardu

7. 11. 2013
Doba čtení: 9 minut

Sdílet

 Autor: Isifa
Zabezpečení mnoha tuzemských e-shopů je tragické. Všechny mnou hodnocené online obchody v letošním ročníku soutěže WebTop100 získaly za oblast bezpečnosti nula bodů.

Pamatujete si, co jste dělali počátkem června roku 2013? Výborně, já také moc ne. Jen si matně vzpomínám, že jsem od pořadatelů soutěže WebTop100 opět dostal nabídku stát se odborným garantem pro bezpečnost a technické řešení. A opět jsem pár dní přemýšlel, jestli onu nabídku přijmout nebo ne. Opět to samé dilema, opět přemýšlení, jestli se vydat na tu dlouhou trať, na jejímž samém konci se tvůrci a majitelé přihlášených webů dozví, co příště udělat lépe a které problémy vyřešit ihned.

A tak jsem za pár dní zase napsal zprávu, ve které stálo „přijímám“. Stejně jako minulý rok. V červnu jsem ovšem ani zdaleka netušil, co mě vlastně čeká. Jen mezi námi, trochu jsem to tušil, protože hodnotím weby již třetí rok, ale netušil jsem, že mě toho čeká tolik.

Tisíc třílitrových lahví vodky na dobírku

Mám spoustu nového materiálu na mé školení bezpečnosti webových aplikací, vím toho spoustu o vývojářských firmách a provozovatelích přihlášených webů a taky vím, že můj kamarád Pepa Lobotka si 22. září objednal alkohol za 4 229 Kč na jednom z přihlášených e-shopů.

Dozvěděl jsem se to pohledem do administrace daného e-shopu, do které jsem se jednoduše dostal i poté, co mi daný e-shop zablokoval přístup, protože si správci všimli mých podezřelých objednávek.

Rozumějte, objednat si tisíc třílitrových lahví vodky Russian Standard do Karlových Varů ještě není nic neobvyklého, ale provést objednávku za 1 683 001 100 000 000 049 3­54 798 289 387 520 Kč a nakoupený alkohol si nechat poslat na dobírku, to už člověk musí mít tuhle zemi moc rád, ona totiž spotřební daň z této sumičky by nás všechny, včetně důchodců i dětí vašich dětí, vytáhla na jedno až dvě volební období z úplně všech problémů.

Ale jelikož se většina firem zakládá za účelem generování zisku a ne kvůli zachraňování státního rozpočtu, tak daná objednávka byla zrušena a mně byl na daný e-shop zablokován přístup. Tomu říkám patriotismus.

Mně to zablokování samozřejmě vůbec nevadí, zásoby Ruského Standardu na víkend mohu nakoupit kdekoliv jinde, ale pokud tento text čte někdo, komu se uvedené objednávky zdají povědomé, pak vězte, že ta blokace byla zcela hloupá akce, která se naprosto minula účinkem.

Stačí vzít telefon, zapnout mobilní připojení, počkat, až se rozsvítí ikonka 3G a díky našim operátorům nabízejícím dokonalé pokrytí a nejrychlejší sítě se tak na web připojit z jiné IP adresy i přesto, že o moji přízeň provozovatel evidentně nestojí. I přes zablokovaný přístup se tedy dívám do administrace, jestli mi to zboží již posílají a mám tedy čekat doma na lísteček „adresát nezastižen – oznámeno“ vhozený do schránky.

Na uvedeném příkladu je nejenom vidět neschopnost provozovatele jakkoliv řešit nějakou nestandardní situaci, ale i neschopnost programátorů mi jednak omezením množství kupovaného zboží zabránit, abych se uchlastal k smrti, ale především neschopnost mi zabránit v tom, abych se mohl dívat do administrace e-shopu, co si lidé, včetně mého kamaráda Pepy, kupují. Kam si to nechávají doručovat a zjišťovat adresy, na kterých se přes den nenachází, to v případě, kdy si zboží nechávají doručovat do práce, a je tedy bezpečné nakouknout do administrace jejich obýváků.

Cross-Site Scripting (XSS)

Na tomto nejmenovaném e-shopu jsem provedl objednávku se speciálně upraveným jménem, do kterého jsem vložil jednoduchý JavaScriptový kód a díky tomu, že programátoři neošetřili část webu, kde se správcům e-shopu zobrazují objednávky se tento kód vložený do jména zákazníka spustil v prohlížeči administrátora, který se právě snažil zpracovat a hlavně pochopit moji objednávku.

Spuštění útočníkova JavaScriptu v prohlížeči návštěvníka se říká Cross-Site Scripting (XSS) a je jeden z nejběžnějších webových útoků. Bránit se proti tomuto útoku je extrémně jednoduché a pokud to programátor neumí nebo vám bude tvrdit, že útok XSS není nic důležitého, tak se postarejte o to, aby se ve vaší firmě již nedotkl ničeho jiného, než kliky u vchodových dveří. Vlastně východových.

Můj JavaScript měl jediný úkol, ukrást z prohlížeče administrátora cookie, která ho jednoznačně identifikuje a říká, že může daný e-shop spravovat a vyřizovat objednávky. Tomuto nekalému činu se říká ukrást sezení a od toho, co předvádějí někteří důchodci v prostředcích hromadné dopravy se liší tím, že k jeho odražení není potřeba baseballová pálka, ale jenom speciální příznak HttpOnly, který určí, že onu cookie, která identifikuje administrátora, nebude možné pomocí JavaScriptu přečíst.

Útok Cross-Site Scripting se dá použít i k jiným věcem, než jen ke kradení sezení (anglickySession Hijacking, někdy též Session Stealing), to se dá nakonec ukrást i jinak, ale kombinací těchto dvou útoků jsem s e-shopem provedl to, co jsem potřeboval. Administrátor chtěl vyřídit moji objednávku, zobrazil si ji, v jeho prohlížeči se spustil můj JavaScript, ten mu ukradl cookie a její hodnotu poslal na můj server, já jsem tu ukradenou cookie přenesl do svého prohlížeče, přistoupil na stránku s administrací, jejíž adresa se mi na server dostala společně s hodnotou té cookie a voilà, e-shop si najednou myslí, že jsem Lukáš Krása, administrátor e-shopu, a tak si mohu s e-shopem dělat, co chci.

Udělám pár screenshotů, poznamenám si nula bodů, pomyslím si něco o autorech daného e-shopu a přemýšlím, proč to vytvořili tak absolutně nezabezpečené, vždyť obrana proti těmto útokům je triviální.

Boty od Bati na pražskou adresu „ulitze 123"

Co dělat pro to, aby příště ten kód napsali bezpečně? Během přemýšlení nahrávám do svého prohlížeče další stránku k hodnocení a provádím další testovací objednávku, tentokrát se mi zalíbilo šest párů dámských lodiček značky Baťa a chci si je nechat poslat na adresu, cituji, „ulitze 123, 24680 praga“.

Zkouším stejný trik jako minule, stejnými zbraněmi chci ukrást sezení administrátorovi a dostat se do sekce tohoto obchodu, která je běžným návštěvníkům nepřístupná. I na tomto e-shopu se to podařilo, ale bohužel adresa administrace se po cestě ke mně na server někde ztratila, běžné adresy nefungují a já tedy nevím, kde svoji objednávku mohu zrušit, a tak mi za pár dní píše Česká pošta, že se jim na uvedenou adresu nepodařilo doručit několik balíků.

S pocitem viny sám sobě přísahám a slibuji, že příště zkusím svoji objednávku udělat více nápadnou. Ale tak aspoň víme, že ve městě Praga se žádná ulice nejmenuje Ulitze. Na poslední chvíli mě napadá, že zkusím zahladit stopy a smazat svoji objednávku přímo v databázi tohoto e-shopu. Pomocí úspěšně provedeného útoku SQL Injection zjišťuji, že databáze pro českou variantu e-shopu obsahuje 61 tabulek, když tu mi náhle oznamuje můj poštovní program, že mi organizátor soutěže WebTop100 píše e-mail, ve kterém mi oznamuje, že do konce hodnocení zbývá sotva pár dní.

Změnou čísla v adrese stránek si alespoň vypisuji objednávky provedené ostatními uživateli tohoto e-shopu a zjišťuji, že můj nákup byl poměrně nestandardní. Do hodnocení uvádím mínus deset bodů a pošilhávám po své třílitrové láhvi Ruského Standardu, noc bude totiž dlouhá.

Přihlášení jako admin

A hele, další e-shop s obuví. Krást sezení mě přestává bavit, zde by to ani nebylo tak jednoduché, Nette Framework dělá docela dobrou práci, kterou mu ovšem zcela kazí samotní programátoři tím, že jej nepoužívají správně. Zkoumám tedy, co by se dalo provést jiného, a všímám si nějakého parametru id uživatele v adrese stránky. Jeho změnou zjišťuji, že číslo 2 má uživatel admin, a to se bude hodit. Přecházím na stránku se změnou hesla, své číslo 69 měním na 2 a uživateli s číslem 2 tak měním heslo na to, které si zvolím.

Přihlašuji se do administrace jako uživatel admin, heslo znám, před chvíli jsem mu ho přece změnil, nastavuji si práva superuživatele, dívám se na objednávky ostatních uživatelů, nahlas křičím WTF, píšu si, že tihle jsou v hodnocení hluboko pod nulou a jdu na další e-shop.

Samozřejmě, jak jinak, další český výrobce obuvi. Ještě tak nějaký český web korejských výrobců aut a už tu máme českou produkci v celé své kráse. Zkouším se tedy registrovat, ale ihned po registraci, ještě před přihlášením, své složité heslo zapomínám. Hledám tedy odkaz s nápisem„zapomenuté heslo“, klikám na něj, zadávám svoji e-mailovou adresu a vzápětí koukám s otevřenou pusou na e-mail, který právě dorazil. Obsahuje totiž heslo, které jsem opravdu zadal já, teď když ho vidím, tak si na něj vzpomínám. Píšu nula bodů.

Hesla v čitelné podobě

Aby mi tento e-shop mohl heslo takto jednoduše zaslat, tak jej totiž musí mít v databázi uložené v čitelné podobě. Pokud tato databáze nějak unikne, provozovatel e-shopu a hlavně jeho uživatelé mají obrovský problém. A nemusí se jednat o žádný útok. V roce 2012 jsem hodnotil e-shop, jehož tvůrce ponechal zálohu databáze s podobně hloupě uloženými hesly volně přístupnou na webu ke stažení, čímž fatálně ohrozil jeho uživatele, protože spousta těch uživatelů použila pro e-shop stejné heslo, jako používala pro svoji emailovou schránku.

Hesla uživatelů se musí ukládat v nečitelné podobě a tak, aby převod do té nečitelné podoby byl relativně časově náročný, jinak by útočník mohl velice rychle, hrubou silou, vyzkoušet všechny možné kombinace písmen a čísel a porovnávat je, jestli jejich nečitelná podoba není náhodou stejná jako ta, která je uložená v databázi, kterou nějakým způsobem získal, a tak se dostat k původním heslům uživatelů.

Nula bodů pro všechny hodnocené e-shopy

V ročníku 2013 soutěže WebTop100 získaly všechny mnou hodnocené e-shopy nula bodů, stejně tak většina bank a pojišťoven, z podobných důvodů, jako jsou uvedeny výše.

Některé weby měly během hodnocení jiné problémy, na webu jedné banky je například možné odesílat jakékoliv e-mailové zprávy komukoliv, čehož se dá využít k anonymnímu rozesílání nevyžádaných nabídek na Viagru, na ubytování v Hotelu u Lípy nebo cokoliv jiného.

Všechny problémy jsem popsal do hodnocení a teď už je jen na samotných tvůrcích a provozovatelích webů, jak s danými informacemi naloží, ale díky zkušenostem z minulých let bych moc nejásal, některé weby hodnocené v roce 2011 stále nemají nalezené problémy vyřešené.

Hodnotil jsem samozřejmě i z jiných hledisek než jen z toho bezpečnostního, ale jen ty bezpečnostní problémy znamenaly automaticky nula bodů. Ty ostatní věci, jako jsou např. hezké a čitelné adresy, použitelná Not Found stránka, moderní HTML kód a verze webu upravená pro mobilní zařízení, jsou již součástí většiny webů a je vidět opravdu velký posun od let předchozích, za což patří autorům uznání a velký dík, nicméně možnosti úniku nějakých soukromých dat nezabrání.

Pořád přemýšlím, jak tento stav vylepšit, jak autory donutit psát trochu bezpečnější kód a jak majitelům a provozovatelům e-shopů ukázat, že zabezpečení, i přesto, že není vidět a nepřinese žádný okamžitý zisk, je velice důležité, minimálně z dlouhodobého hlediska.

Příště na tyhle problémy totiž může přijít nějaký znuděný školák, kterému zrovna začaly prázdniny a bude se chtít trochu zabavit, navíc naprostá většina provozovatelů totiž netuší, jestli jim nějaká data již unikla nebo ne, dokud ty data někdo nezveřejní.

Mně teď tedy nezbývá nic jiného, než všem uživatelům internetu důrazně doporučit, aby heslo ke své e-mailové schránce nikdy nepoužili pro registraci kamkoliv jinam a autorům webových aplikací vzkázat, že takhle by to tedy asi nešlo.

Autor článku

Autor umí vyvíjet webové aplikace a zajímá se o jejich bezpečnost. Nebojí se o tom mluvit veřejně, hledá hranice tak, že je posouvá. Jeho cílem je naučit webové vývojáře stavět bezpečnější a výkonnější weby a aplikace.

Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).