如果我的网站抛出堆栈信息,我应该担心吗?

信息安全 Web应用程序 php 脆弱性 错误处理
2021-08-20 13:51:50

我的网页上有一个简单的登录表单,URL 如下所示:

example.com/signup/signup.php?q=1

如果我尝试这样的事情:

example.com/signup/signup.php?q=1&()

我被重定向到一个看起来像这样的堆栈转储:

exception 'DOMException' with message 'Invalid Character Error' in /<mydirectory>/a_xml.class.php:74
Stack trace:
#0 /<mydirectoy>/a_xml.class.php(74): DOMDocument->createElement('()')
...
#6 {main}

这在安全性方面是一个大问题吗?是否有恶意用户可以执行任何攻击来破坏或窃取我的数据库?或者这是相对良性的,我可以忽略它?

4个回答

在生产(与开发相反)环境中,堆栈跟踪和错误消息应记录到文件中,而不是转储到屏幕上。这是因为攻击者可能会了解有关您系统的信息,这可能有助于破坏您的系统。

操作系统、Web 服务器版本、PHP 版本等信息。一些堆栈跟踪可能包含不应公开的系统/环境变量!

用户/访问者应该得到一个漂亮的 HTTP 错误页面,而不是对访问者无用的消息。

这有两个不同的方面:

  • 导致堆栈跟踪的错误是否是安全漏洞。
  • 框架是否配置为向外部人员显示堆栈跟踪。

错误消息Invalid Character Error听起来很像被遗忘的转义,通常可以通过某种方式加以利用。因此,您应该关注堆栈跟踪,因为它是可能存在安全漏洞的征兆。

另一个问题是您是否应该担心向外界显示堆栈跟踪。一方面,隐藏有关系统内部的信息可以被视为通过默默无闻的安全性。在大多数情况下,我会同意这一点,但在堆栈跟踪的情况下则不然。

堆栈跟踪仅在出现问题时显示,因此如果存在堆栈跟踪,则存在存在错误的重大风险,如果存在错误,则存在可被利用的重大风险。因此,使堆栈跟踪远离外界是一个好主意。此外,如果堆栈跟踪不仅包含被调用函数的名称,还包含参数值,那么它很容易泄露密钥、密码、cookie 或其他类型的凭据。

由于上述两个原因,请务必注意堆栈跟踪的显示位置。

然而,重要的是堆栈跟踪可供需要解决问题的人使用。因此,堆栈跟踪的日志记录很重要。如果堆栈跟踪表明存在实际安全漏洞的情况,您需要尽快修复它们。即使一个非描述性的错误消息不会给攻击者太多的工作,只要意识到哪些字符有效,哪些不有效,他们还是可以弄清楚如何利用它。

这里有两个问题,OP询问不太重要的问题。

显示跟踪

这是OP询问的问题。关于一般情况下显示跟踪的问题有多少存在争议,这个特定示例很好地表明显示跟踪可能是一个安全问题这样做的原因是它让我们(你、我和黑客)知道第二个问题的存在。

不过滤用户输入

这是一个真正的问题。我不仅知道(感谢跟踪)您的应用程序正在将未经过滤和未经验证的用户输入传递给本机 PHP 函数,我什至知道这DOMDocument->createElement()是有问题的函数。现在我将开始攻击这个站点以及我可以与该公司识别的所有站点,以解决其他过滤问题,例如 SQL 注入、XSS、CSRF、令人作呕的问题。

请注意,堆栈跟踪包含参数。如果有函数调用将密码作为参数传递,那么这些函数调用最终会出现在堆栈跟踪中。

如果一个用户可以将另一个用户的密码显示给他,那显然是一场灾难。不太明显的是,用户密码现在位于日志文件中;这会让你的用户非常生气。至少,您需要确保不会发生密码记录。