UNIVERSIDAD TECNICA DE MANABI Facultad de Ciencias Informáticas Ingeniería en sistemas SEGURIDAD INFORMATICA Tema: Mysql Injection Autora: Doris María Mera Mero Curso: 7mo A Fecha: Martes 30 de Julio del 2012 Catedrático: Ing. Elvis Cárdenas
MYSQL INJECTION SQL Injection o Inyeccion SQL es una técnica mediante la cual un atacante intenta introducir fragmentos de código SQL con el fin de alterar las consultas de Bases de Datos. Ocurre sobre todo cuando el programador semi-valida las inserciones o consultas realizadas contra una base de datos. Generalmente dichas vulnerabilidades se dan del lado de lenguajes de programación o script. Tipos de Intrusión: Dependiendo de su naturaleza por lo general pueden ser: Malicioso.- Intentan modificar la información de una base de datos. Dañino.- El objetivo puede ser eliminar uno o más registros o de plano eliminar la tabla o tablas desde una consulta que es vulnerable a SQL Injection. Espía.- Se pretende obtener información valiosa mediante consultas alteradas. Si un programador no toma medidas de seguridad y realiza auditorías de seguridad básicas en su código, es muy probable que su sistema reciba un intento de Intrusión exitoso. Es muy importante conocer el comportamiento de los intrusos, como realizan las pruebas en un sitio web objetivo. Para hacer frente a un atacante debes pensar como él para cerrarle los caminos. Supongamos que el huesped (atacante) llega en busca de vulnerabilidades de un sistema para causar SQL Injection. Presta su atención a un formulario de acceso de tu sistema web. El intruso va a probar distintas cosas para ver si hace algunas travesuras: Obtención de acceso a un sistema protegido Supongamos que los datos leídos del formulario son leídos en este código PHP. $usuario = $_POST["usr_nombre"]; $clave = $_POST["usr_clave"]; $consql = "SELECT * FROM usuarios WHERE usrnombre= '$usuario' AND clave = '$usr_clave' "; Ahora imaginemos que el atacante prueba suerte e introduce: OR = en ambas cajas de texto, osea tanto en Login como en Clave. Al enviar a procesar el formulario la instrucción enviada la vería asi PHP: $consql = "SELECT * FROM usuarios WHERE usrnombre = '' OR '' ='' AND clave='' OR ''='' ";
Esta consulta resulta ser siempre VERDADERA. La consulta regresa un estatus de verdadero de tal suerte que indica al sistema que el atacante es un usuario legítimo y entra al sistema El atacante hace una consulta dañina Supongamos ahora que el atacante gusta de hacer daños importantes a los sitios donde descubre vulnerables. Llega al mismo formulario de acceso e intenta la siguiente instrucción en el campo de usuario: OR = y en el campo de clave: doris ; DELETE usuarios La consulta PHP para enviar a MySQL sería: $consql = "SELECT * FROM usuarios WHERE usrnombre='' OR ''='' AND clave='doris'; DELETE usuarios "; Se puede observar que se ejecuta primero la consulta de seleccionar que independientemente podría ser falsa o verdadera, e inmediatamente se ejecuta la siguiente instrucción que es borrar la tabla de usuario y todos sus datos. Cómo Evitar SQL Injection Para evitar este tipo de ataques y otras combinaciones debemos asegurarnos de poner atención a dos caracteres usados en las sentencias de SQL y que son: y ; es decir, la comilla simple y el punto y coma. El objetivo será neutralizar a dichos caracteres agregando a los parámetros una barra diagonal inversa (backslash). Estos se llaman caracteres con escape \. PHP cuenta con una función para este propósito: mysql_real_escape_string() y su uso se ve en la siguiente instrucción: $variable = mysql_real_escape_string($_post["usr_bombre"]); Es decir, por cada lectura de datos $_POST (o $_GET) limpiamos la entrada con la función mysql_real_escape_string() antes de asignar la información a las variables. Hagamos un prueba de su uso real. Volvamos al primer caso donde en ambas entradas del formulario se introduce: OR = La consulta SQL quedaría así: SELECT * FROM usuarios WHERE usrnombre= '\' OR \'\' = \'' AND clave = '\' OR \'\' = \'' Como puede observarse, la función ha filtrado ambas variables y agregó un escape \ a cada comilla simple indicándole al preprocesador de PHP que cada carácter con escape es parte del texto y no parte de la instrucción de la consulta manipulada.
Observaciones sobre mysql_real_escape_string: Si magic_quotes_gpc está habilitado, primero se debe aplicar stripslashes() a los datos. Si se usa esta función en datos que ya han sido escapados, se escaparán dos veces. hay que proceder con cuidado. Si esta función no se utiliza para escapar los datos, la consulta es vulnerable a SQL Injection, es decir es más completo que magic_quotes_gpc. Se requiere una conexión a MySQL para hacer uso de mysql_real_escape_string(), si no, se generará un error de nivel E_WARNING, y se devolverá FALSE. Si la consulta la va a procesar MySQL es obvio que tienes una conexión MySQL.
Bibliografía http://www.programaonline.com/como-evitar-ataques-sql-injection/