Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki

Programación: En qué consisten los ataques por inyección de SQL
Seguridad Informática


Artículo - Manual - Información que explica en qué consisten los ataques por inyección de SQL (sql injection) y cómo prevenirlos. Se dan en páginas web con acceso a bases de datos, realizadas con gestores de contenidos como PHP-Nuke.

Con este artículo pretendemos explicar en qué consisten los ataques por inyección de SQL y cómo prevenirlos.

Este tipo de ataques se pueden dar sólo en sitios webs que utilicen bases de datos, por ejemplo los creados con php-nuke que utilizan MySQL, normalmente. Un atacante utilizará los enlaces del sitio web que accedan a la base de datos para cualquier tipo de consulta (mediante php, asp, jsp, etc) introduciendo en estos código alternativo para obtener más datos ó contraseñas. Incluso podría ejecutar casi cualquier tipo de instrucción SQL en la base de datos del sitio web (Delete, Drop, etc). Es más, si el motor de la base de datos es MySQL, el atacante, podría modificar y visualizar ficheros mediante

El hecho de que estos ataques sean tan frecuentes se debe a que no son muy complicados de realizar. Estos fallos de seguridad sólo residen en la capa de aplicación que ataca la base de datos, no dependen del Servidor web (Apache, Tomcat, IIS, etc) ni de la base de datos (Oracle, MySQL, SQL Server, etc).

Ejemplos de inyección de SQL:

Un ejemplo sencillo para obtener la contraseña del usuario administrador de PHP-Nuke de un sitio web en el cual no hayan tomado las medidas de seguridad oportunas podría ser:

http://www.ajpdsoft.com/modules.php?name=Top&querylang=%20WHERE%201=2%20UNION%20ALL%20SELECT%201,pwd,1,1%20FROM%20nuke_authors/*

Como se puede observar se ha utilizado el módulo "Top" y la variable "$querylang" para realizar la inyección de SQL.

Otro ejemplo podría ser:

http://www.ajpdsoft.com/modules.php?name=Web_Links&l_op=viewlink&cid=2%20UNION%20select%20counter,%20pwd,%20aid%20FROM%20nuke_authors%20

En estos casos el atacante utiliza la cláusula "UNION ALL" disponible a partir de la versión 4 de MySQL para mostrar el resultado de dos consultas SQL, la primera será la normal de la aplicación y la segunda será la que utiliza el atacante para obtener los nombres de los usuarios administradores.

Otro ejemplo típico es el intento de intrusión en una web con identificación de usuario y contraseña, si la web tiene el siguiente código para comprobar el nombre de usuario y contreña introducidos:

cadSQL = "SELECT id FROM usuario WHERE id=$txtUsuario AND contrasenia=$txtContra"

en este caso el atacante probará a introducir el siguiente texto en el campo de usuario y contraseña:

' or '1'='1

de esta forma, si la aplicación no hace la comprobación correspondiente, se ejecutará la siguiente consulta SQL:

cadSQL = "SELECT id FROM usuario WHERE id='' OR '1' = '1' AND contrasenia=" OR '1' = '1'

y puesto que '1' = '1' siempre será verdadero el atacante tendrá acceso a la web como si de un usuario registrado se tratara.

Puesto que MySQL permite leer y escribir en ficheros del servidor donde se ejecuta, si un atacante consiguiese ejecutar la siguiente consulta:

create table prueba (campo blob);

load data infile 'C:/Archivos de programa/MySQL/MySQL Server 4.1/my.ini' into table prueba;

select campo from prueba;

Con estas tres consultas, el atacante crea una tabla con un campo especial de tipo blob, a continuación ejecuta una consulta que guarda el contenido del fichero my.ini, que contiene información relevante de configuración de MySQL, en la tabla creada anteriormente. Por último ejecuta el SELECT para visualizar el contenido guardado.

Y con la siguiente consulta, aún más dañina, podría escribir en un fichero del servidor mediante MySQL:

SELECT * INTO OUTFILE 'C:/Archivos de programa/MySQL/MySQL Server 4.1/my.ini' FROM PRUEBA;

Los hackers también acostumbran a utilizar algunos métodos para obtener información adicional del motor de base de datos o del servidor medienta la inyección de sql ciega que consiste en introducir caracteres extraños en los enlaces. Donde la aplicación espera un número el hacker introduce un texto, con esto, si la aplicación no tiene un buen control de errores, el resultado que muestra el servidor puede ser interesante para el hacker.

Por ejemplo, para una web que corre en Apache, un hacker que utiliza un enlace en el que se espera un número y al que añade al final una comilla "'":

http://www.ajpdsoft.com/fnot_d0_v1.jsp?codnoticia=735&tipo=3'

el resultado puede ser este:

y, como se puede observar, el atacante ha obtenido la versión de Apache Tomcat del servidor, un dato bastante útil para continuar con el ataque. Con esta prueba, el atacante, también ha comprobado que la web, posiblemente, no tenga un buen control de errores.

Varios consejos para evitar estos ataques por inyección de SQL:

1. Con cada enlace que se utilice para obtener información de la base de datos comprobar siempre que no se introduzcan sentencias SQL tales como "DROP", "SELECT", "DELETE", "UNION", "INSERT", "OR", "AND", "SHOW", "OUTFILE", "INFILE", "CREATE", "GRANT", "SHUTDOWN", "EXECUTE" y otros caracteres especiales que puedan provocar error: "$", "%", "/", "", "'", etc.

2. Intentar, en la medida de lo posible, que el usuario que se utilice para el acceso a la base de datos tenga los mínimos permisos posibles. Evitar también que el usuario administrador tenga nombres habituales, por ejemplo, para MySQL el usuario habitual es "root", para SQL Server el usuario es "sa", para Oracle el usuario es "system", etc.

3. Instalar siempre todos las aplicaciones necesarias (servidor web, motor de base de datos) en ubicaciones diferentes a las que la aplicación establece por defecto. El hacker siempre buscará en primer lugar en estas ubicaciones.

4. Intentar utilizar siempre vistas para no trabajar directamente con las tablas. Utilizar procedimientos almacenados para que los usuarios no tengan acceso directo sobre los datos de las tablas.

5. Utilizar siempre parámetros y no utilizar concatenaciones.

6. Comprobar siempre los tipos de datos que se espera que introduzca el usuario. Si tenemos un enlace con un tipo de datos numérico, antes de ejecutarlo comprobar que es un número. Si tenemos cadenas de caracteres comprobar siempre que no contengan palabras tales como las expuestas en el punto 1.

Nota: Revisado por AjpdSoft el 23-07-2006.
Anuncios


Enviado el Sábado, 11 marzo a las 17:39:20 por ajpdsoft
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A