PHP sprintf 漏洞?

信息安全 php 格式字符串
2021-08-16 17:49:52

在某些网站,如WriteCodeOnline, sprintfvsprintf以及其他相关的格式化字符串函数出于安全原因被禁用:

警告:出于安全原因,第1行已禁用 vsprintf()

我想知道这些安全原因是什么。我已经阅读了关于不受控制的格式字符串的维基百科文章,但它只涉及printf在 C中使用的方面

*printf在 PHP上执行的安全问题是什么?显然,该功能并不是为了防止 SQL 注入,而是使用正确的工具来完成这项工作。

2个回答

是的,它不是 C/C++ 语言;然而,perl、PHP、ruby 和 java 是继承各种 C 语言约定的后代。由于没有 %n,php 解决了部分问题,但它仍然有 %x,在某些情况下可以利用它。

基本上,如果您不指定它printf()它的变体可以允许控制格式字符串

未经验证的用户输入可以提供他们选择的格式字符串,这将导致类似条件的缓冲区溢出(不是真正的缓冲区溢出)。

现代 perl 和 PHP 将在开发阶段抛出警告,因此您不会创建缺少格式字符串的代码,如果您选择忽略它们,您可能会遇到问题。

由于您引用的站点允许您放入任何旧的东西来测试代码,因此它们可以防止输入printf()可能占用内存、造成拒绝服务攻击、导致程序过早终止或 PHP 解释器崩溃的创意格式字符串在那个网站上

C中的格式化字符串漏洞

不是任何传统意义上的,因为 PHP 的 sprintf 不支持任何真正危险的转换,如 %n。用户控制的格式字符串仍然会造成一些有限的破坏(考虑 %99999999s),但最糟糕的是,它可能会消耗内存和时间。

以下是整数溢出。这导致以下代码: -

<?php
echo sprintf('%2147483646$s', "foo"); # Warning: Too few arguments
echo sprintf('%2147483647$s', "foo"); # Warning: Argument number must be greater than zero

PHP 错误 #61531