允许某人上传 PHP 脚本存在哪些安全风险?

信息安全 恶意软件 php javascript 网络服务器 上传文件
2021-08-23 04:50:06

假设合作伙伴想要将 PHP 脚本上传到我的 Apache 服务器。这会造成什么样的混乱?

哪些 PHP 参数构成威胁?如果这些 PHP 参数被完全禁用,那么允许在我的服务器上插入 PHP 是否安全?

这些是我知道的一些 PHP 参数,它们构成了安全漏洞。还有哪些不安全的?

写入服务器:

  1. 文件获取内容

  2. FILE_APPEND

在服务器上打开文件:

  1. 开放

  2. 文件获取内容

  3. 包括

  4. 恐惧

  5. url_get_contents

  6. curl_init

  7. curl_setopt

删除文件:

  1. 取消链接
  2. 未设置

在允许合作伙伴将 .php 文件添加到我的服务器之前,我是否应该考虑任何其他安全漏洞?我想可能有很多我不知道的。

我还担心循环脚本会耗尽我所有的 RAM 和 CPU、后门访问攻击、恶意软件等。我是否可以采取任何措施来防止这种情况以及更多情况的发生?

如果 PHP 脚本中嵌入了 Javascript、JQuery 或其他语言,这些也很危险吗?为了保护我的服务器,我需要禁用哪些其他语言的参数?

jsfiddle 和 codepen 等网站如何在允许人们发布自己的代码的同时保证其网站的安全?

4个回答

这是非常危险的,因为您允许某人上传带有未知代码和未知意图的 PHP 文件,所以如果您需要此功能作为您网站的一部分,您应该强化您的服务器,例如:

  • 设置一个目录来上传用户的PHP文件,你应该为这个目录申请正确的用户权限(读、写或执行),记住为这个目录创建一个特定的用户,而不是使用root用户。
  • 您可以为目录创建 .htaccess 文件,然后可以为该目录设置特定设置(配置 .htaccess 文件)。
  • 验证输入用户,即使您应该为 PHP 文件设置特定的名称格式和最大大小,如果 PHP 文件与该格式不匹配或其大小大于允许的大小,则应用程序不应允许用户上传该文件文件。
  • 在使用文件函数之前使用规范化,例如:realpathbasename这可以帮助您避免路径遍历攻击。
  • 您应该禁用高风险的 PHP 函数,例如:exec、shell_exec。您可以通过 php.ini 文件执行此操作,例如,您可以添加以下行来帮助禁用操作系统命令执行和设置管理的功能:

    disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
    

    以下行有助于禁用包含或打开来自外部源的文件的功能:

    allow_url_fopen=Off
    allow_url_include=Off
    

官方文档 php.ini 文件

这些是一些基本的建议。您应该分析您的 Web 应用程序以及为您的服务器和 Web 应用程序设置正确设置的需求。

我希望这些信息对您有所帮助。

如果您允许某人在您的服务器上上传和执行 PHP 脚本,那么您实际上授予此人做他或她可以做的任何事情的权利,如果她使用用户名/密码访问 PHP 脚本运行的进程的 ssh 访问权限。

因此,如果相关人员将通过 Apache 运行脚本,则此人可以执行您服务器上的 Apache 用户可以执行的任何操作。

作为一个额外的风险,此人可能会使用给定的访问权限来尝试提升权限,这可能会破坏您与他们之间的法律协议(您确实有法律协议,不是吗?)。

对我来说,这听起来像是你要朝自己的脚开枪。让您不信任的人在您的服务器上上传和运行 PHP 是极其危险的。以下是攻击者可以尝试的一些操作:

  • 运行批处理命令接管您的网络服务器。然后它可以用作从您的网络中攻击其他服务器的集结地。
  • 读取包含秘密的文件,例如密码、加密密钥、TLS 密钥等。
  • 进行 XSS 攻击(使用 JavaScript)从您的用户那里窃取会话 cookie 或其他凭据。这是假设上传的文件与其他应用程序在同一域或子域上运行。

名单还在继续。有一些方法可以尝试阻止这些攻击(hmrojas.p有一些建议),但这并不是一件简单的事情。黑名单功能只是一个开始,但黑名单永远只是部分防御。即使对于最优秀的专家来说,包含可以运行 PHP 的人也是一个挑战。

最后,如果您不信任编写代码的人,您将不得不仔细手动审核代码以确保它是良性的。这需要时间和精力,并且与直接文件上传不兼容。

有时,唯一的制胜法宝就是不玩。我会说这是其中一种情况。

虽然有些网站允许您按需运行 PHP 代码(即3v4l),但它们严重限制了您可以做的事情并跳过一些主要的障碍来安全地完成它

我使用在小型虚拟机中执行脚本的设置。出于安全原因,这台机器没有网络,只有一个最小的文件系统。脚本由守护程序(用 Golang 编写)执行,结果(带有统计信息)报告给 PostgreSQL 数据库。所有结果都被存储并用于提供性能概览的平均值。

我不允许用户在实时环境中上传 PHP 脚本。我们曾经有一个实习生正在编写图像上传脚本。除了他忘记验证他正在接受的文件的任何内容。有人从土耳其上传了一个 PHP 恶意软件脚本并试图接管它(如果不是因为服务器上的其他安全措施,他也会侥幸逃脱)。