php - 获取 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
整个代码中出现了大量的外观,此时要花费大量时间来浏览每一个。
是否有可能覆盖eval
PHP 中的函数以显示一些跟踪信息,即从哪个文件调用它,它发生在哪一行?
如果没有,是否可以通过修改 PHP 的 C/C++ 源代码并重新编译它来做到这一点?
或者是否有一个 PHP 扩展或一些工具可以跟踪eval
整个脚本中的所有回调?
如果没有这样的东西,如果有人开发它会很棒,因为它会加快调查包含eval
's 的恶意代码。
解决方案
是否有可能覆盖 PHP 中的 eval 函数以显示一些跟踪信息,即从哪个文件调用它,它发生在哪一行?
有点。
您可以添加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();
}
这两者都抑制了异常(因此继续执行),并为您提供了一个很好的堆栈跟踪。
小费
http://php.net/manual/en/function.set-error-handler.php
重要的是要记住,对于 error_types 指定的错误类型,标准的 PHP 错误处理程序完全被绕过,除非回调函数返回 FALSE
因此,鉴于上述情况,您可以/应该为所有其他错误返回 false。然后 PHP 会报告它们。我不确定在这种情况下它是否真的很重要,因为这并不意味着在生产代码中,但我觉得值得一提。
希望能帮助到你。
推荐阅读
- javascript - 您可以在没有 JavaScript 的情况下使用 Google reCAPTCHA v3 吗?
- api - 用于在服务之间发送文件的 REST API
- c++ - . 链表 , 反向 函数 , 数据 结构 ;
- xml - 当标签的url部分时如何提取Oracle XML
- javascript - ReactJS:错误:超过最大更新深度
- python - 无法使用 Django-cron 进行函数调用
- excel - Excel 创建新工作簿并复制现有工作簿表
- reactjs - 当访问正确的 url 并且用户未登录时,如何使我的 React 组件挂载?
- linux - 共享库符号冲突和静态链接(在 Linux 上)
- python - 不明白 x != " " 的用法