03-OWASP top 2013

114
Lic. Cristian Borghello, CISSP – MVP www.segu-info.com.ar @seguinfo @CursosSeguInfo Desarrollo Seguro Orientado a OWASP Top 10

description

03-OWASP 03-OWASP 03-OWASP top 2013

Transcript of 03-OWASP top 2013

Page 1: 03-OWASP top 2013

Lic. Cristian Borghello, CISSP – MVP

www.segu-info.com.ar

@seguinfo

@CursosSeguInfo

Desarrollo Seguro Orientado a OWASP Top 10

Page 2: 03-OWASP top 2013

OWASP

Page 3: 03-OWASP top 2013

• Basado en The OWASP Risk Rating Methodology

• El objetivo principal de OWASP Top 10 es educar desarrolladores, diseñadores, arquitectos, gerentes, y organizaciones sobre las consecuencias de las vulnerabilidades de seguridad en aplicaciones web

• Provee información sobre cómo evaluar los riesgos en las aplicaciones web

• Describe la probabilidad general de ocurrencia y sus consecuencias

• Presenta una orientación sobre cómo verificar los problemas y cómo evitarlos

OWASP Top 10 (I)

http://segu.info/otophttp://segu.info/guia

Page 4: 03-OWASP top 2013

Enfoque de Riesgo de OWASP

Page 5: 03-OWASP top 2013

Enfoque de Riesgo de OWASP 2013

Page 6: 03-OWASP top 2013

Errorescomunes

Page 7: 03-OWASP top 2013

Validación incorrecta de parámetros• Conocido como el “Software’s Killer”• No se valida ni la entrada ni la salida de

variables• No se inicializan variables ni se validan sus tipos• Los atacantes pueden modificar sus entradas y

producir valores inesperados

Page 8: 03-OWASP top 2013

Todas las validaciones se deben realizar en

ambos lados:cliente y servidor

Page 9: 03-OWASP top 2013

Information Disclosure• Política de publicación de información contraria

a la seguridad por oscuridad• Publicación de información que afecta a una

aplicación o que brinda información excesiva sobre la misma y que podría ser aprovechada en forma dañina

Page 10: 03-OWASP top 2013

Information Disclosure

Page 11: 03-OWASP top 2013
Page 12: 03-OWASP top 2013

Archivos con información• Sitemap: archivos con “mapas” del sitio, contienen sus

directorios y páginas e indican cada cuánto deben ser indexados• Robots: archivos que brindan información a los buscadores para

permitir/negar la indexación• .listing: generado localmente por la herramienta WGETPueden ser utilizados por robots ilícitos para recolectar información para un ataque

Page 13: 03-OWASP top 2013

Lista incompleta de parámetros

validados

Codificación incorrecta

Nota: si bien es recomendado, en .NET validateRequest=“true” puede dar falsos positivos

Page 14: 03-OWASP top 2013

Todo lo que viene del usuario es DA-ÑI-NO

Todo lo que viene del usuario es DA-ÑI-NO

Todo lo que viene del usuario es DA-ÑI-NO

Todo lo que viene del usuario es DA-ÑI-NO

DA ÑI NO

</paranoico>

<paranoico>

Page 15: 03-OWASP top 2013

OWASPTop 10

Page 16: 03-OWASP top 2013

Inyección

Una inyección ocurre cuando datos no validados (ni confiables) son

enviados a un interprete como parte de un comando o consulta. Los datos hostiles del atacante pueden engañar

al interprete, ejecutar comandos, o acceder datos no autorizados

¡Todo lo que viene del usuario debeser considerado dañino!

Page 17: 03-OWASP top 2013

Inyecciones• Las fallas de inyección son muy comunes, sobre

todo en código legado• Es frecuente encontrarlo en consultas SQL, LDAP,

XPath, comandos de SO, parámetros, etc…• Las inyecciones son fáciles de descubrir por

WhiteBox (y también por BlackBox)

Page 18: 03-OWASP top 2013

Inyecciones

Page 19: 03-OWASP top 2013

Voto Electrónico en AR

Page 20: 03-OWASP top 2013

DemoInyecciones

Page 21: 03-OWASP top 2013

XSS (Cross Site Scripting)

• Cross Site Scripting (XSS): ejecución de scripts y comandos no deseados a través de aplicaciones web, explotando la confianza del usuario

• Se originan por la validación incorrecta de variables que permiten ejecutar scripts en campos de entrada

• El atacante inyecta código malicioso (HTML y scripts) que son ejecutados en el entorno del navegador del cliente afectado

Confused Deputy Program: realizar acciones en nombre de otros programas o personas

Page 22: 03-OWASP top 2013

• Mediante el control del navegador del usuario es posible realizar ataques de: Robo de sesión e identidad, mediante la

manipulación de las cookies Phishing, mediante la modificación de la

interface normal del sitio Redirección a sitios dañinos

• Existen tres tipo de XSS: Reflejados/No almacenados Almacenados DOM-XSS

XSS (Cross Site Scripting)

Page 23: 03-OWASP top 2013

XSS Reflejados

Reflejados (no persistente): los datos (sin sanitizar) proporcionados por el cliente generan contenido HTML que es ejecutado en el browser, y luego puede ser multiplicado a otros usuarios (víctimas)

Page 24: 03-OWASP top 2013

Cualquier dato no validado, suministrado por el usuario, es incluido en la página resultante sin codificación previa

XSS Reflejados

Page 25: 03-OWASP top 2013

Un vector potencial de ataque es enviar la URL generada por correo electrónico

XSS Reflejados

Al hacer clic, el ataque se refleja en el browser del usuario víctima, y se ejecuta con sus permisos

http://bit.ly/xssreflected

<img src="http://URL" onerror=alert(document.cookie);>

Page 26: 03-OWASP top 2013

XSS y Phishing

Page 27: 03-OWASP top 2013

DemoXSS Reflejado

Page 28: 03-OWASP top 2013

Detección de XSS• Pixy: pruebas para aplicaciones PHP• FxCop: parte de Visual Studio 2010 Premium para

detectar vulnerabilidades• AntiXSSLibrary: plugin para Visual Studio que ayuda

a detectar XSS en el código• Nikto, Wapiti y Arachni: scaners de vulnerabilidades

web• XSS-Me: extensión de FF para probar XSS reflejados• Fortify, NetSparker, Checkmarx (pagos): detectan

cualquier tipo de vulnerabilidad en muchos lenguajeshttp://bit.ly/xsspixy http://bit.ly/xssniktohttp://bit.ly/xsslibrary http://bit.ly/xssfortifyhttp://bit.ly/xssfxcop http://bit.ly/xssnersparkerhttp://bit.ly/xsswapiti http://bit.ly/xssffmehttp://bit.ly/arachni j.mp/1KhQr7x

Page 29: 03-OWASP top 2013

XSS Almacenado

• Es posible almacenar el código del XSS en la base de datos del servidor

• Una vez almacenado, cada usuario que visualice la página, será víctima del código

• Un vector potencial de ataque es dejar comentarios en forma de scripts

1. A través de un formulario, el atacante almacena el script dañino

2. Sin saberlo, la víctima ingresa a visualizar la información y el script se ejecuta en el entorno de su navegador

Page 30: 03-OWASP top 2013

XSS Almacenado

Page 31: 03-OWASP top 2013

Evitar XSS

• En PHP, usar las funciones filter_var, urlencode, HtmlEncode, htmlentities en todos las variables tipo texto de entrada/salida

• OWASP Java Encoder Project y ESAPI

• En NET Utilizar Microsoft Web Protection Library (antes conocida como AntiXSS). Incluída dentro del framework (v4.0+)

• Consultar Cheat Sheet de OWASPhttps://wpl.codeplex.com/

https://www.owasp.org/index.php/OWASP_Java_Encoder_Projecthttps://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API/es

Page 32: 03-OWASP top 2013

DemoXSS Almacenado

Page 33: 03-OWASP top 2013

• Para mantener el estado de la sesión se provee un identificador (Session_ID o Token) que es compartido entre el usuario y la aplicación web

• Los atacantes pueden ejecutar dos tipos de Session Hijacking (secuestro de sesión):

• Orientados: el atacante impersonaliza a un usuario específico y privilegiado

• Genérico: impersonaliza a un usuario genérico del cual desconoce sus accesos

Sesiones

https://www.owasp.org/index.php/Session_Management https://www.owasp.org/index.php/Authentication_Cheat_Sheet

https://www.owasp.org/index.php/Session_Management_Cheat_Sheet

Page 34: 03-OWASP top 2013

Nombre de la Sesión de las aplicaciones• PHP PHPSESSID• J2EE JSESSIONID• ColdFusion CFID y CFTOKEN• ASP ASPSESSIONID• ASP .NET ASP.NET_SessionId

Longitud de la sesiónUna Session_ID debe tener al menos 128 bits (16 bytes) para evitar que sea predecibleAlmacenamientoLa sesión no debe tener información sensible (o debe estar cifrada) y debe ser almacenada en el servidorPuede contener dirección IP, User-Agent, e-mail, nombre de usuario, rol, privilegio, preferencias del usuario, último acceso, timeouts, etc.

Sesiones

Page 35: 03-OWASP top 2013

Session PredictionLas aplicaciones vulnerables generan credenciales predecibles

Host: http://www.foo.bar

User-Agent: Mozilla/5.0

Cookie: ID=usuario1segu-info

Host: http://www.foo.bar

User-Agent: Mozilla/5.0

Cookie: ID=usuario2segu-info

Se debería generar una sesión no predecible, mediante el uso de hash y variables no repetibles (timestamp)

Host: http://www.foo.bar

User-Agent: Mozilla/5.0

Cookie: ID=2074c519d665f5cf9eb3c52abd97865223f65b70

SHA1: usuarioXsegu-info20150810120945-ClaveSecreta

https://www.owasp.org/index.php/Session_Prediction

Page 36: 03-OWASP top 2013

Session Expiration

Las aplicaciones vulnerables no hacen caducar la sesión y la misma se puede aprovechar hasta la fecha de caducidad

https://www.owasp.org/index.php/Argument_Injection_or_Modificationhttp://php.net/manual/es/ini.core.php

Host: http://www.foo.bar

User-Agent: Mozilla/5.0

Cookie: ID=2074c519d665f5cf9eb3c52abd97865223f65b70;

Expires=Wed, 08 Sep 2015 23:59:00 GMT

“Obligar” el log-out y hacer que las sesiones caduquen, respetando las regulaciones vigentes

Page 37: 03-OWASP top 2013

https://www.owasp.org/index.php/Session_Fixationhttp://www.worldofasp.net/tut/SessionHijack/Securing_Session_In_ASPNET_793.aspx

http://alexsmolen.com/blog/?p=17http://www.acros.si/papers/session_fixation.pdf

Session FixationUna aplicación vulnerable permite que un atacante“fije” una sesión y que el usuario la utilice

• Una aplicación web autentica a un usuario sin validar la sesión existente y por lo tanto la sesión esasociada al usuario real anterior

• Un atacante es capaz de forzar un identificador de sesión de un usuario conocido y tiene acceso a la sesión autenticada

• Se asigna un identificador de sesión conocido a un usuario, antes de que se autentique

Page 38: 03-OWASP top 2013

Ingeniería Socialhttp://seguro.com/

login.xxx?SessionID=1234

seguro.com

1

23

4

5

http://www.acrossecurity.com/papers/session_fixation.pdfhttp://shiflett.org/articles/session-fixation

http://projects.webappsec.org/w/page/13246960/Session%20Fixationhttp://software-security.sans.org/blog/2009/06/14/session-attacks-and-aspnet-part-1/http://software-security.sans.org/blog/2009/06/24/session-attacks-and-aspnet-part-2/

Page 39: 03-OWASP top 2013

• Si se envía (fija) al usuario una sessionid, se comprueba la existencia de la sesión y, si no existe, se crea y se asigna al usuario

• Si este se autentica, el atacante, que conoce su sessionid, puede impersonarlo

Session Fixation (otros)

http://www.foo.bar/login.php?PHPSESSID=123456 (123456 valor conocido)

http://www.foo.bar/login.jsp?JSESSIONID=123456

http://www.foo.bar/login.aspx?ASP_NETSESSIONID=123456

http://www.codeproject.com/KB/session/SessionFixation.aspx

Page 40: 03-OWASP top 2013

Evitar Session Fixation

Para evitarlo• Evitar las sesiones por querystring

(session_less)• En aplicaciones críticas, utilizar SSL/TLS• Obligar los Time-out y log-out (relogin del

usuario)• Manejar otro ID propio (Token extra a la

sesión)• Regenerar la sesión una vez que el usuario es

autenticadohttp://www.codeproject.com/KB/session/SessionFixation.aspx

Page 41: 03-OWASP top 2013

• CAPTCHA (Completely Automated Public Turingtest to Tell Computers and Humans Apart -Prueba de Turing pública y automática para diferenciar a máquinas y humanos): método que genera una prueba desafío-respuesta que sólo los humanos deberíamos ser capaces de resolver (las máquinas/bot no deberían)

• Útil para evitar el spam, ataques de DoS (bloqueo de cuentas por intentos), el registro masivo de cuentas y el abuso de los recursos ajenos por partes de personas inescrupulosas

CAPTCHA (I)

http://www.segu-info.com.ar/articulos/62-captcha.htm

Page 42: 03-OWASP top 2013

CAPTCHA (II)

http://www.google.com/recaptcha

Page 43: 03-OWASP top 2013

Captcha predecible

Page 44: 03-OWASP top 2013

Otro ejemplo

Page 45: 03-OWASP top 2013

Referencia directa a objetosSe expone una referencia hacia un objeto interno de la aplicación, archivo, directorio, registro de base de datos, códigos, URL, etc.

Page 46: 03-OWASP top 2013
Page 47: 03-OWASP top 2013
Page 48: 03-OWASP top 2013
Page 49: 03-OWASP top 2013

URL RedirectPara controlar los “abandonos” de la página web, se redirecciona a sitios externos mediante un script o página de salida (mal validada)

OK

Page 50: 03-OWASP top 2013

Bad URL Redirect (I)OK

ERROR

Page 51: 03-OWASP top 2013

Bad URL Redirect (II)

ERROR

Page 52: 03-OWASP top 2013

Control de URL (I)

ERROR

La solicitud de URLs vulnerables se puederealizar en forma manual y/o automática

Page 53: 03-OWASP top 2013

• El “secreto” radica en la administración de permisos

• Registrar y administrarlas URL del sitio

• Controlar que cadausuario tenga acceso al recurso solicitado

• Prestar especial atención en registropor pasos

Con conocer el nombre del PHP y el parámetro

es suficiente para descargar la BD completa

Page 54: 03-OWASP top 2013

Path Traversal• Vulnerabilidad que permite acceder a objetos

fuera del ámbito de la aplicación web• Dependiendo del sistema operativo, el servidor

web y la codificación empleada, se podrán escribir rutas de distintas maneras

• Se basan en permisos de archivos incorrectos y los errores de validación de entradas

../ %2e%2e%2f ..%2f &#46;&#46;&#47;

..\ %2e%2e%5c ..%5c

..\ %252e%252e%255c

?file=/etc/passwd

?file=../../../etc/passwd

https://www.owasp.org/index.php/Path_Traversal

Al utilizar codificación se pueden saltear los filtros de lasaplicaciones y los WAF (Web App Firewall)

Page 55: 03-OWASP top 2013
Page 56: 03-OWASP top 2013

Codificación de URL

Page 57: 03-OWASP top 2013

Evitar Path Traversal

• Controlar y validar las funciones de inclusión de archivos include(), include_once(), require(), require_once()

• En php.ini, utilizar open_basedir

• Limitar el acceso a archivos críticos

• Utilizar ACL y permisos en File-System

• IIS es seguro por defecto out-the-box

http://programming4.us/security/598.aspx

Page 58: 03-OWASP top 2013

DemoPath Traversal

Page 59: 03-OWASP top 2013

LFI y RFI• Vulnerabilidades que se hacen presentes cuando se

permite que el usuario incluya archivos en la aplicación

• Local File Inclusion (LFI): inclusión de archivos locales, donde se encuentre el sitio web vulnerable

• Remote File Inclusion (RFI): permite la inclusión de archivos que se encuentran en servidores externos

• Principalmente presentes en PHP por la configuración incorrecta de la variables: allow_url_fopen y allow_url_include = OFF

register_globals = OFF

Use E_STRICT (PHP >= 5.0)

http://www.php.net/manual/en/errorfunc.configuration.php

Page 60: 03-OWASP top 2013

LFI y RFI

Page 61: 03-OWASP top 2013

LFI y RFI

Page 62: 03-OWASP top 2013

LFI y RFI

Page 63: 03-OWASP top 2013

Otro ejemplo

Page 64: 03-OWASP top 2013

“Validación” al subir archivos

Page 65: 03-OWASP top 2013

Inclusión de Archivos

Page 66: 03-OWASP top 2013

DemoLFI y RFI

Page 67: 03-OWASP top 2013

Evitar RFI y LFI

• UrlScan por defecto bloquea: exe, bat, cmd, com, htw, ida, idq, htr, idc, printer, ini, pol, dat, etc.

• En PHP se puede utilizar Mod_Securityy/o Suhosin

Todas las validaciones se deben realizar en ambos lados: cliente y servidor

Page 68: 03-OWASP top 2013

CSRF

• Cross Site Request Forgery (CSRF): se fuerza al navegador web autenticado de una víctima a enviar una petición a una aplicación web vulnerable, que ejecuta la acción enviada

• Al contrario que los ataques XSS, que explotan la confianza del usuario, el CSRF explota la confianza que el sitio tiene en el usuario

• Se realiza una petición a nombre del usuario (víctima)

Page 69: 03-OWASP top 2013

Asumiendo que Alice está autenticada en su cuenta,si hace clic en el enlace, la transferencia se realizará

POST http://bank.com/transfer.do HTTP/1.1

...

Content-Length: 19;

acct=BOB&amount=100

Alice realiza una transferencia de $100 a Bob (vía POST)

Pero, esa transacción también puede realizarse vía GETGET http://bank.com/transfer.do?acct=BOB&amount=100 HTTP/1.1

http://bank.com/transfer.do?acct=CHARLES&amount=1000

Entonces, Charles construye una URL pero con una transferencia de $1000 desde la cuenta de Alice:

Charles engaña a Alice para que haga clic en un enlace dañino<a href="http://bank.com/transfer.do?acct=CHARLES&amount=1000">

Viste lo que han publicado de tí en Facebook?

</a>

<img src="http://bank.com/transfer.do?acct=CHARLES&amount=1000"

width="1" height="1" border="0">

Page 70: 03-OWASP top 2013

Prevención de CSRF

• Aceptar POST: se pueden falsificar (no confiable)

• Transacciones multi-pasos: se pueden predecir los pasos (no confiable)

• Reescritura de URL: se puede predecir la URL (no confiable)

• Comprobación del HTTP_Referer (manipulable)

• Usar una “cookie secreta”, token o variable de sesión: una vez que la variable es establecida es enviada en todas las peticiones hasta que la sesión se cierre

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29 http://shiflett.org/articles/foiling-cross-site-attacks

http://bit.ly/o2Azp4

Page 71: 03-OWASP top 2013

Prevención de CSRF• En Java utilizar librerías como ESAPI y CSRF Guard

de OWASP

• En PHP existen decenas de clases: NoCSRF PHP

• .NET incorpora Viewstate (no desactivar) y AntiForgeryToken

• En ASP 3.0 existen librerías de OWASP

• Probar el Tester de CSRF de OWASPhttps://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project

https://www.owasp.org/index.php/Esapihttp://bkcore.com/blog/code/nocsrf-php-class.html

https://www.owasp.org/index.php/PHP_CSRF_Guardhttp://j.mp/VTY0Wy

https://www.owasp.org/index.php/.Net_CSRF_Guardhttps://www.owasp.org/index.php/Classic_ASP_Security_Project

https://www.owasp.org/index.php/Category:OWASP_CSRFTester_Project

Page 72: 03-OWASP top 2013
Page 73: 03-OWASP top 2013

SQL Injection (I)• SQL Injection: ejecución de sentencias SQL

inyectadas y no deseadas a través de aplicaciones mal validadas

• Se originan por la validación incorrecta de variables que permiten ingresar sentencias SQL

• La sentencia SQL que genera la aplicación es controlada por el atacante

• El atacante puede:

Descargar BD completas

Añadir o eliminar información a la BD

Ejecutar comandos de SO

Comprometer la BD o el servidor

Imaginación…

Page 74: 03-OWASP top 2013

SQL Injection (II)

Aplicación (servidor)

Solicitud numérica (cliente)

http://www.foo.bar/ver_productos.XXX?id=

select * from productos where prod_id =

Solicitud Alfanumérica (cliente)

http://www.foo.bar/ver_productos.XXX?nombre=

select * from productos where prod_nombre = ‘

Aplicación (servidor)

X

X’

Azucar

1

Page 75: 03-OWASP top 2013

SQL Injection (III)

Aplicación (servidor)

Solicitud numérica (cliente)

http://www.foo.bar/ver_productos.XXX?id=

select * from productos where prod_id =

Solicitud alfanumérica (cliente)

http://www.foo.bar/ver_productos.XXX?nombre=

select * from productos where prod_nombre = ‘

Aplicación (servidor)

X

X’

nada’ or ‘a’=‘a

1 or 1=1

Page 76: 03-OWASP top 2013

SQL Injection (IV)

• Cualquier motor de BD pueden ser afectado• Cualquier punto de entrada de la aplicación

puede ser utilizado para inyectar sentencias• Las sentencias pueden ser inyectadas a través de

cualquier comando del Header (GET, POST, cookies, etc.)

• Se debe realizar filtrado de caracteres como:* ‘ , ; : & % “ - ( ) / < > + \

Todas las validaciones se deben realizar en ambos lados: cliente y servidor

Page 77: 03-OWASP top 2013

Ejemplo SQL Injection

select * from tabla_usuario where

nombre_usuario = md5(‘a’) or 1=1 #

Page 78: 03-OWASP top 2013

PHP / MySQL

Lenguajes y motores de BD

Page 79: 03-OWASP top 2013

.NET / SQL

.NET / Store Procedure

JAVA / SQL

Lenguajes y motores de BD

MVC / SQL

Page 80: 03-OWASP top 2013
Page 81: 03-OWASP top 2013

Ejemplo de inyección

PHP / MySQL

Page 82: 03-OWASP top 2013

Information Disclosure y SQLiLos errores no controlados permiten Information Disclosure que facilitan el SQLi

Page 83: 03-OWASP top 2013

Information Disclosure y SQLi

Page 84: 03-OWASP top 2013

Information Disclosure y SQLi

Page 85: 03-OWASP top 2013

Obtener login

1. SELECT * FROM u WHERE id=1 (ok)

2. SELECT * FROM u WHERE id=1 or 1=1 --

Devuelve todos los usuarios o el 1er registro

3. SELECT * FROM u WHERE id=a’ or ‘a’=‘a

Devuelve todos los usuarios o el 1er registro

A partir de las consultas adecuadas es posible adquirir conocimiento acerca de la estructura de la base de datos

Page 86: 03-OWASP top 2013

Enumeración de Base de Datos

1. SELECT * FROM u WHERE id=1 (ok)

2. SELECT * FROM u WHERE id=1 HAVING 1=1 --

Devuelve el nombre de la tabla y el 1er campo

3. SELECT * FROM u WHERE id=1 GROUP BY

tabla.id HAVING 1=1 --

Devuelve el nombre del 2do campo

4. SELECT * FROM u WHERE id=1 GROUP BY u.id,

u.nombre HAVING 1=1 --

Devuelve el nombre del 3er campo

5. …

La enumeración consiste en obtener el nombre de cada una de las tablas utilizadas por la aplicación así como sus campos y tipos

Page 87: 03-OWASP top 2013

Obtener tipos de datos

1. SELECT * FROM u WHERE n=‘seguinfo’ (ok)

2. SELECT * FROM u WHERE n=’ UNION SELECT

SUM(n) FROM u –-

Si el dato es Char, devuelve error de cast -

conversión de tipo

3. SELECT * FROM u WHERE n=’ UNION SELECT

MIN(n) FROM u --

Idem

4. SELECT * FROM u WHERE n=’ UNION SELECT

MAX(n) FROM u -–

Idem

Page 88: 03-OWASP top 2013

Tablas y variables de MySQLinformation_schema

character_sets

collations

collation_character_set_applicability

columns

column_privileges

key_column_usage

profiling

routines

schemata

schema_privileges

statistics

tables

table_constraints

table_privileges

triggers

user_privileges

views

SELECT * FROM u WHERE id=1

UNION SELECT table_name,

column_name, data_type FROM

information_schema.columns; --

Page 89: 03-OWASP top 2013

Tablas y variables de SQL Server

SELECT * FROM u WHERE id=1

UNION SELECT name FROM

sysobjects WHERE xtype=‘U’; --

Vistas del sistema (compatibilidad)

master.dbo.sysdatabases tabla.dbo.sysobjects

master.dbo.sysobjects tabla.dbo.syscolumns

master.dbo.syscolumns tabla.dbo.syspermissions

master.dbo.sysxlogins tabla.dbo.systypes

master.dbo.sysservers tabla.dbo.sysindexes

master.dbo.sysservers tabla.dbo.sysindexes

master.dbo.* tabla.dbo.sysfiles

http://msdn.microsoft.com/en-us/library/aa260604%28v=SQL.80%29.aspxhttps://msdn.microsoft.com/en-us/library/ms187376.aspx

Page 90: 03-OWASP top 2013

Store Procedure del sistemaStore Función

SP_makewebtask Crea un archivo con el resultado de la consulta

SP_addlogin Agrega un usuario

SP_addsrvrolemember Agrega un usuario al rol

XP_logininfo Información del login del usuario

XP_fileexist Verifica la existencia de un archivo

XP_sendmail Envía un correo con el resultado de la consulta

XP_ActiveDirectory Control del Active Directory

XP_regXXX (R/W/D) Controla el registro (XXX es la función Read/Write/Delete, etc.)

XP_servicecontrol Controla servicios del sistema

XP_cmdshell Ejecuta comandos del sistema (desactivado en SQL Server 2005+

SELECT * FROM u WHERE id=1; exec master.dbo.xp_cmdshell

‘dir c:\’--

‘type c:\inetpub\sitio\conexion.asp’

‘net user seguinfo /add’

Page 91: 03-OWASP top 2013

Ejemplo de inyección

Page 92: 03-OWASP top 2013

Inyección en Oracle

Page 93: 03-OWASP top 2013

¡Se encuentran en Google!

Page 94: 03-OWASP top 2013

Todos los registros

Page 95: 03-OWASP top 2013

Otras técnicas

SELECT * FROM u WHERE id=1 UNION SELECT * FROM u WHERE

user = char(39) + char(115) + char(101) + char(103) +

char(117) + char(39)

Uso de Char para evitar escapes “\”

Uso de HexadecimalSELECT * FROM u WHERE id=1;

DECLARE @x AS VARCHAR(400);

SELECT @x=0x73656c656374202a2066726f6d207379736f626a65637473;

EXEC (@x);--

SELECT * FROM sysobjects (en hexadecimal)

Uso de comentarios para evitar BlacklistSELECT * FROM u WHERE id=1 UN/**/ION SELE/**/CT * FROM u

Page 96: 03-OWASP top 2013

• Inyección que se realiza “a ciegas” porque la aplicación no brinda información o mensajes de error

• La aplicación también filtra el UNION y otras sentencias SQL

• El atacante puede obtener información en base a consultas por TRUE o FALSE

Blind SQL Injection

SELECT * FROM u WHERE id=1 AND 1=1-- TRUE (Tautología)

SELECT * FROM u WHERE id=1 AND 2=1-- FALSE

Page 97: 03-OWASP top 2013

Uso de tautologíasSELECT * FROM u WHERE id=1 AND if ((select user) = 'sa')

select ‘OK’ else select 1/0--

Si usuario es ‘sa’, devuelve ‘OK’ sino un error

SELECT * FROM u WHERE id=1 AND SELECT

ascii(substring((SELECT TOP 1 name FROM sysobjects WHERE

xtype = 'U'),1,1))) > 96--

SELECT * FROM u WHERE id=1 AND SELECT

ascii(substring((SELECT TOP 1 name FROM sysobjects WHERE

xtype = 'U'),1,1))) < 122--

Obtiene si existen tablas cuyo nombre comienzan entre ‘a’

(96) y ‘z’ (122). Luego se debe acotar y comenzar a

obtener el nombre de cada usuario

SELECT * FROM u WHERE id=1 AND if ((select user) = ‘dbo')

WAITFOR DELAY ‘0:0:10’--

Si usuario es ‘dbo’, espera 10 segundos

Más inormación: http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/

Page 98: 03-OWASP top 2013

Entonces, ¿Cómo se hace?

using (SqlConnection connection = new SqlConnection(connectionString))

{

DataSet userDataset = new DataSet();

SqlDataAdapter myCommand = new SqlDataAdapter("SP_Login", connection);

myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;

myCommand.SelectCommand.Parameters.Add("@user", SqlDbType.VarChar, 11);

myCommand.SelectCommand.Parameters["@user"].Value = usuario.Text;

myCommand.Fill(userDataset);

}

using (SqlConnection connection = new SqlConnection(connectionString))

{

DataSet userDataset = new DataSet();

SqlDataAdapter myDataAdapter = new SqlDataAdapter("SELECT nombre FROM

autores WHERE autor = @autor", connection);

myCommand.SelectCommand.Parameters.Add("@autor", SqlDbType.VarChar, 11);

myCommand.SelectCommand.Parameters["@autor"].Value = autor.Text;

myDataAdapter.Fill(userDataset);

}

.Net - Store Procedure parametrizado (3 capas)

.Net - Query parametrizada (2 capas)

Page 99: 03-OWASP top 2013

Entonces, ¿Cómo se hace?

//Conexión PDO a BD

$db = new PDO('mysql:host=' . $host . ';dbname=' . $db, $user, $pass);

$db->query('SET NAMES UTF8');

//Preparar consulta

$query= $db->prepare('SELECT nombre FROM autores WHERE autor = :valor');

//Parametrización

$consulta->bindValue(':valor', $autor, PDO::PARAM_STR);

//Ejecutar consulta

$consulta->execute();

$resultado = $consulta->fetchAll(PDO::FETCH_ASSOC))

PDO es una extensión de acceso a datos para PHP 5 y que permite parametrizaciónQuery parametrizada en PHP 5

http://www.php.net/manual/en/class.pdostatement.php

Query q=em.createQuery("SELECT nombre FROM autores WHERE autor = :autor");

q.setParameter("autor", autor);

List autores = q.getResultList();

Query parametrizada en JAVA

Page 100: 03-OWASP top 2013

Uso de herramientas (I)

Page 101: 03-OWASP top 2013

Uso de herramientas (II)

Page 102: 03-OWASP top 2013
Page 103: 03-OWASP top 2013
Page 104: 03-OWASP top 2013

DemoSQL Injection

Page 105: 03-OWASP top 2013

Configuración defectuosa• La configuración defectuosa de aplicaciones,

permisos, usuarios y base de datos permite al atacante obtener información (InformationDisclosure) y realizar un ataque efectivo

HTTP - Puerto 80 HTTPS (Puerto 443)

Page 106: 03-OWASP top 2013

Configuración defectuosa

Page 107: 03-OWASP top 2013

Hardening de aplicaciones

• Cambiar directorios de instalación por defecto

• Cambiar configuraciones por defecto

• Utilizar contraseñas fuertes

• NO utilizar protocolos inseguros (FTP, Telnet, POP, SMTP, etc). Utilizar SSH

• Al hacer Upload de archivos, configurar directorios y permisos adecuados

• Utilizar mensajes de errores genéricos y no brindar información del servidor/aplicación

Validar, validar, validar…

Page 108: 03-OWASP top 2013

Almacenamiento criptográfico inapropiado

El uso inseguro de métodos criptográficos representa la principal vulnerabilidad relacionada a la privacidad y al cumplimiento de normativas (Ej: conformidad con PCI DSS)

¡Han pasado más de 2000 años!

Page 109: 03-OWASP top 2013

Pequeña guía criptográfica

• Cifrar todos los datos sensibles (en tráfico, almacenamiento, y backups)

• NO utilizar algoritmos propios (seguridad por oscuridad). ¡No crear algoritmos propios!

• Cuidar la implementación de algoritmos seguros

• NO utilizar algoritmos antiguos o con probadas vulnerabilidades

• NO “Hardcodear” claves en el código fuente o almacenar las claves en forma insegura

• NO utilizar cifrado de dos vías en contraseñas (utilizar hashing)

Page 110: 03-OWASP top 2013

Hashing y HMAC• HMAC (Hash-based Message Authentication

Code): generar un valor (MAC) en base a un Hash cifrado con una clave secreta (conocida como Salt)

• Utilizado para verificar la integridad (hash) y autenticidad (cifrado) del mensaje

Mensaje MD5 SHA1

password 5f4dcc3b5aa765d61d8327deb882cf99 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

Mensaje HMAC-MD5 HMAC-SHA1 SALT

password 5F4DCC3B5AA765D61D8327DEB882CF99 7DB5EEFE8BD10447855265E8EACB6F0BFDC59CFC rnd(1)

password A85A10CDE2C1852DBBD1FB1D670AB939 34FD02E4C516DE4760BACDB86FDDBC1DBC22B524 rnd(2)

Page 111: 03-OWASP top 2013

Hashing ¿Para qué?

Page 112: 03-OWASP top 2013

Control de URL y SaltUtilizar HMAC para generar datos codificados y checksum en información sensible

En PHP >= 5.5:http://www.php.net/manual/en/function.password-hash.phphttp://www.php.net/manual/en/function.password-verify.php

Page 113: 03-OWASP top 2013

Protección insuficiente en la Capa de Transporte

• La aplicación no utiliza SSL para las páginas que requieren autenticación o transmisión de datos sensibles

• Se transmiten cookies por canales inseguros

• Se utilizan protocolos no seguros o débiles

• La aplicación utiliza un certificado SSL configurado incorrectamente, vencido o revocado. Al mostrarse la advertencia los usuarios la ignoran

• Se utilizan back-ends públicos y sin cifrado

Page 114: 03-OWASP top 2013

¡Gracias!

Lic. Cristian Borghello, CISSP – MVP

www.segu-info.com.ar

@seguinfo