【问题标题】:Security vulnerabilities in php fwrite?php fwrite 中的安全漏洞?
【发布时间】:2009-12-23 13:40:35
【问题描述】:

我最近将我的公司网站从托管公司 (IIS) 转移到了我们的内部服务器 (Apache)。最初建立该站点的小组做得很差,整个迁移过程一团糟。虽然移动相当顺利,但查看 error_log 仍然有一些缺失的页面。

不必不断地在 error_log 中查找与此域相关的“文件不存在”错误 - 我们在这些服务器上托管了大约 15 个左右 - 我想知道是否更容易简单地执行以下操作当发生 404 错误时:

  • 重定向到一个php页面并传递原始URL请求
  • 让新的 php 页面将 URL 转储到 log-ish 文件中

当我打字时,我越来越不相信这是一项有价值的工作。不管潜在的问题是,使用 fwrite 是否存在潜在的安全问题?如果要将输入附加到文件中,是否需要对用户输入进行任何类型的清理?无论价值如何,这个输入都不会靠近数据库。提前致谢。

【问题讨论】:

  • 文笔不错。当文件被查看、解释或执行时,您的安全漏洞就出现了。

标签: php security logging fwrite


【解决方案1】:

只要 是定义您要写入哪个文件的人(而不是从 URL 确定),就不会有太大风险:唯一你从用户那里得到的是你要写入文件的内容,如果你不执行那个文件,只是读取它,应该没问题。

以这种方式记录 404 错误的想法并不新鲜:我已经看过很多次了,并且从未遇到过任何重大问题(我看到的最大问题是文件变得相当大很快,因为错误太多了^^)

例如,Drupal 做了一些这样的事情:记录 404 错误——但记录到数据库中,因此使用 Web 界面更容易分析它们。

【讨论】:

    【解决方案2】:

    好吧,只是通常的文件系统的东西:不要让用户指定文件的去向:像script.php?filename=../../../../../../../etc/passwd 这样的东西甚至不应该有机会写入 /etc/passwd(脚本也不应该具有 FS 权限)。 除此之外,fwrite() 没有任何特殊字符可以让它跳转到某种命令模式。

    另外,404 页面非常简单(在 httpd.conf 中):

    ErrorDocument 404 /error_page.php
    

    然后将REQUEST_URL 转储到文件中

    【讨论】:

      【解决方案3】:

      fwrite 应该很安全。

      您也可以使用一些访问日志分析器,该分析器通常会列出未找到的页面。

      【讨论】:

        【解决方案4】:

        如果它所做的只是写入磁盘,那么外界唯一要做的就是让它写入磁盘。显然,文件名不应该是与无效 url 一起传递的参数。有些人可能会尝试通过发送大量带有非常长 url 的无效页面请求来利用它。但他们必须知道您正在这样做,并且当有其他更有效的方法(只是一般性攻击)时,他们必须足够关心。

        【讨论】:

          【解决方案5】:

          如果您将日志编写为 HTML(或恰好允许嵌入代码的其他文件类型),则需要注意一个潜在问题。这些文件当然容易受到 XSS 攻击。

          【讨论】:

            【解决方案6】:

            一种常见的日志文件攻击是请求包含嵌入式恶意 javascript 的 URL。这些 URL 直接写入日志文件,然后当任何人在 Web 浏览器中查看该文件时执行该文件。

            1. 确保您编写的文件不能被 Web 服务器作为 HTML 提供
            2. 考虑对 URL 进行 URL 编码或 HTML 编码。

            【讨论】:

              【解决方案7】:

              您应该已经在 error_log 中记录了 404 错误。

              无论如何都要使用自定义错误处理程序为用户提供更友好的错误消息,但如果此站点发现任何严重的吞吐量,那么从脚本中使用 fwrite 不是一个好主意。 PHP 本身并没有那种复杂的文件锁定语义来支持并发文件访问——但既然网络服务器正在为你记录信息,何必呢?

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-12-17
                • 2014-04-28
                • 1970-01-01
                • 2017-11-24
                相关资源
                最近更新 更多