Обход плагина WP Hashcash
Не так страшен JavaScript, как его малюют…
WP Hashcash — очередной плагин WordPress для борьбы со спамом. Принцип работы основывается на том, что спам-боты не умеют исполнять JavaScript. Идея в том, что если пользователь открыл сайт из браузера, браузер выполнит некоторый хитрый код JavaScript, и реузльтат работы этого скрипта будет передан назад на сервер в качестве доказательства «человечности» комментатора.
Недостаток этого подхода заключается в том, что используемый JavaScript является довольно-таки простым; как следствие, его можно «понять» даже из PHP-скрипта.
Пример кода JavaScript, генерируемого плагином:
var wphc_data = [1850500665,1666021931,1699898495,1648446524,2035770162,1980447546,2018932269,956464429,890644332,956447103,890644332,973224063,890579818,761213796,1850368808,1615687680,1750492719,756628087];
for (var i=0; i<wphc_data.length; i++){
wphc_data[i]=wphc_data[i]^220336991;
}
var a = new Array(wphc_data.length);
for (var i=0; i<wphc_data.length; i++) {
a[i] = String.fromCharCode(wphc_data[i] & 0xFF, wphc_data[i]>>>8 & 0xFF, wphc_data[i]>>>16 & 0xFF, wphc_data[i]>>>24 & 0xFF);
}
return eval(a.join(''));
}
Такой JavaScript весьма похож на PHP
Как следствие, идея обхода плагина заключается в том, чтобы преобразовать JavaScript в PHP и выполнить получившийся PHP-код.
Итак:
- В PHP нет ключевого слова
var(строго говоря, оно там есть, только имеет другое назначение). - В PHP несколько другой синтаксис объявления массива
- Идентификаторы в PHP начинаются с доллара
- Операция сдвига выглядит как
>>, а не>>>. - В PHP нет классов Array, String, но никто не мешает их написать
Наша задача состоит в преобразовании кода, приведённого выше, в нечто подобное:
$wphc_data = array(1850500665,1666021931,1699898495,1648446524,2035770162,1980447546,2018932269,956464429,890644332,956447103,890644332,973224063,890579818,761213796,1850368808,1615687680,1750492719,756628087);
for ($i=0; $i<count($wphc_data); $i++){
$wphc_data[$i]=$wphc_data[$i]^220336991;
}
$a = array();
for ($i=0; $i<count($wphc_data); $i++) {
$a[$i] = fromCharCode($wphc_data[$i] & 0xFF, $wphc_data[$i]>>8 & 0xFF, $wphc_data[$i]>>16 & 0xFF, $wphc_data[$i]>>24 & 0xFF);
}
return (join("", $a));
}
Это достигается таким набором правил str_replace():
'wphc_data' => '$wphc_data',
'var $' => '$',
'var ' => '$',
'];' => ');',
'= [' => '= array(',
'new Array($wphc_data.length)' => 'array()',
'$wphc_data.length' => 'count($wphc_data)',
' i<' => ' $i<',
'[i]' => '[$i]',
'i++' => '$i++',
'>>>' => '>>',
'a[$i] =' => '$a[$i] =',
'String.' => '',
'eval' => '',
"a.join('')" => 'join("", $a)',
);
$s = str_replace(
array_keys($x),
array_values($x),
$s
);
При желании правила можно попытаться оптимизировать, но мне было лень — скрипт ломался на коленке за 10 минут.
Реализация функции fromCharCode:
{
return chr($a) . chr($b) . chr($c) . chr($d);
}
После замены результат нужно вычислить при помощи eval(). После чего получим такой результат:
Как можно заметить, этот код является одновременно и PHP-кодом, и JavaScript-кодом.
Следующий шаг —
eval($s);
echo wphc_compute(), "\n";
Результатом выполнения будет число 1887804582.
Как видим, для обхода такой простой защиты не нужен даже интерпретатор JavaScript
Дек
2011
Комментарии к статье «Обход плагина WP Hashcash» (2) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «Обход плагина WP Hashcash»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


V8 и JavascriptCore – opensourse проекты так же есть интерпретаторы JS на PHP. JS код можно сурово обфусцировать так что человек его попросту не разберет и не перепишет. Но для JS “интерпретатора” (движка) это даже не проблема.
Я раньше какие только плагины WordPress для борьбы со спамом не ставил, толку было не много. А потом узнал про подмену полей – и проблема разрешилась сама собой. Правда этот метод работал изначально наверняка, и пришлось дополнить контактную форму простейшей капчей на сложение двух чисел. И спам комменты практически исчезли. Из чего я сделал вывод, что 99,9% спаммеров “гадят” при помощи программ. В ручную редкие “красавцы” это делают. Но на одном из проектов недавно заметил новый тренд (как это модно говорить): спам-комменты через трекбеки. Правда пока эта напасть не приняла массовый характер, и я даже не стал заморачиваться и ставить специальный плагин.