Ser capaz de usar arreglos en $_GET
de esta manera no es en sí mismo una vulnerabilidad de seguridad. El vector DoS me parece despreciable, aunque esto puede ser amplificado por el código que lo usa.
Sin embargo , los ejemplos que proporcionó se perdieron la parte más importante de esta función (desde el punto de vista de los atacantes): no solo es posible pasar matrices regulares en GET
y POST
parámetros de esta manera, pero también matrices asociativas . De hecho, PHP no destruye entre los dos:
Las matrices PHP pueden contener enteros y claves de cadena al mismo tiempo que PHP no distingue entre matrices indexadas y asociativas.
- PHP: Arrays - Manual
Esto significa que si un cliente suministra parámetros POST
como este:
<input type="text" name="pass[pass1]" value="Password 1">
<input type="text" name="pass[pass2]" value="Password 2">
$_POST
/ $_GET
se verá así:
$_POST = array(
...
'pass' => array(
'pass1' => 'Password 1',
'pass2' => 'Password 2',
),
...
);
Pero si el servidor esperaba que fuera una matriz normal en lugar de asociativa, podría provocar una vulnerabilidad de seguridad:
//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
con entrada esperada:
INSERT INTO USERS (index, password) VALUES(0, 'password1'), VALUES(1, 'password2')
$query
con ?pass[0,'');DROP DATABASE DATABASE();--]=foo
:
INSERT INTO USERS (index, password) VALUES(0,'');DROP DATABASE DATABASE();--, 'foo')
Dehecho,esteesexactamenteelmismoerrorquellevóalafalladeseguridadllamada"Drupalgeddon" , y recibió ese nombre por una buena razón.
Una vulnerabilidad en esta API permite a un atacante enviar solicitudes especialmente diseñadas que resultan en una ejecución de SQL arbitraria. Dependiendo del contenido de las solicitudes, esto puede llevar a una escalada de privilegios, ejecución arbitraria de PHP u otros ataques. - SA-CORE-2014-005 - Drupal core - Inyección de SQL
Los ataques automatizados comenzaron a comprometer los sitios web de Drupal 7 que no fueron parcheados o actualizados a Drupal 7.32 en las horas posteriores al anuncio de SA-CORE-2014-005 - Drupal core - inyección SQL. Debe proceder bajo el supuesto de que todos los sitios web de Drupal 7 estaban comprometidos, a menos que estén actualizados o parcheados antes del 15 de octubre, a las 11 p.m. UTC, es decir, 7 horas después del anuncio. - Drupal Core - Highly Critical - Anuncio de servicio público - PSA-2014-003
También fue la vulnerabilidad que probablemente conduzca a la divulgación de la Panama Papers (probablemente debería haber instalado esas actualizaciones de seguridad ...).
La vulnerabilidad de Drupal se corrigió al actualizar el código para pasar la matriz recibida a array_values()
, que devuelve una matriz indexada que contiene solo valores de la matriz que recibió, eliminando así cualquier clave maliciosa.
El código de ejemplo se podría arreglar de la misma manera:
Antes:
foreach($_GET['user'] AS $index=>$value){
Después de:
foreach(array_values($_GET['user']) AS $index=>$value){
Más información sobre Drupalgeddon, incluido un exploit operativo: Drupal 7: Drupalgeddon Exploit
Ten en cuenta que esto funciona de la misma manera, independientemente de si estás trabajando con $_GET
o $_POST
. No estoy seguro acerca de $_REQUEST
y $_COOKIE
.