Ankety společnosti Blueboard.cz jsou náchylné k vícenásobnému hlasování bez nutnosti změny IP. Chcete vědet jak na to? Čtěte.

Včera se mi podařilo nalézt bezpečností chybu ve webovém rozhraní poměrně významného serveru. Tu však z určitých důvodů (alespoň pro zatím) zveřejnit nehodlám. Tento „úspěch“ mě však povzbudil v tom, že žádný systém není bez chyb a když člověk hledá, občas i najde 😉

Dnes ráno jsem se rozhodl zaměřit na ankety společnosti Blueboard.cz, konkrétně na možnost vícenásobného hlasování. Už jen z toho důvodu, že píši tento článek, je vám asi jasné, že se mi to povedlo. Co se týče anket obecně, je zde způsob, který vám umožňuje vícenásobné hlasování a před kterým není ze strany vlastníka ankety téměř obrany. Mluvím o změně IP adresy po každém odhlasovaní. Tento způsob je však poměrně nepohodlný a abyste hlasovali stokrát, je nutné nalézt sto proxy serverů, což je zbytečně úmorná práce. Můžete namítnout, že s použitím programů typu Hide IP se situace trochu zjednoduší, ale přesto to stále nemá na pohodlnost způsobu, který zde popíši.

Ano, proč se mořit s tolika proxynami, když můžete „donutit“ ostatní uživatele, aby hlasovali pro konkrétní, vámi vybranou, volbu. Znalí již asi tuší, že se bude stejně jako v případě chyby na Linkuj.cz jednat o Cross-site request forgery. Ohledně principu chyby vás opět odkáži na Wikipedii a .cCuMiNn.ův článek.

Realizace je opravdu jednoduchá, jak už to u tohoto typu chyby bývá. Nejdříve si vyhlédneme anketu a zjistíme přesnou URL odpovědi, pro kterou chceme vícenásobně hlasovat. Blueboard ankety používají typ požadavku GET, čímž vám ještě více usnadňují situaci. Danou URL získáte pouhým zkopírováním adresy odkazu. Viz obrázek:

V případě, že by se data odesílala pomocí požadavku POST, mohli byste danou URL zjistit například pomocí Firefox pluginu LiveHTTPHeaders. Viz obrázek:

Nyní si musíme udělat fake „hlasovaní zařízení“:

<iframe src="https://blueboard.cz/anketa_0.php?id=ID_ANKETY&r1=VOLBA ODPOVĚDI&pid=" width="0" height="0" frameborder="0"></iframe>

To je ukryto v neviditelném iframu. Upozorňuji, že odpovědi (parametr r1) jsou číslovány od nuly, tzn, že pro první odpověď platí r1=0, pro desátou r1=9 pro n-tou r1=n-1. Pokud tedy uživatel navštíví stránku obsahující tento kód, pošle svůj hlas na vámi zvolenou možnost odpovědi, aniž by o tom měl tušení. Nyní zbývá poslední otázka a to, kam tento kousek kódu umístit. Nejlepším řešením je vložit jej na stránku, kam chodí velké množství lidí. Tou může být například titulní strana vašeho webu. Pokud nemáte příliš navštěvovaný web, stačí tento kód umístit například do stránky spolu s nějakým obrázkem a odkaz na tuto stránku rozeslat známým či umístit na nějaké fórum. Každý příchozí, pokud již nehlasoval, přičte právě jeden hlas do ankety. Takto vypadala má testovací anketa po tom, co fake hlasování bylo umístěno na titulní straně Stoyan’s Page po dobu asi osmi hodin:

Řešení tohoto problému je přitom triviální. Méně spolehlivé, přesto ne tak špatné, by bylo kontrolování hodnoty REFERER. Při registraci do systému Blueboard totiž uvádíte mimo jiné i adresu webu, na kterém hodláte jejich služby využívat. Tento údaj by se poté mohl porovnávat s údajem v hlavičce REFERER. Spolehlivějším řešením by ale bylo generování unikátního tokenu pro každé hlasování, což by tento útoku téměř zcela znemožnilo. Toto není poprvé, kdy se na webu či v systému společnosti Blueboard našla chyba, viz MzKovo získání kompletní databáze či cURLyho PHP inclusion. Současně s uveřejněním tohoto článku posílám email společnosti Blueboard s upozorněním.

Související příspěvky

Peter Wang