首页 > 解决方案 > 获取 PHP eval 的跟踪调用列表或手动覆盖它

问题描述

我正在调查 Revive Adserver 中仍未发现的零日漏洞。攻击发生在一个位置,攻击者能够调用eval已经在 Revive Adserver 代码库的开发和生产版本中的一个。

我已经调查过access_logs,他们表明用户正在对传递脚本进行 POST 攻击,fc.php但 POST 的有效负载仍然不清楚。

Revive Adserver 的代码库非常复杂、陈旧而且有时很奇怪。在代码中有很多地方eval调用了 an ,可能会发现如下内容:

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

这实际上是一个 Smarty 模板的东西,但它看起来真的很可怕。

如前所述,eval整个代码中出现了大量的外观,此时要花费大量时间来浏览每一个。

是否有可能覆盖evalPHP 中的函数以显示一些跟踪信息,即从哪个文件调用它,它发生在哪一行?

如果没有,是否可以通过修改 PHP 的 C/C++ 源代码并重新编译它来做到这一点?

或者是否有一个 PHP 扩展或一些工具可以跟踪eval整个脚本中的所有回调?

如果没有这样的东西,如果有人开发它会很棒,因为它会加快调查包含eval's 的恶意代码。

标签: phpevalexploit

解决方案


是否有可能覆盖 PHP 中的 eval 函数以显示一些跟踪信息,即从哪个文件调用它,它发生在哪一行?

有点。

您可以添加evaldisable_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等...... 例如总是错误的。有些只是比其他的更“功能”。emptyincludefunction_exists('empty')

无论如何,您可能必须禁用eval,我真的想不出解决办法。

小费

不要忘记你可以这样做:

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

这两者都抑制了异常(因此继续执行),并为您提供了一个很好的堆栈跟踪。

小费

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

重要的是要记住,对于 error_types 指定的错误类型,标准的 PHP 错误处理程序完全被绕过,除非回调函数返回 FALSE

因此,鉴于上述情况,您可以/应该为所有其他错误返回 false。然后 PHP 会报告它们。我不确定在这种情况下它是否真的很重要,因为这并不意味着在生产代码中,但我觉得值得一提。

希望能帮助到你。


推荐阅读