Srp/090
3. díl – Složitější text
Stále silně ubohý pokus ochránit své webové aplikace proti nájezdům spamerů je dnes zdaleka ten nejrozšířenější, když pomineme přednastavené hodnoty nejrozšířenějších aplikací pro správu obsahu, popřípadě blogy, do jejiž běhu nejde zasahovat (*.wordpress.com, *.blog.cz a další).
Spočívá v nějaké jednoduché otázce, krátkém příkladu a dalších věcech. Zadání, které často odpověď obsahuje je ovšem stále kriticky zranitelné, protože je odesláno klientovi ve formě textu. Ukažeme si proto, jak najít v textu zadání to, co hledáme.
Serverová část je na tolik triviální, že jí zde nehodlám vypisovat – to by měl skutečně každý pokročilý zvládnout. Zmínim zde proto pouze část, která výrazně sníží počet možností útoku (o 50%). Pochopitelně musíte umět použít sessions!
//serverová část, generování formuláře
...
$_SESSION['antispam_num'] = $antispam_num;
...//část pro ověření
if ($_SESSION['antispam_num'] != $_POST['antispam_num']) {
exit('Server má pochybnosti o vašem komentáři. Vraťte se zpět a vypňte správně anitspamovou kontrolu!');
}
Od minulé techniky jsme vlastně pouze změnili přenos správné odpovědi. Nicméně i tento malý krůček je důležitý.
Jak takovýto skript napadneme? Je jasné že manipulace s cookies nám nepomůže, musíme proto přistoupit z získání výsledků ze stránky s formulářem.
//filaname: slove_antispam_1.php
//Obejde antispamovou ochranu #2 - metoda vypracovani odpovedi
include 'curl.php';
$curl = new Curl;
$response = $curl->get('_dummysite_');
if (!preg_match('/Type the answer of this equation: \(([0-9 \-\+\*\/:x]+)\) in next field/', $response->body, $antispam_num)) {
exit (0);
}
$antispam_num = explode(' ', $antispam_num[1]);
switch ($antispam_num[1]) {
case '-': $antispam_num = $antispam_num[0] - $antispam_num[2]; break;
case ':':
case '/': $antispam_num = $antispam_num[0] / $antispam_num[2]; break;
case '+': $antispam_num = $antispam_num[0] + $antispam_num[2]; break;
case 'x':
case '*': $antispam_num = $antispam_num[0] * $antispam_num[2]; break;
}
$response = $curl->post('test.com/posts', array('name' => 'myname', 'email' => 'none', 'comment' => 'Visit my c00l website!!!!!!!!', 'antispam_num' => $antispam_num));Berte prosím na vědomí, že skript na straně serveru (ty pro generování a ověřování) nejsou psány dokonale, chybí detekce existence sessions/odeslané hodnoty).
Srp/090
2. díl – Nejhorší možný případ
V tomto díle série článků Hacking antispamu a obrana se podíváme na zoubek té úplně nejhorší možné "ochraně" před nevyžádanými komentáři. Jedná se o ochranu v podobě jednoduchého příkladu nebo pouze opisování čísla / textu. Háček je v tom, že "zadání" úkolu je odesláno klientovi / spmabotovi v textové podobě! Naprosto katastrofální případ, autor netuší o možném nebezpečí, nebo je mu ukradené.
Obrázek řekne více než tisíce slov.
Jak tento systém sestrojit snad ani nemusím psát. Nicméně pro jistotu:
//část kódu při generování formuláře
//generace náhodného čísla a uložení do cookie
...
$antispam_num = rand(0,100);
setcookie('antispam_num', $antispam_num);
...
//vhodné vypsání hlášky na vhodném místě ve formuláři
echo 'Opište číslo '.$antispam_num.' do následujícího pole z důvodu antispamové kontroly';
a následuje část pro zrpacování komentáře.
//část kódu přizpracování formuláře
//porovnání odeslaného číslem kontrolním z cookie
...
if ($_COOKIE['antispam_num'] != $_POST['antispam_num']) {
exit('Server má pochybnosti o vašem komentáři. Vraťte se zpět a vypňte správně anitspamovou kontrolu!');
}
...
Tím bychom měli vytváření, teď na část o poznání zajímavější. To znamená vzhůru do "hacknigu". Možností, jak roboticky uspět v kontrole je víc. Napadá mě například přečíst číslo z formulářového prvku a pak ho využít, nebo si rovnou přenastavit hodnotu sušenky antispam_num. Předvedu zde pouze druhou metodu. Té první se dočkáme ještě později v seriálu
//filename: solve_anitspam_1.php
//Obejde antispamovou ochranu #1 - metoda manipulace s cookie
include 'curl.php';
$curl = new Curl;
$curl->headers['Cookie'] = 'antispam_num=123';
$response = $curl->post('dummywebsite.com/post_comment.php', array('name' => 'myname', 'email' => 'none', 'comment' => 'Visit my c00l website!!!!!!!!', 'antispam_num' => '123'));
Toť je pro tento díl vše. Ukázali jsme si jak tento jednoduchý "hack" užívaný spamboty. Pokud nerozumíte části include 'curl.php'; a následnému vytvoření objektu, přečtěte si nejprve první díl!
Srp/090
1. díl – Hacking antispamu a obrana
Každý administrátor webu, který pravidelně navštěvují spamboti tento problém již řešil. Je to klasická hra kočky a myši, neustále vymýšlíte nové systémy (můj koníček
) ochrany proti nevyžádaným komentářům. Samozřejmě je možné celý problém vychytat za pomoci moderace komentářů a je také ze všech nejspolehlivější, nicméně zde záleží na subjektivitě moderátora a proto odsuzuju tuto techniku hulánovců a idnesáků.
Jak tedy vyřešit tento problém? Odpověď naleznete v sérii článků, kterou právě čtete. V každém článku vám "odhalím" jendu techniku, popíšu ji a zhodnotím. Na závěr také předvedu, jak se tato technika dá obejít. Pod každým příspěvkem bude také otevřená diskuze, ve které můžete prodebatovat určitý způsob ochrany nebo napsat připomínku.
Pokud budu mít dostatek času a chuť do práce (smrtelná kombinace
), mohu rovněž vytvořit "dummy website", aneb místo pro ozkoušení zde popsaných prolamovacích technik.
Pokud v kódu uvidíte na začátku
include 'curl.php';
$curl = new Curl;
jedná se o přiložení Shuber's curl třídy. Je to skvělý a neocenitelný pomocník, když se nechcete s cURL moc babrat
