03-OWASP top 2013

Post on 05-Jan-2016

42 views 0 download

description

03-OWASP 03-OWASP 03-OWASP top 2013

Transcript of 03-OWASP top 2013

Lic. Cristian Borghello, CISSP – MVP

www.segu-info.com.ar

@seguinfo

@CursosSeguInfo

Desarrollo Seguro Orientado a OWASP Top 10

OWASP

• 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

Enfoque de Riesgo de OWASP

Enfoque de Riesgo de OWASP 2013

Errorescomunes

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

Todas las validaciones se deben realizar en

ambos lados:cliente y servidor

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

Information Disclosure

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

Lista incompleta de parámetros

validados

Codificación incorrecta

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

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>

OWASPTop 10

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!

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)

Inyecciones

Voto Electrónico en AR

DemoInyecciones

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

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

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)

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

XSS Reflejados

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);>

XSS y Phishing

DemoXSS Reflejado

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

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

XSS Almacenado

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

DemoXSS Almacenado

• 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

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

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

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

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

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/

• 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

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

• 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

CAPTCHA (II)

http://www.google.com/recaptcha

Captcha predecible

Otro ejemplo

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.

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

Bad URL Redirect (I)OK

ERROR

Bad URL Redirect (II)

ERROR

Control de URL (I)

ERROR

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

• 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

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)

Codificación de URL

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

DemoPath Traversal

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

LFI y RFI

LFI y RFI

LFI y RFI

Otro ejemplo

“Validación” al subir archivos

Inclusión de Archivos

DemoLFI y RFI

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

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)

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">

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

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

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…

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

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

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

Ejemplo SQL Injection

select * from tabla_usuario where

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

PHP / MySQL

Lenguajes y motores de BD

.NET / SQL

.NET / Store Procedure

JAVA / SQL

Lenguajes y motores de BD

MVC / SQL

Ejemplo de inyección

PHP / MySQL

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

Information Disclosure y SQLi

Information Disclosure y SQLi

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

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

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

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; --

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

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’

Ejemplo de inyección

Inyección en Oracle

¡Se encuentran en Google!

Todos los registros

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

• 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

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/

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)

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

Uso de herramientas (I)

Uso de herramientas (II)

DemoSQL Injection

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)

Configuración defectuosa

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…

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!

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)

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)

Hashing ¿Para qué?

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

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

¡Gracias!

Lic. Cristian Borghello, CISSP – MVP

www.segu-info.com.ar

@seguinfo