Upload
santy-cadena
View
916
Download
1
Embed Size (px)
DESCRIPTION
Citation preview
Ing. Pablo Daniel Pazmiño Naranjo
CEC-EPN
Lo más importante en una operación militar es la victoria y no la persistencia. Esta última no es beneficiosa. Un ejército es como el fuego: si no lo apagas, se consumirá por sí mismo
Tsun-Tsu El arte de la guerra
OBJETIVOS
Aprender el concepto fundamental de un ataque SLQ Injection
Conocer cómo se arman ataques de este estilo y qué consecuencias se tienen.
Aprender a proteger aplicaciones web con ingreso de campos.
SQL INJECTION (INYECCIÓN DE CÓDIGO SQL)
Descripción del ataque Cómo armar ataques Qué busca un atacante Cómo proteger sistemas web
DESCRIPCIÓN DEL ATAQUE Es un método de infiltración de código intruso que se vale
de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para realizar consultas a una base de datos.
El origen de la vulnerabilidad radica en el incorrecto chequeo y/o filtrado de las variables utilizadas en un programa que contiene, o bien genera, código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o script que esté embebido dentro de otro.
Se conoce como Inyección SQL, indistintamente, al tipo de vulnerabilidad, al método de infiltración, al hecho de incrustar código SQL intruso y a la porción de código incrustado.
DESCRIPCIÓN DEL ATAQUE
Ejemplo: este código reside en una aplicación web y existe un parámetro “usuario" que contiene el nombre de usuario a consultar. Dentro del código original y vulnerable se tiene: consulta := "SELECT * FROM usuarios
WHERE nombre = '" + usuario + "';"
DESCRIPCIÓN DEL ATAQUE
En el ejemplo se tiene que si en el parámetro usuario se coloca un nombre válido (Ej.: admin) la consulta se ejecuta normalmente.
Pero supongamos que en vez de eso se ingresa algo como lo siguiente: admin'; DROP TABLE usuario; SELECT *
FROM data WHERE name LIKE '% El resultado será un Drop de la tabla
usuario!!!!
SQL INJECTION (INYECCIÓN DE CÓDIGO SQL)
Descripción del ataque Cómo armar ataques Qué busca un atacante Cómo proteger sistemas web
CÓMO ARMAR ATAQUES
La manera de armar ataques es insertando uno o varios de los siguientes caracteres especiales:
○ “ ○ ; ○ -- o - ○ , ○ %
CÓMO ARMAR ATAQUES El siguiente paso es armar una sentencia
de consulta básica, por ejemplo: ‘; select * from tab; --
Esta consulta nos mostrará un resultado en el browser que despliega todas las tablas existentes en la base de datos
Este tipo de consultas dependerá del motor de base de datos ya que a pesar de que el lenguaje base es el PL-SQL las implementaciones varían entre motores.
CÓMO ARMAR ATAQUES Otra manera común de armar ataques es
analizar el servidor buscando puertos abiertos.
Se encuentran puertos abiertos de bases de datos: 1433/tcp Microsoft-SQL-Server 3306/tcp MySQL sistema de gestión de bases
de datos 5432/tcp PostgreSQL sistema de gestión de
bases de datos 8000/tcp SQLite
CÓMO ARMAR ATAQUES Otra manera común de armar ataques es
analizar el servidor buscando puertos abiertos.
Se encuentran puertos abiertos de bases de datos: 1433/tcp Microsoft-SQL-Server 3306/tcp MySQL sistema de gestión de bases
de datos 5432/tcp PostgreSQL sistema de gestión de
bases de datos 8000/tcp SQLite
SQL INJECTION (INYECCIÓN DE CÓDIGO SQL)
Descripción del ataque Cómo armar ataques Qué busca un atacante Cómo proteger sistemas web
QUÉ BUSCA UN ATACANTE
Los objetivos de un atacante varían según las expectativas: Enumeración de usuarios.- Se pretende
comprometer información de usuarios, claves y datos de contacto para su comercialización (SPAM)
Espionaje industrial.- Se intenciona un ataque para obtener información sensitiva respecto a clientes, procesos o documentos internos anexados a un aplicativo web (intranet)
QUÉ BUSCA UN ATACANTE Los objetivos de un atacante varían según
las expectativas: Destrucción de información.- mediante una
alteración de las tablas de sistema se daña la consistencia de las bases de datos haciendo que el aplicativo no funcione. Esto puede ser intencionado o accidental.
Desprestigio.- un ataque de este estilo puede perseguir un objetivo de daño de imagen de la víctima, en cuyo caso resultará en una pérdida de cuota de mercado significativa y mejor posición de su competencia.
SQL INJECTION (INYECCIÓN DE CÓDIGO SQL)
Descripción del ataque Cómo armar ataques Qué busca un atacante Cómo proteger sistemas web
CÓMO PROTEGER SISTEMAS WEB
Mejor codificación Los sistemas web deberán ser codificados de
mejor manera de modo que se tienda a la seguridad de los aplicativos como parte del ciclo de desarrollo. Ej.: ○ PHP .- se puede utilizar la función
mysql_real_escape_string: $query_result = mysql_query("SELECT * FROM
usuarios WHERE nombre = \"" . mysql_real_escape_string($nombre_usuario) . "\"");
Esto ayudará a evitar un ataque de inyección de código ya que al ingresar caracteres especiales o consultas generará un error que para la ejecución de la aplicación.
CÓMO PROTEGER SISTEMAS WEB
Mejor codificación ○ Java .- se puede usar la clase PreparedStatement
En lugar de: Connection con = (acquire Connection) Statement stmt =
con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';");
se puede usar parametrización o escape de variables, como se indica en los siguiente apartados.
○ Parametrización de sentencias SQL Connection con = (acquire Connection); PreparedStatement pstmt = con.prepareStatement("SELECT *
FROM usuarios WHERE nombre = ?"); pstmt.setString(1, nombreUsuario); ResultSet rset = pstmt.executeQuery();
CÓMO PROTEGER SISTEMAS WEB
Mejor codificación ○ Escape de las variables a insertar en la
sentencia SQL Escapar el texto contenido en la variable
reemplazando los caracteres especiales en SQL por su equivalente textual, de tal forma que SQL interprete todo el contenido de la variable como si fuera texto.
Connection con = (acquire Connection) Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario.replace("\\", "\\\\").replace("'", "\\'") + "';");
CÓMO PROTEGER SISTEMAS WEB
Mejor codificación ○ También se puede utilizar el método
escapeSQL de la clase StringEscapeUtils procedente de la librería de Apache Commons Lang Connection con = (acquire Connection); Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT *
FROM usuarios WHERE nombre = '" + StringEscapeUtils.escapeSQL(nombreUsuario) + "';");
CÓMO PROTEGER SISTEMAS WEB
Validación de campos: Es necesario que se validen los campos de
ingreso mediante el uso de expresiones regulares con JavaScript, por ejemplo, de modo que donde se ingresen números y letras no se permitan caracteres especiales.
La validación evita más de un 80% de los ataques.
La validación de campos junto con una buena codificación evitan más del 85% de los ataques de SQL injection
CÓMO PROTEGER SISTEMAS WEB
Separación de las capas de aplicación de la de base de datos Un error común es que en el mismo servidor
donde se ejecuta la aplicación (web) se instale y ejecute la base de datos del mismo aplicativo. Esto puede ser detectado e identificado mediante un escáner (nmap) y según eso ya se pueden armar ataques con un aplicativo de conexión (por ejemplo un programa pequeño php)
CÓMO PROTEGER SISTEMAS WEB
Implementar un analizador de contenidos La implementación de un analizador de
contenidos bloqueará cualquier intento de inyección de código en el aplicativo, asegurando la ejecución correcta del mismo.
CÓMO PROTEGER SISTEMAS WEB
Usar ‘stored procedures’ en las bases de datos Cuando la base de datos soporte
procedimientos almacenados hay que usarlos ya que eso evitará el ingreso de inyección de código porque los procedimientos pueden encapsular acciones (query, update, delete, etc.) en un solo procedimiento.
Si se inyectase código, este genera un error a nivel de base de datos y para la ejecución de la sentencia.
CÓMO PROTEGER SISTEMAS WEB
Limitar los permisos de la base de datos y segregar usuarios Los permisos de la base de datos y del
usuario que se conecta NO DEBEN tener permisos de DBA (administrador) ya que con eso se evitan problemas asociados a la alteración de las tablas y estructura de la base de datos.
CÓMO PROTEGER SISTEMAS WEB
Configurar el reporte de errores Esta acción permitirá al administrador de la
base de datos conocer en detalle errores asociados a intentos de alterar la base de datos y por tanto ayudará a tomar correcciones y acciones preventivas para futuros ataques.