Доброго часу доби, шановні читачі блогу Мої таргани!
Хочу розчарувати тих, кого зацікавив заголовок статті - про те, як зламати сайт, писати я не буду. Даним постом хочу почати рубрику, присвячену безпеці сайтів на WordPress (і не тільки). Що робити для того щоб веб-сайт не зламали. І що робити, якщо ваш сайт вже зламаний.
Днями готував статтю про прискорення сайту на Вордпресс. При скануванні свого блогу на наявність «повільних» запитів виявив десять зауважень по PHP, на які потрібно звернути увагу. Дев'ять з них знаходилися в файлі funtion.php в функції, якої раніше там не було.
Я почав шукати в інтернеті, що являє собою цей загадковий код.
Спочатку за запитом я знаходив повідомлення з форумів, в яких власники сайтів на WordPress скаржилися на те, що при активації шаблону завантаженого з інтернету виникала фатальна помилка: Fatal error: Can not redeclare _verify_isactivate_widgets () (previously declared in /domains/site.ru/public_html /wp-content/themes/galegale/functions.php
У деяких випадках, при виникненні такої помилки ставала неможлива активація жодної з поставлених питань. Тобто публічна частина сайту виявлялася повністю паралізованою. Знаєте що писали у відповідь на цих форумах: "Ваш сайт зламали".
Але те, що у цих веб-майстрів, перестав працювати сайт - це скоріше плюс, ніж мінус - вони відразу дізналися про те, що на сайті є проблеми.
Копнувши глибше, спливала інша ситуація. У деяких користувачів WordPress, на сайті з'являлися приховані посилання в тілі статті. І виявити їх було нелегко. Якщо адмін був залягання, то в публічній частині вони йому не відображалися взагалі. Їх можна було побачити, якщо разлогініться в адмінці сайту. І то, «побачити» - це голосно сказано, правильніше буде - «знайти», тому що анкором посилання ставала точка в статті.
З чим маємо справу
Винуватцем всіх проблем був вірус, прописаний у вигляді PHP функції в кінці файлу functions.php. Починався він у всіх так:
І далі близько 200 рядків коду. Примітно, що ця функція з'являється в functions.php всіх тим встановлених на вашому сайті, навіть стандартних. І якщо ви скачаєте до себе на комп'ютер стандартний шаблон. наприклад, twentyten, і порівняйте functions.php завантаженої теми і теми, що є у вас на сайті, то переконаєтеся що цієї функції в локальному (що знаходиться на комп'ютері) файлі немає. Якщо ви виявили у себе щось подібне, знайте - ваш сайт зламали.
Як я зрозумів, код, про який йде мова - це черв'як. Ось що я знайшов про нього на одному з форумів:
Функція _verify_isactivate_widget () спочатку читає свій власний файл, потім за допомогою функції get_allwidgetcont () знаходить файли functions.php в каталогах інших тем і дописує себе в них. Крім процитованого фрагмента можуть бути супутні функції, які вставляють приховані посилання і т.д.
Тобто, коли ви активуєте, завантажену не зрозумій звідки, інфіковану тему - вона заражає всі теми встановлені на сайті. До речі, приховані посилання, мені здається - це найлегше, що може бути закодовано. Тут знайшов цікаву статтю про те, що може загрожувати вашому сайту, якщо ви підхопили такий вірус.
Насправді, лікування дуже просте. Потрібно видалити код з файлів functions.php всіх поставлених питань на вашому сайті. Видалити теми, викачані з ненадійних джерел. А в останніх темах в functions.php видаляємо все що починається з
і до кінця файлу.
Не завадило б змінити паролі від WordPress, ftp, та, про всяк випадок, від адмінки хостингу (хіба мало що було заховано в тілі хробака).
І наступного разу, коли будете встановлювати нову тему, переконайтеся у відсутності в ній шкідливого коду.
Мій випадок
Припускаю, що, конкретно в моєму випадку - було заховано зображення білого кольору розміром 1 піксель закодоване через Base64. І розміщувалося воно, так само, як і в наведених мною прикладах, в районі тега more.
У його наявності на сайті власні очі я переконається, не встиг - після лікування самостійне впровадження інфікованого коду викликало фатальну помилку. Але про його наявності я можу судити по цій ділянці коду:
Якщо пропустити R0lGODlhAQABAIAAAAAAAP /// yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 через декодер Base64 - ми отримаємо такий текст: GIF89a. D?;. Але якщо встановити щоб декодер видавав на виході файл - ми отримаємо GIF файл, переформатований в формат dat. Браузер все декодує і видає готовий результат - той самий зображення в один піксель.
Звичайно, з якою метою його туди помістили я так і не зрозумів. Мої поверхневі знання PHP розібратися в коді не дозволили.
Base64 - це позиційна система числення з основою 64. Система Base64 використовується в електронній пошті, як правило, при передачі бінарних даних (файли, картинки). Для кодування використовуються символи англійського алфавіту (A-Z, a-z) і цифри (0-9), що в сумі становить 62 знака, а для інших двох знаків використовуються різні символи, в залежності від різновиду Base64.
Як я помітив, про функції _verify_isactivate_widget () (точніше про використання її для злому сайту) відомо досить давно. Заразити сайт, подібним чином, простіше простого. Але ось чому в блогосфері я не зустрічав жодного поста на цю тему, мені не зрозуміло. Більш того, те, що я знаходив по _verify_isactivate_widget () - це були повідомлення з буржуйських форумів. Чи то у нас хакери не застосовують подібні практики, то чи веб-майстри не знають про існування подібної зарази.
До речі, антивіруси не реагують на даний скрипт. Тобто сама по собі функція не становить загрози для інших користувачів сайту. Що такого в тому, що веб-майстер добровільно вирішив розмістити у себе код, який транслює приховані посилання або, наприклад, висилає кому то на пошту дані необхідні для входу в адмінку. Виходить, порятунок потопаючих - справа рук самих потопаючих. Навіть не так, встановив крякнутий тему - ось і відповідай за свій косяк. Так що будьте уважні, дорогі веб-майстри, якщо не хочете щоб ваш сайт виявився зламаним.
На цій мінорній ноті прощаюся з вами. Підписуйтесь на оновлення блогу в Twitter. RSS або по пошті!