Получить список вызовов трассировки PHP eval или переопределить его вручную - PullRequest
0 голосов
/ 22 марта 2019

Я расследую еще не обнаруженную уязвимость нулевого дня в Revive Adserver.Атака произошла в одном месте, и злоумышленник смог вызвать eval, который уже был в разрабатываемой и рабочей версии Revive Adserver.

Я исследовал access_logs, и они указывают на пользователявыполнял POST-атаку на скрипт доставки fc.php, но полезная нагрузка POST все еще остается неясной.

База кода Revive Adserver очень смешанная, порой старая и странная.Есть много точек, где в коде вызывается eval, и можно найти что-то вроде:

$values = eval(substr(file_get_contents(self::$file), 6));

Что на самом деле является шаблоном Smarty, но выглядит действительно страшно.

Как уже упоминалось, в коде присутствует много и много eval появлений, и в настоящее время просмотр каждого из них займет много времени.

Есть ли возможность переопределить функцию evalв PHP для отображения некоторой информации о трассировке, то есть из какого файла она была вызвана, в какой строке это произошло?

Если нет, то возможно ли это сделать, изменив исходный код PHP на C / C ++ и перекомпилировав его вообще??

Или есть расширение PHP или какой-либо инструмент, который может отследить все обратные вызовы eval в скрипте?

И если такой вещи нет, было бы здорово, если бы кто-то ее разработалтак как это ускорит расследование вредоносного кода, содержащего eval.

1 Ответ

1 голос
/ 22 марта 2019

есть ли возможность переопределить функцию eval в PHP для отображения некоторой информации трассировки, т.е. из какого файла она была вызвана, в какой строке она произошла?

В некотором роде.

Вы можете добавить eval к disable_functions в php.ini.Затем, когда вы вызываете eval, вы получите фатальную ошибку function eval not found или что-то подобное.

Затем с пользовательским обработчиком ошибок.

   set_error_handler(function($errno, $errstr, $errfile, $errline){
       if(false !== strpos($errstr,'eval')){
           throw new Exception();
       }else{
           return false; //see below
       }
       //debug_print_backtrace() - I prefer exceptions as they are easier to work with, but you can use this arcane thing too.
   });

Или что-то в этом роде (не проверено).

К сожалению, вы не можете переопределить eval как свою собственную функцию.Eval на самом деле не функция, это языковая конструкция, такая как isset, empty, include и т. Д. Например, function_exists('empty') всегда ложно.Некоторые просто более «функциональны», чем другие.

В любом случае вам, вероятно, придется отключить eval, я не могу придумать, как обойти это.

Подсказка

Не забудьте, что вы можете сделать это:

  try{
       throw new \Exception;
  }catch(\Exception $e){
      echo $e->getTraceAsString();
  }

Что подавляет исключение (поэтому выполнение продолжается) и дает хорошийstacktrace.

Совет

http://php.net/manual/en/function.set-error-handler.php

Важно помнить, что стандартный обработчик ошибок PHPполностью игнорируется для типов ошибок, указанных в error_types, если только функция обратного вызова не возвращает FALSE

Поэтому, учитывая вышесказанное, вы можете / должны возвращать false для всех других ошибок.Тогда PHP сообщит о них.Я не уверен, что это действительно имеет большое значение в этом случае, поскольку это не обязательно должно быть в рабочем коде, но я чувствовал, что стоит упомянуть.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...