Introducción a ataques de tipo inyección: Inyección SQL Jorge Peris Cortés Asignatura: Redes Ingeniería Informática ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Inyección SQL Introducción Prueba en vivo ¿Por qué Inyección SQL? Definición. Objetivos. Concepto clave. Evaluación de riesgos. Ejemplos sencillos. Prueba en vivo Breve descripción de herramientas utilizadas. Demostración. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
¿Por qué Inyección SQL? - OWASP: Open Web Application Security Project - Comunidad abierta que busca mejorar la seguridad en las aplicaciones de software. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
¿Qué es la Inyección SQL? Definición: técnica de infiltración de código que permite realizar consultas a una base de datos. Se produce cuando un atacante es capaz de insertar una o varias sentencias SQL dentro de una‘consulta’manipulando los datos de entrada de una aplicación. En resumen: introducir código SQL desde el cliente a través de datos de entrada. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Objetivos Maximizar la cantidad de información a extraer. Minimizar posibles rastros. Posibles rastros (a este nivel, esto es secundario): Dejar usuarios que hayamos utilizado para pasos intermedios. Dejar rastro de comandos de llamada al sistema. - Suelen quedar registrados en un log o un historial de últimos comandos usados. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Conceptos clave (1/3) Funcionamiento de operaciones lógicas AND y OR: Azul: código inyectado. Verde: resultado que obtendremos. AND 1 OR 1 Explicación: Para las consultas con varios AND, habría que poner código de inyección en cada campo. Solución, inyectar en uno y comentar. Para consultas únicas o con OR, sólo será necesario inyectar en 1 campo, ya que ‘cualquier_cosa’ OR 1 siempre es verdadero. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Conceptos clave (2/3) Ejemplo, consultar producto: SELECT * FROM tabla WHERE id=´$id´ Posible inyección: Sustitución: $id <- ´OR ´1´=´1 SELECT * FROM tabla WHERE id=´´OR ´1´=´1´ Tratamos de obtener una consulta que siempre devuelva TRUE. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Conceptos clave (3/3) SELECT * FROM tabla WHERE Posible inyección: Ejemplo, consultar usuario y password: SELECT * FROM tabla WHERE Usr = $usr AND pass = $pass Posible inyección: Sustitución: $usr <- ´OR 1=1-- * usr = ´OR 1=1-- AND pass = $pass La consulta después del doble guión, queda comentada. *Mucho cuidado con las comillas: En blanco las que corresponden con las que se colocan por defecto. En rojo lo que escribe el atacante mediante formulario de entrada. En los comentarios es “-- ”, es decir: guión, guión, espacio_blanco (en MySQL, en ORACLE funciona igualmente) ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Evaluación de riesgos (1/4) Un ataque con éxito podría permitir: Ejecutar acciones sobre una BD simulando ser root. Consecuencias inmediatas: UPDATE/INSERT/SELECT/DELETE... serán bien recibidos. Ejecutar comandos de llamada al SO. En este caso, el nivel de acciones dependerá de los privilegios vigentes de la máquina atacada. Comandos del SO: - Si inyectamos código de tipo comandos de la consola en una aplicación vulnerable a inyección, pero dicha consola se ejecuta en modo no privilegiado, todas aquellas acciones privilegiadas que pretendamos ejecutar, no se llevarán a cabo. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Evaluación de riesgos (2/4) Explotabilidad -> FÁCIL Basta con enviar texto plano que explote la sintaxis del intérprete objetivo. Predominio -> CONOCIDO Encontramos fácilmente cadenas típicas de ataque para inyección SQL. Muy documentado, incluyendo webs específicas que son vulnerables y que contienen tutoriales sobre cómo llevar a cabo algunos ataques. EXPLOTABILIDAD – PREDOMINIO – DETECCIÓN – IMPACTO ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Evaluación de riesgos (3/4) Detección -> MEDIO Necesario acceder al código contenedor de la lógica para encontrar vulnerabilidades. Desde el lado del cliente, haciendo pruebas, es más complicado. No siempre es sencillo filtrar todas las entradas posibles. Impacto -> ALTO Un simple ataque puede causar pérdida o corrupción (total o parcial) de los datos. Podría verse afectado el sistema que haya por debajo de la BD (apagado de la máquina, denegación de acceso, eludir autentificaciones...). EXPLOTABILIDAD – PREDOMINIO – DETECCIÓN – IMPACTO ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Evaluación de riesgos (4/4) Conclusiones: Con pocos recursos se podría llegar a causar graves daños. Documentación muy detallada y disponible a cualquier usuario. Arma de doble filo: Fácil prevención de ataques. Atacantes con documentación para rebuscar nuevos ataques. Sencilla realización de ataques. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Ejemplos sencillos Haremos dos pruebas sencillas de inyección de código SQL: Sobre una aplicación web programada en PHP y MySQL, llamada “Damn Vulnerable Web Application”(DVWA). Sobre una pequeña (y absurda) aplicación web que hemos creado para la ocasión, también en PHP y MySQL. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Ejemplo 1: DVWA ¿Qué es DVWA? ¿Qué partes usaremos de esta aplicación web? Ataques a los 3 niveles de seguridad implementados: LOW. MEDIUM. HIGH. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
DVWA (1/6) ¿Qué es DVWA? Es una aplicación web basada en PHP y se apoya en una base de datos mediante MySQL. Acceso: http://localhost/dvwa/login.php Usr: admin Pass: password ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
DVWA (2/6) ¿Qué partes usaremos de esta aplicación web? Nos centraremos únicamente en “SQL Injection”. Configuraciones útiles: La BD atacada. Nivel de seguridad del código empleado. Hacer visible el código PHP que se está ejecutando. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
DVWA (3/6) Ataque al nivel LOW: La página recibe una entrada por formulario, User ID, cuya consulta es: SELECT first_name, last_name FROM users WHERE user_id = ’$id’ No se filtra la entrada -> fallo grave. Entrada de datos por formulario: … user_id = ’' OR '1'='1’ Demo... Web vulnerable -> http://localhost/dvwa/login.php BD MySQL con administrador para ejecutar consultas -> http://localhost/phpmyadmin/ Consulta LOW: SELECT first_name, last_name FROM users WHERE user_id = '' or '1'='1‘ Mostrar lo que hace una consulta por defecto (datos existentes y datos no existentes) ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
DVWA (4/6) Ataque al nivel MEDIUM: Misma entrada y consulta: SELECT first_name, last_name FROM users WHERE user_id = $id Entrada filtrada con: mysql_real_escape_string($id); En ocasiones no es suficiente. Entrada de datos por formulario : user_id = 1 OR 1=1 Demo... http://localhost/dvwa/login.php Consulta MEDIUM: SELECT first_name, last_name FROM users WHERE user_id = 1 or 1=1 ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
DVWA (5/6) Ataque al nivel HIGH: Misma entrada y consulta: SELECT first_name, last_name FROM users WHERE user_id = ’$id’ Entrada filtrada con: stripslashes($id) mysql_real_escape_string($id) Comprobar si $id es un número. No es posible atacar. http://localhost/dvwa/login.php Consulta HIGH: no se puede probar, porque phpMyAdmin no implementa los 3 niveles de seguridad de la app. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
DVWA (6/6) Conclusiones: No siempre basta con filtrar. Una buena defensa: Filtrar entradas. Limitar número de caracteres. Conocer el problema. Mostrar lo imprescindible. Atacar una BD requiere: Paciencia. Probar diferentes alternativas. Conocer lenguaje de manipulación de la BD. Conocer el problema: Diferentes tratamientos para números en entrada que string. Al recoger los resultados de la consulta, hay que tener presente qué resultados se esperan. En este caso, 1 usuario se corresponde con 1 pass, sólo 1 fila devuelta. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Ejemplo 2: Mini-aplicación Módulos que forman el sistema. Breve explicación del funcionamiento. Ataque típico y demostración. ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Mini-aplicación (1/2) index.html form_login.html form_registro.html link link form_login.html form_registro.html HTML petición respuesta petición respuesta consulta login.php registro.php PHP Base Datos MySQL ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
Mini-aplicación (2/2) Ataque desde ´form_login.html´ Dos ataques posibles: Usuario y password: ´OR ´1´=´1 Usuario: ´OR 1=1-- Obtenemos todos los usuarios de la BD. Demo... http://localhost/p_sqli/form_login.html Caso 1) SELECT * FROM PruebaUsuarios WHERE `nombre`= '' or '1'='1' AND `pass`= '' or '1'='1‘ Caso 2) SELECT * FROM PruebaUsuarios WHERE nombre=' or 1=1-- AND pass='$pass_form’ ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS
¿PREGUNTAS? FIN ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS http://localhost/p_sqli/form_login.html Caso 1) SELECT * FROM PruebaUsuarios WHERE `nombre`= '' or '1'='1' AND `pass`= '' or '1'='1‘ Caso 2) SELECT * FROM PruebaUsuarios WHERE nombre=' or 1=1-- AND pass='$pass_form’ ASIGNATURA DE REDES: INYECCIÓN SQL JORGE PERIS CORTÉS