Si te convence el contenido de mi Blog, te recomiendo Suscribirte a Nuestro Boletín Gratuito y recibirás todos los Artículos y Vacantes de Empleo en tu Email.

Seguridad Web - SQL Injection


Desde que comenzé en el campo de la programación siempre me han catalogado de paranoico en cuanto a la seguridad. Aun fue peor cuando fui asignado al departamento de Web Programming e Integraciones en las cuales mi nivel de preocupación aumentó en cuanto a seguridad de aplicaciones públicas (Web).

Muchas tecnologías, aplicaciones y técnicas han surgido en los ultimos años, pero éstas, debido a su pobre implementación, son vulnerables a los más simples métodos de ataque.

Debido a esto, he decido publicar una serie de artículos que les ayudarán a tener una visión de lo que implica desarrollar una aplicacion de uso público, o más bien, en Internet, las pautas a seguir para desarrollar un sistema seguro, asi como también el énfasis en el uso de Expresiones Regulares (regEx).

Inyección SQL
-------------------------------------
SQL Injection 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.

Uno de los más comunes ataques, y el mas simple, aparece cuando la entrada de datos no es validada antes de incluirse dentro de una sentencia SQL. Por ejemplo, dada la sentencia (muy comun cuando se crea un login):

$query="SELECT count(name)
FROM users
WHERE id='$id_usuario' AND pass='$pass_usuario'";

Donde:
$id_usuario='pepito' ;
$pass_usuario='12345';

Si estos datos no son validados, se puede injectar en cualquiera de las variables:

$pass_usuario="122' OR 1=1; --"; // "--" es un comentario en una sentencia SQL

A partir de esto, obtenemos

SELECT count(name)
FROM users
WHERE id='pepito' AND pass='122' OR 1=1; --";

Cuyo resultado siempre tendrá un valor y pasará la validación.

Pero, imaginense que nuestro hacker no tiene muy buenas intenciones, se puede inyectar también un código como el siguiente:

$pass_usuario="122'; DROP TABLE users; --"; // Este Podría fallar debido a los permisos asignados en la DB

$pass_usuario="122'; UPDATE users SET pass='111' WHERE 1=1; --";

En fin usen su imaginación y piensen en el daño que podría causarse...

El siguiente caso es el manejo incorrecto de los tipos datos:

$query="SELECT count(name)
FROM users
WHERE pass='$pass_usuario' AND id=$id_usuario ";

$id_usuario="1; UPDATE users SET first_name='111' ;--";

Logramos que todos los usuarios se llamen 111!!!!....

Se preguntaran, como sabremos los nombres de las columnas? Muy fácil, muchos de los servidores de aplicaciones web corren en "Debug Mode", reportando todos los errores, revelando el lenguaje de programación, la base de datos, directorios, links, etc.

Y como sabremos si una pagina es vulnerable o no? Facil!! primeramente, la prueba de la comilla (quota) o comillas.

Recuerden, que estas entradas no son simplemente desde un formulario. Existe la barra de direcciones. Por ejemplo, han visto paginas con direcciones como esta:

www.pagexxx.com/dir/userid=12222

Sean creativos... Por que no tratar de inyectar algun SQL a ver que pasa?

www.pagexxx.com/dir/userid=12222;UPDATE%20users%20SET%20user='111'

Para finalizar el dia de hoy, los dejo con un video un poco interezante y divertido acerca de SQL Injection:



Jonathan N.

0 Comentarios: