我正在调查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
中添加eval
到disable_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并不是一个真正的函数,它是一种语言结构,如isset
、empty
、include
等。例如,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会报告它们。 我不确定在这种情况下它真的有多重要,因为这并不是真正打算在生产代码中,但我觉得值得一提。
希望对您有所帮助。