Mis experiencias con Drupal (sql Injection)

Hola comunidad:

Voy a tratar de ir explicando paso a paso, como logré solucionar algunos problemas de actualización y ataques recibidos...Las bases de Drupal usadas por mi son Drupal 4.7.8 y Drupal 5.1 y 3.

Muchos cuando recien comienzan hacen instalaciones desde fantástico (Cpanel), generlmente fantástico tiene la última versión, desde mi punto de vista no es recomendable, porque cada drupal es un mundo de módulos, de errores, y desconocimiento.

Como sabemos cuando tenemos las cosas bien hechas?

Es muy simple, una vez logueados, cuando vamos al sector adminstrar (administer), veremos en pantalla los errores, ya sean de módulos o de php, o de contenido no encontrado. Este último por general pasa cuando hacemos una mala actualización.

Esta es la definición y ejemplo de lo que es Sql Injection:

 

Inyección SQL es una vulnerabilidad informática en el nivel de la validación de las entradas a la base de datos de una aplicación. El origen es el filtrado incorrecto de las variables utilizadas en las partes del programa con código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o de script que esté incrustado dentro de otro.

Una inyección SQL sucede cuando se inserta o "inyecta" un código SQL "invasor" dentro de otro código SQL para alterar su funcionamiento normal, y hacer que se ejecute maliciosamente el código "invasor" en la base de datos.

La inyección SQL es un problema de seguridad informática que debe ser tomado en cuenta por el programador para prevenirlo. Un programa hecho con descuido, displicencia, o con ignorancia sobre el problema, podrá ser vulnerable y la seguridad del sistema puede quedar ciertamente comprometida. Esto puede suceder tanto en programas corriendo en computadores de escritorio, como en páginas Web, ya que éstas pueden funcionar mediante programas ejecutándose en el servidor que las aloja.

La vulnerabilidad puede ocurrir cuando un programa "arma" descuidadamente una sentencia SQL, con parámetros dados por el usuario, para luego hacer una consulta a una base de datos. Dentro de los parámetros dados por el usuario podría venir el código SQL inyectado.

Al ejecutarse esa consulta por la base de datos, el código SQL inyectado también se ejecutará y podría hacer un sinnúmero de cosas, como insertar registros, modificar o eliminar datos, autorizar accesos e, incluso, ejecutar código malicioso en el computador.

Asumiendo que el siguiente código está en una aplicación web y que existe un parámetro "nombreUsuario" que contiene el nombre de usuario que nosotros le demos, la inyección SQL es posible:

consulta := "SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';"

Si el usuario escribe su nombre, digamos "Alicia", nada anormal sucedería, la aplicación generaría una sentencia SQL similar a la siguiente, que es perfectamente correcta, en donde se seleccionaría al usuario "Alicia":

SELECT * FROM usuarios WHERE nombre = 'Alicia';

Pero si un usuario malintencionado escribe como nombre de usuario: "Alicia'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%", se generaría la siguiente consulta SQL, (el color verde es lo que pretende el programador, el azul es el dato, y el rojo, el código SQL inyectado):

SELECT * FROM usuarios WHERE nombre = 'Alicia';
DROP TABLE usuarios;
SELECT * FROM datos WHERE nombre LIKE '%';

La base de datos ejecutaría la consulta en orden, seleccionaría el usuario 'Alicia', borraría la tabla 'usuarios' y seleccionaría datos que quizá no están disponibles para los usuarios web comunes. En resumen, cualquier dato de la base de datos está disponible para ser leído o modificado por un usuario malintencionado.

Nótese por qué se llama "Inyección" SQL. Si observamos el código malicioso, de color rojo, vemos que está en el medio del código bueno, el verde. El código rojo ha sido "inyectado" dentro del verde.

Ejemplos [editar]

La inyección SQL es fácil de evitar en la mayoría de los lenguajes de programación que desarrollan aplicaciones web. En Perl DBI, el método DBI::quote filtra los caracteres especiales (asumiendo que la variable $sql contiene una referencia a un objeto DBI)

$query = $sql->prepare
(
"SELECT * FROM usuarios WHERE nombre = "
.
$sql->quote($nombre_usuario)
);



O también se puede usar la característica placeholder (con comillado automático) como sigue:

$query = $sql->prepare("SELECT * FROM usuario WHERE nombre = ?");
$query->execute($nombre_usuario);


En PHP, hay diferentes funciones que nos pueden servir de ayuda para usar con distintos sistemas de gestión de bases de datos. Para MySQL, la función a usar es mysql_real_escape_string:

$query_result = mysql_query
(
"SELECT * FROM usuarios WHERE nombre = \""
.
mysql_real_escape_string($nombre_usuario)
.
"\""
);



En el Java, tenemos que usar la clase PreparedStatement :

En vez de

Connection con = (acquire Connection)
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';");


hay que usar lo siguiente

Connection con = (acquire Connection)
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM usuarios WHERE nombre = ?");
pstmt.setString(1, nombreUsuario);
ResultSet rset = pstmt.executeQuery();



En C#, de la plataforma .NET (o su alternativa libre Mono), tenemos ADO.NET SqlCommand (para Microsoft SQL Server) or OracleCommand (para servidores de bases de datos Oracle). El ejemplo de abajo muestra cómo prevenir los ataques de inyección de código usando el objeto SqlCommand. El código para ADO.NET se programa de forma similar, pero puede variar levemente según la implementación específica de cada proveedor.

En vez de

using( SqlConnection con = (acquire connection) ) {
con. Open();
using( SqlCommand cmd = new SqlCommand("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "'", con) ) {
using( SqlDataReader rdr = cmd.ExecuteReader() ){
...
}
}
}


hay que usar lo siguiente

using( SqlConnection con = (acquire connection) ) {
con. Open();
using( SqlCommand cmd = new SqlCommand("SELECT * FROM usuarios WHERE nombre = @nombreUsuario", con) ) {

cmd.Parameters.AddWithValue("@nombreUsuario", nombreUsuario);

using( SqlDataReader rdr = cmd.ExecuteReader() ){
...
}
}
}

Una de las mejores definiciones que encontré para parar este tipo de ataques lo pude obtener de http://www.eslomas.com/index.php/archives/2006/06/07/sql-injection-con-ejemplos/.

EL tema principal, es saber cuando somos atacados, para saberlo es simple, solo debemos ver como van nuestros recursos, o cuando empiezan a llegar los mail del host avisando sobre el consumo de recursos.

Por mi parte recibí ataques a sitios que sólo tenían unas 100 visitas por día, y era imposible con esa cantidad de visitas mi Drupal estuviera haciendo sobre uso de recursos. Me maté buscando en los log's para ver de donde venía este mal. Denegué IP's más de una veintena, armé un todo poderoso robots.txt y todo seguía igual.

Hasta pararme a leer el link antes mensionado...

Bien hasta aca fui con este sql injection...

luego hablaré de la vulnerabilidad “cross-site scripting

Salud!!!

Hola Marcelo, gracias una vez más por tus enseñanzas. Entiendo la introducción de código para obtener datos de una base pero ¿cual es la función de los ataques que te consumen recursos?

 

Dices que no recomiendas la instalación mediante cpanel porque cada Drupal es un mundo pero ¿por qué ha de ser más problemática esta instalación que la manual, o por qué han de ser más difíciles de solucionar los errores?

 

Saludos

Mira el tema principal de ataque pasa por varios actos hacia la BBDD, la destrucción de tablas o el borrado del contenido...También ejecutando algunos comandos te pueden tirar tú sitio...

 

Con el tema Cpanel y el uso de Fantástico como modo de instalación hay errores, generalmente los paneles tienen la última versión de drupal o cualquier otro scripts, y más de una vez los módulos, plugin no están aún actualizados. Ese es el mayor problema.

También agrego que para los que se inician con drupal que lo hagan las versiones anteriores, tipo la 4.7.10...Porque son versiones más dóciles, una vez aprendido el uso de estos si pueden subir a una versión superior

Salud!!!

 

http://www.hosthostings.com