Несколько дней назад я написала в блоге о предназначенном для платформы osCommerce PHP/JavaScript-зловреде, в котором для обфускации вредоносного кода применен новый интересный прием. Так получилось, что чуть позже я наткнулась на еще более «продвинутый» образец PHP-инфектора, также в связи с уязвимым решением для электронной коммерции.
Мой коллега из польского офиса нашей компании попросил меня помочь с обнаружением вредоносного ПО, от которого пострадал интернет-магазин его друга. HTML-страница магазина при открытии ее в браузере содержала ссылку на скрипт jquery.js в генерируемом случайным образом домене третьего уровня в бесплатном домене cx.cc. При этом в исходных файлах на сервере этой ссылки и в помине нет. Поставить диагноз оказалось несложно: данный фрагмент кода добавляется динамически каким-то зараженным PHP-скриптом.
Мы просмотрели все PHP-файлы на сервере и были удивлены: на первый взгляд, ничего подозрительного в них не было. Однако, памятуя о зловреде div_colors, я принялась изучать код строку за строкой. В конце концов мое внимание привлекла небольшая функция в начале одного из основных PHP-файлов.
Код выглядит вполне невинно благодаря нескольким уровням обфускации. Первый (и весьма затейливый) уровень состоит в том, что код функции весь как будто состоит из одних комментариев. Если же присмотреться, окажется, что все теги комментариев расположены неправильно: они открываются в конце каждой строки и закрываются в начале следующей. Обнаружить это проще, если использовать подсвечивание синтаксиса. Второе, что сбивает с толку, — это описание функции, которое, вместе с использованными в коде именами, наводит на мысль, что функция связана с какими-то библиотеками.
А теперь самое интересное: как же на самом деле устроена эта функция? В этом не так-то просто разобраться. Ключ — в понимании того, что на самом деле находится между скобками в определении переменной $session_key. «Ничего» — ответ неверный ;-). Сразу не разберешь, но там не одни только пробелы: они перемежаются со знаками табуляции. Это хорошо видно, если включить в редакторе отображение служебных символов.
Функция разбивает этот коктейль из пробелов на фрагменты по 8 символов, а затем в каждом фрагменте заменяет все знаки табуляции единицами, а пробелы нулями. В результате получается двоичное число, которое затем преобразуется в десятеричное и отображается как символ ASCII… Ничего не скажешь, изобретательно, г-н вирусописатель!
В результате выполнения PHP-файла, содержащего эту CoreLibrariesHandler() функцию, в конец HTML-файлов дописывается вредоносная ссылка:
Этот скрипт перенаправляет пользователя к другому скрипту, тот к третьему — и так далее, но конечная цель этих переадресаций, судя по всему, уже отсутствует в интернете. Интересно, что конечный URL-адрес здесь тот же, что и в случае зловреда div_colors. Это привело нас к выводу, что у div_colors и CoreLibraries один и тот же источник.
Сигнатура этого PHP-скрипта добавлена в наши базы под именем Trojan.PHP.Injecter.c.
PS: После того, как этот пост был опубликован на английском языке на нашем сайте Securelist.com, один из читателей отметил, что подобная техника использования «пробелов» была описана в одном из докладов на конференции DEFCON 16 в 2008 году. Презентацию этого доклада можно посмотреть здесь.