能够以$_GET这种方式使用数组本身并不是一个安全漏洞。DoS 向量对我来说似乎可以忽略不计,尽管这可能确实被使用它的代码放大了。
但是,您提供的示例忽略了此功能最重要的部分(从攻击者的角度来看):不仅可以通过这种方式传递常规数组GET和POST参数,还可以传递关联数组。事实上,PHP 并没有区分这两者:
PHP 数组可以同时包含整数和字符串键,因为 PHP 不区分索引数组和关联数组。- PHP:数组 - 手册
这意味着如果客户端提供POST如下参数:
<input type="text" name="pass[pass1]" value="Password 1">
<input type="text" name="pass[pass2]" value="Password 2">
$_POST/$_GET看起来像这样:
$_POST = array(
...
'pass' => array(
'pass1' => 'Password 1',
'pass2' => 'Password 2',
),
...
);
但是如果服务器期望它是一个普通数组而不是一个关联数组,它可能会导致一个安全漏洞:
//Simplified example, bug is possible with parameterized queries as well
//Expects ?pass[]=password1&pass[]=password2
$query = 'INSERT INTO users (index, password) ';
$parts = array();
foreach($_GET['user'] AS $index=>$value){
parts[]=" VALUES ({$index}, ".$pdo->real_escape_string($value).')';
}
$query .= implode(", ", $parts);
$pdo->exec($query);//
$query 有预期的输入:
INSERT INTO USERS (index, password) VALUES(0, 'password1'), VALUES(1, 'password2')
$query与?pass[0,'');DROP DATABASE DATABASE();--]=foo:
INSERT INTO USERS (index, password) VALUES(0,'');DROP DATABASE DATABASE();--, 'foo')

事实上,这与导致名为“Drupalgeddon”的安全漏洞的错误完全相同——它获得该名称是有充分理由的。
此 API 中的漏洞允许攻击者发送特制请求,从而导致任意 SQL 执行。根据请求的内容,这可能导致权限提升、任意 PHP 执行或其他攻击。- SA-CORE-2014-005 - Drupal 核心 - SQL 注入
在宣布 SA-CORE-2014-005 - Drupal 核心 - SQL 注入后的几个小时内,自动攻击开始破坏未修补或更新到 Drupal 7.32 的 Drupal 7 网站。您应该假设每个 Drupal 7 网站都已被入侵,除非在 UTC 时间 10 月 15 日晚上 11 点之前(即公告后 7 小时)更新或修补。– Drupal 核心 - 高度关键 - 公共服务公告 - PSA-2014-003
这也是最有可能导致巴拿马文件泄露的漏洞(可能应该安装了那些安全更新......)。
Drupal 漏洞已通过更新代码以将接收到的数组传递给 来修复array_values(),它返回一个索引数组,其中仅包含它接收到的数组的值,从而摆脱了任何恶意密钥。
示例代码可以以相同的方式修复:
前:
foreach($_GET['user'] AS $index=>$value){
后:
foreach(array_values($_GET['user']) AS $index=>$value){
有关 Drupalgeddon 的更多信息,包括一个有效的漏洞利用:Drupal 7: Drupalgeddon Exploit
请注意,无论您使用的是$_GET还是,这些东西的工作方式都是一样的$_POST。我不确定$_REQUEST和$_COOKIE。