website stats » Inyección SQL en aplicaciones Web (I) | Solo Código |

Inyección SQL en aplicaciones Web (I)

Escrito por J.F. el Wednesday, 5 de September del 2007 a las 10:03

Podemos definir inyección SQL como la vulnerabilidad en la validación de entradas a la base de datos en una aplicación. La aplicación puede ser cualquier tipo de software que precise del uso de base de datos, o una aplicación web que interactúa con base de datos para funcionar, ya bien sea en un sistema de búsqueda, extracción, inserción de información o creación de lugares restringidos mediante la creación de usuarios con contraseñas estableciendo diferentes niveles de permisos. La inyección SQL es un fallo que puede resultar terrible, ya que permite la ejecución de sentencias SQL no deseadas, desde borrado de tablas hasta cambio de permisos pasando por obtención de passwords y otros datos de tablas. Es uno de los errores que sucede tanto a programadores inexpertos como a otro más avanzados, por lo que debe ser algo que siempre tengamos en mente y pongamos todas las medidas posibles para curarnos en salud. Vamos a explicar con algún ejemplo la inyección SQL. El caso más típico es el de una tabla que almacena el nombre de un usuario y su contraseña correspondiente. Imaginemos una tabla creada de la siguiente forma:

SQL:
  1. CREATE TABLE identificacion
  2. (usuario varchar (50) PRIMARY KEY,
  3. password varchar (50));

Ahora pongamos el ejemplo simple de un formulario HTML que va a procesar la información que le mandamos en una consulta contra la base de datos:

HTML:
  1. <form action="login.php" method="post">
  2.        Nombre: <input type="text" name="usuario"><br>
  3.        Password: <input type="password" name="password"><br>
  4.        <input type="submit" value="Entrar">
  5. </form>

Recibiremos esos 2 parámetros por el método POST, y los utilizaremos para consultar en la base de datos. Nuestra pretensión es que si existen usuario y contraseña y coinciden, se acceda a un nuevo área privada de nuestro sitio web, en caso contrario se denegará el acceso a dicho área. Veamos pues con 2 ejemplos de consultas contra la base de datos para validar la existencia del usuario y su correspondiente password, que pueden parecernos muy naturales, pero pueden depararnos sorpresas muy desagradables si no tomamos las precauciones necesarias.
Primer caso:

SQL:
  1. SELECT * FROM identificacion WHERE usuario = '$usuario' AND password = '$password';

En éste caso, si el nombre de usuario es correcto, y la contraseña es la asignada, permitiríamos el acceso a nuestra sección privada de la web. Si en el campo usuario escribieran "Pepe" (sin comillas), y en el campo contraseña introdujeran la contraseña,por ejemplo "1234", no ocurriría nada. Se verificaría si es correcto, dando acceso en caso de serlo y denegándolo en caso contrario. Pero, ¿Qué ocurriría si algún usuario malintencionado introdujera como nombre de usuario "Pepe" y como contraseña "1234'; DROP TABLE identificacion" ? Pues estaríamos ejecutando las siguientes querys contra nuestra base de datos:

SQL:
  1. SELECT * FROM identificacion WHERE usuario = 'Pepe' AND password = '1234';
  2. DROP TABLE identificacion;

Aquí podemos ver claramente por qué se llama Inyección SQL, al no estar controlado el tema de las comillas, el usuario nos ha colado otra orden SQL en el campo de texto password, y podría realizar cualquier operación que deseara, en éste caso el borrado de una tabla. Quizás a alguno se os venga una pregunta a la cabeza, ¿Como sabía el usuario que tengo una tabla en la base de datos llamada identificacion? Varios pueden ser los motivos. Por ejemplo, podrían haber visto algún error en nuestra página web, de los que nos arroja el servidor por defecto, en los que puede aparecer el nombre de la base de datos o el nombre de alguna tabla. Por ello resulta muy importante controlar los errores que se muestran(evitando los errores que se muestran por defecto, que puedan facilitar información acerca de nuestra base de datos), cambiándolos por alguna pantalla estándar tipo "Error en la base de datos", dejando los otros errores para depurar.Para evitar mostrar ningún tipo de error podemos usar la función error_reporting de PHP, de la que ya hemos hablado. Otro factor a la hora de "adivinar" información acerca de nuestra base de datos puede ser recurrir a nombres comunes que se le pueden dar a tablas, como "user", "password", "comments", etc. También puede suceder que la Inyección SQL se dé en un CMS tipo WordPress, PHP-Nuke, PHPBB, etc. Ahí el trabajo se ha facilitado, ya que cualquier puede instalar una de éstas aplicaciones y comprobar la estructura de la base de datos con pelos y señales. Por ello es necesario estar al tanto de nuevos parches y actualizaciones que surjan, ya que aunque el nivel de seguridad de éstas aplicaciones es alto, los desarrolladores de los mismos no están exentos de cometer errores, y son miles de personas las que se dedican a buscar agujeros de seguridad. Veamos otro segundo ejemplo de consulta, con la cual podemos llevarnos también una sorpresa:

SQL:
  1. SELECT Count(*) FROM Usuarios WHERE Usuario = '$usuario' AND Password = '$password';

En éste caso verificaremos que la consulta nos devuelva un registro para permitir o no el acceso, por tanto en teoría tan sólo escribiendo el nombre de usuario y contraseña correctos deberíamos poder acceder al área privada de nuestro sitio web. Pero nuevamente aparece un usuario malintencionado, el cual escribe lo siguiente en el formulario de logueo:

Usuario: ' or '1'='1
Contraseña: ' or '1'='1

En éste caso la consulta que se ejecutará es la siguiente:

SQL:
  1. SELECT COUNT(*) FROM identificacion WHERE usuario = '' OR '1'='1' AND password = '' OR '1'='1'

Obviamente, todos sabemos que uno es igual que uno, por lo tanto ésta consulta devolvería true y por tanto un acceso no deseado a la sección privada de neustra página web. Y éstos son sólo 2 métodos de tratar inyectar código SQL, pero hay otro tipo de formas mucho más complejas y profundas, que puedes encontrar facilmente navegando por Internet, puesto que los 2 ejemplos expuestos son facilmente controlables. ¿Cuales son las diferentes formas y métodos de evitar la inyección SQL? ¿Alguna herramienta para poder buscar vulnerabilidad de inyección SQL en nuestra páginas, de modo que podamos cubrirlas? Pues sí, todo ello lo detallaré en otros artículos, pero hasta el momento espero que hayan podido ver en qué consiste la inyección SQL y cuales son sus graves consecuencias.

Comentarios (12)

Categoria: General

12 Comentarios

Entradas relacionadas


Pingback de » Herramienta para detectar Inyección SQL y vulnerabilidades XSS | Informática Práctica |

Realizado el Wednesday, 19 de September del 2007 a las 14:06

[...] en lo que respecta a seguridad en aplicaciones web. La inyección SQL la tratamos en 3 partes(I,II,III) y las vulnerabilidades XSS en una. Si no las conoces te recomiendo su lectura para que te [...]

Comentario de Pedro

Realizado el Friday, 23 de November del 2007 a las 18:03

Gracias, con esto me aclaro muy bien

Comentario de JAIME LANDAZURY

Realizado el Friday, 15 de February del 2008 a las 23:00

QUIERO SABER DE TODOS LOS METODO DE APLICACION DE INYESION

Comentario de J.F.

Realizado el Monday, 18 de February del 2008 a las 17:19

Pues métodos hay montones, a cada cual más complicado, algunos de ellos lso encontrarás en enlaces de la tercera parte del artículo.

Comentario de Albertcito

Realizado el Tuesday, 22 de April del 2008 a las 7:08

Creo que podría ser igualmente de eficiente colocar un if con expresiones regulares, por ejemplo que las entradas solos sean de letras y numero y no pueden llevar espacios!!!

if(ereg( "[0-9a-z]", $usuario) && ereg ("[0-9a-z]", $password))

Bueno grax por los datos en todo caso estan super buenos .. Aioz :D

Comentario de J.F.

Realizado el Wednesday, 23 de April del 2008 a las 23:05

Gracias por tu opinión Albertcito, logicamente hay muchas formas y respuestas a los problemas :P
Un saludo.

Comentario de guerra

Realizado el Thursday, 17 de July del 2008 a las 8:12

si alguien me pudede ayuda este esmi msn

brian_losmillo_14@hotmai.com

porfavor!!!!!

quiero yudaaa!!!yaa!!!!!

Comentario de guerra

Realizado el Thursday, 17 de July del 2008 a las 8:12

enserio gente se los pido porfavor!!!!!!!

Comentario de busypetskitc

Realizado el Tuesday, 19 de August del 2008 a las 18:27

juicy yes all watch stay you all clean wood busy sun microsoft water

Comentario de s

Realizado el Thursday, 4 de September del 2008 a las 22:34

Puedes usar las siguientes etiquetas HTML:

Comentario de zinjcv mghvs

Realizado el Sunday, 9 de November del 2008 a las 10:29

qakzyhp ckqnizx kemipy gpta xzyeki fmvkuwc tzpvq

Comentario de arkadis

Realizado el Thursday, 30 de April del 2009 a las 0:41

muy bueno, me ayudaste mucho a entender lo del inyeccion sql!

Escribir un comentario

Puedes usar las siguientes etiquetas HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Solo Código

Solo Código es una colección de códigos de todo tipo que pueden resultar útiles para el diseño de páginas web. Está enfocado tanto para aquellos que son expertos, como para aquellos principiantes que quieren encontrar recursos útiles, o no saben implementar determinadas funciones en sus webs. No olvides que Solo Código es un blog de Informática Práctica, donde tenemos otras secciones interesantes como:
| Tutoriales | Trucos | Software | Links | Buscar |