获取 PHP 评估的跟踪调用列表或手动覆盖它



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

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

Revive Adserver的代码库非常混合,有时很旧,很奇怪。代码中调用eval的地方有很多点,可能会发现类似以下内容:

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

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

如前所述,代码中有很多很多eval外观,此时浏览每个外观需要花费大量时间。

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

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

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

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

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

有点。

您可以在php.ini中添加evaldisable_functions。 然后,当您拨打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并不是一个真正的函数,它是一种语言结构,如issetemptyinclude等。例如,function_exists('empty')总是假的。 有些只是像其他人一样更"功能"。

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

提示

不要忘记你可以这样做:

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

它既抑制了异常(因此执行继续),又为您提供了一个很好的堆栈跟踪。

提示

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

请务必记住,除非回调函数返回 FALSE,否则 error_types 指定的错误类型将完全绕过标准 PHP 错误处理程序

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

希望对您有所帮助。

最新更新