PHP Conference Japan 2024

错误报告

在 PHP 安全性方面,错误报告有两面性。一方面有利于提高安全性,另一方面则有害。

标准的攻击策略包括通过向系统提供不正确的数据来对其进行分析,并检查返回的错误类型和上下文。这使系统破解者能够探查有关服务器的信息,以确定可能的弱点。例如,如果攻击者根据先前的表单提交获得了有关页面的信息,他们可能会尝试覆盖或修改变量。

示例 #1 使用自定义 HTML 页面攻击变量

<form method="post" action="attacktarget?username=badfoo&amp;password=badfoo">
<input type="hidden" name="username" value="badfoo" />
<input type="hidden" name="password" value="badfoo" />
</form>

通常返回的 PHP 错误对于尝试调试脚本的开发人员来说非常有用,它指示诸如失败的函数或文件、发生失败的 PHP 文件以及发生失败的行号等信息。所有这些信息都可以被利用。php 开发人员通常使用 show_source()highlight_string()highlight_file() 作为调试措施,但在实时站点中,这可能会暴露隐藏的变量、未经检查的语法和其他危险信息。尤其危险的是运行来自已知来源并具有内置调试处理程序的代码,或使用常见的调试技术。如果攻击者能够确定您正在使用哪种通用技术,他们可能会尝试通过发送各种常见的调试字符串来暴力破解页面。

示例 #2 利用常见的调试变量

<form method="post" action="attacktarget?errors=Y&amp;showerrors=1&amp;debug=1">
<input type="hidden" name="errors" value="Y" />
<input type="hidden" name="showerrors" value="1" />
<input type="hidden" name="debug" value="1" />
</form>

无论使用哪种错误处理方法,探查系统错误的能力都会导致向攻击者提供更多信息。

例如,通用 PHP 错误的样式本身就表明系统正在运行 PHP。如果攻击者正在查看一个 .html 页面,并希望探查后端(以查找系统中的已知弱点),通过向其提供错误的数据,他们可能能够确定系统是用 PHP 构建的。

函数错误可以指示系统是否可能正在运行特定的数据库引擎,或者提供有关网页或程序设计或设计方式的线索。这使得能够更深入地调查开放的数据库端口,或查找网页中的特定错误或弱点。例如,通过提供不同的错误数据片段,攻击者可以确定脚本中身份验证的顺序(根据行号错误),以及探查可能在脚本中不同位置利用的漏洞。

文件系统或通用 PHP 错误可以指示 Web 服务器具有哪些权限,以及 Web 服务器上文件的结构和组织方式。开发人员编写的错误代码会加剧此问题,导致以前“隐藏”的信息容易被利用。

这个问题有三个主要解决方案。第一个是仔细检查所有函数,并尝试弥补大部分错误。第二个是完全禁用正在运行的代码上的错误报告。第三个是使用 PHP 的自定义错误处理函数来创建自己的错误处理程序。根据您的安全策略,您可能会发现所有三个都适用于您的情况。

提前捕获此问题的一种方法是利用 PHP 自身的 error_reporting(),以帮助您保护代码并查找可能存在危险的变量用法。通过在部署之前使用 E_ALL 测试您的代码,您可以快速找到变量可能以其他方式容易受到中毒或修改的区域。准备部署后,您应该通过将 error_reporting() 设置为 0 来完全禁用错误报告,或者使用 php.ini 选项 display_errors 关闭错误显示,以隔离您的代码免受探查。如果您选择后者,您还应该使用 error_log ini 指令定义日志文件的路径,并打开 log_errors

示例 #3 使用 E_ALL 查找危险变量

<?php
if ($username) { // 未初始化或在使用前未检查
$good_login = 1;
}
if (
$good_login == 1) { // 如果上述测试失败,则未初始化或在使用前未检查
readfile ("/highly/sensitive/data/index.html");
}
?>

添加注释

用户贡献的注释 1 条注释

earlz- -NO SPAM-- at earlz dot biz DOT tm
15 年前
对于那些使用 OpenBSD 和 PHP 的用户,请注意。默认的 php.ini 中 display_errors=off。这与 PHP 的默认值 display_errors=on 相反。如果在 OpenBSD 上遇到无法看到错误的问题,请确保将 php.ini 编辑为 display_errors=on。(我在 OpenBSD 4.4 上遇到了这个问题)
To Top