Defensa contra Defensa contra ataques web comunesataques web comunes
Isabel GomezIsabel [email protected]@microsoft.com
Miguel JimenezMiguel [email protected]@ilitia.comhttp://blogs.clearscreen.com/migshttp://blogs.clearscreen.com/migs
Defensa Contra AtaquesDefensa Contra Ataques
Securizar una Aplicación: Validación Securizar una Aplicación: Validación de Datos de Entradade Datos de Entrada
Buffer OverrunBuffer Overrun
Inyección SQLInyección SQL
Cross-Site ScriptingCross-Site Scripting
Robo de SesiónRobo de Sesión
Holística de la seguridadHolística de la seguridad
Servidor Servidor WebWeb
Servidor Servidor de de
AplicacionAplicacioneses
Servidor Servidor de BDde BD
Firew
all
Firew
all
Firew
all
Firew
all
ServidorServidor
ParchesServicios
Protocolos
CuentasFicheros y Directorios
Shares
PuertosRegistro
Auditoría y Logging
RedRed
RouterFirewallSwitch
AplicaciónAplicaciónValidación de INput
AutenticaciónAutorización
Gestión de ConfiguraciónDatos Sensibles
Gestión de SesionesCriptografía
Manipulación de ParámetrosGestión de Excepciones
Auditoría y Logging
Securizar la AplicaciónSecurizar la Aplicación
Validación de Datos de EntradaValidación de Datos de Entrada
AutentificaciónAutentificación
AutorizaciónAutorización
Gestión de ConfiguraciónGestión de Configuración
Datos SensiblesDatos Sensibles
Gestión de SesionesGestión de Sesiones
CriptografíaCriptografía
Manipulación de ParámetrosManipulación de Parámetros
Gestión de ExcepcionesGestión de Excepciones
Auditoría y LoggingAuditoría y Logging
Securizar la AplicaciónSecurizar la Aplicación Validación de Datos de Entrada Validación de Datos de Entrada
Ataques posibles:Ataques posibles:Desbordamiento de bufferDesbordamiento de bufferInyección de códigoInyección de códigoInyección SQLInyección SQLCross-Site Scripting (xss)Cross-Site Scripting (xss)
Entrada de datos:Entrada de datos:Cookies, cabeceras, campos html, controles Cookies, cabeceras, campos html, controles Viewstate,QueryStringViewstate,QueryStringServicios Web/Remoting/DCOMServicios Web/Remoting/DCOMDatos de base de datos, ficheros o fuentes Datos de base de datos, ficheros o fuentes remotasremotas
Siempre dudar de su contenido!!Siempre dudar de su contenido!!Validación de datos en servidorValidación de datos en servidor
PUSH 0x00001234PUSH 0x00001234PUSH [0x0A2EF4D9]PUSH [0x0A2EF4D9]CALL 0x0A3BA78CCALL 0x0A3BA78C
Validación de la entradaValidación de la entradaBuffer overrunsBuffer overruns
void UnSafe (const char* datoSinValidar)
{
int otraVariableLocal;
strcpy (variableLocal, datoSinValidar);
}
char variableLocal[4];
Stack
char[4]
int
Return address
0x01 0x01 0x01 0x010x01 0x01 0x01 0x010x01 0x01 0x01 0x010x01 0x01 0x01 0x010x0A 0x3B 0xA4 0x290x0A 0x3B 0xA4 0x290x00 0x14 0x5B 0xB10x00 0x14 0x5B 0xB10xDA 0xC1 0x42 ... 0xDA 0xC1 0x42 ...
datoSinValidar
0x01010101
0x01010101
0x0A3BA429
Validación de la entradaValidación de la entradaBuffer overrunsBuffer overruns
Causas más comunesCausas más comunesCopia de cadenasCopia de cadenas
ArraysArrays
Reserva de memoria insuficienteReserva de memoria insuficiente
DefensasDefensasUtilizar código manejadoUtilizar código manejado
Vigilar P/Invoke, código Vigilar P/Invoke, código unsafeunsafe
Usar con cuidado Usar con cuidado strcpystrcpy, , memcpymemcpyMejor equivalentes en Mejor equivalentes en strsafe.hstrsafe.h
Opción compilador C++: /GSOpción compilador C++: /GS
Validación de la entrada Validación de la entrada Inyección SQLInyección SQL
Qué es?Qué es?
SqlConnection conn= new SqlConnection(“server=localhost;Database=Northwind” + “user id=sa;password=pass*word;");
string sqlString="SELECT * FROM Orders WHERE “ + “CustomerID='" + idCliente + "'";
SqlCommand cmd = new SqlCommand(sqlString, conn);conn.Open();SqlDataReader reader = cmd.ExecuteReader();
// ...
Validación de la entrada Validación de la entrada Inyección SQLInyección SQL
SELECT * FROM Orders WHERE CustomerID=‘VINET'
La gente buena introduce La gente buena introduce VINETVINET
SELECT * FROM Orders WHERE CustomerID=‘VINET‘OR 1=1 --’
Los malos Los malos VINET’ OR 1=1 --VINET’ OR 1=1 --
SELECT * FROM Orders WHERE CustomerID=‘VINET‘; DROP TABLE ORDERS --’
Los malísimos Los malísimos VINET’; DROP TABLE ORDERS --VINET’; DROP TABLE ORDERS --
SELECT * FROM Orders WHERE CustomerID=‘VINET‘;exec xp_cmdshell ‘format C:’
Los @*^#Los @*^# VINET’;exec xp_cmdshell ‘format C:VINET’;exec xp_cmdshell ‘format C:
Validación de la entradaValidación de la entradaInyección SQLInyección SQL
Utilizar comandos parametrizablesUtilizar comandos parametrizables
Al menos minimizarloAl menos minimizarloValidar entrada en servidorValidar entrada en servidor
Usar cuentas SQL restringidasUsar cuentas SQL restringidas
No volcar mensajes de errorNo volcar mensajes de error
string sqlString="SELECT * FROM Orders WHERE CustomerID=@custID";
SqlCommand cmd = new SqlCommand(sqlString, conn);cmd.Parameters.Add("@custID", idCliente);
Inyección SQLInyección SQL
Validación de la entradaValidación de la entradaCross-site scriptingCross-site scripting
¿Que es XSS?¿Que es XSS?Un agujero de seguridad que permite al Un agujero de seguridad que permite al hacker ejecutar código script en un cliente hacker ejecutar código script en un cliente webweb
Dos entradas principalesDos entradas principalesContempladas (foros, emails, librerías…)Contempladas (foros, emails, librerías…)
Ocultas (querystring, campos HTML…)Ocultas (querystring, campos HTML…)
Efectos habitualesEfectos habitualesModificación del contenidoModificación del contenido
Envío de informaciónEnvío de información
Robo de sesiónRobo de sesión
Validación de la entradaValidación de la entradaAnatomía de una ataque XSSAnatomía de una ataque XSS
HackerHacker VictimaVictima
Sitio WebSitio Web
1.1. Envia correo al Envia correo al usuario con link a usuario con link a un sitio inocenteun sitio inocente 2. El usuario 2. El usuario
visita el visita el sitio websitio web
3. En el contexto del 3. En el contexto del usuario, el sitio envia usuario, el sitio envia datos a traves de un datos a traves de un
post malformadopost malformado
Validación de la entradaValidación de la entradaTipos de Cross-site scriptingTipos de Cross-site scripting
Tipo 0 – Local ó DOM-basedTipo 0 – Local ó DOM-basedUn script local accede a parametros request de la Un script local accede a parametros request de la
URL y los utiliza para construir código script.URL y los utiliza para construir código script.
Tipo 1 – No Persistente ó ReflejadaTipo 1 – No Persistente ó ReflejadaSe utilizan l os datos de entrada de formularios Se utilizan l os datos de entrada de formularios
para construir scripts, permitiendo la inyección para construir scripts, permitiendo la inyección de código.de código.
Tipo 2 – Persistente ó Segundo OrdenTipo 2 – Persistente ó Segundo OrdenEs la más poderosa. Los datos se almacenan en Es la más poderosa. Los datos se almacenan en
una bbdd y posteriormente se muestran a los una bbdd y posteriormente se muestran a los usuarios, inyectando el código continuamente.usuarios, inyectando el código continuamente.
Cross-site scriptingCross-site scripting
Validación de la entradaValidación de la entradaProtección contra Cross-site scriptingProtección contra Cross-site scripting
Validar y limpiar cualquier entradaValidar y limpiar cualquier entradaVigilar <script>, <object>…Vigilar <script>, <object>…
Especialmente la que es mostrada despuésEspecialmente la que es mostrada después
Utilizar Utilizar HttpOnlyHttpOnly en IE6.1 en IE6.1
Aprovechar ASP.NETAprovechar ASP.NETHTMLEncode para limpiarHTMLEncode para limpiar
ValidateRequest para validar todas las ValidateRequest para validar todas las entradasentradas
Autenticación falseableAutenticación falseableRobos de passwordsRobos de passwords
Nunca enviar por canales insegurosNunca enviar por canales insegurosCuidado con RPC, RemotingCuidado con RPC, Remoting
Proteger su almacenamientoProteger su almacenamientoEstablecer políticasEstablecer políticas
Utilizar hash con Utilizar hash con saltsalt
PasswordPassword
SHA1CryptoServiceProvider.ComputeHash
SaltSalt
HashHash
Autenticación falseableAutenticación falseableModificación de ticketModificación de ticket
ASP.NET utiliza tickets en forma de URL o ASP.NET utiliza tickets en forma de URL o cookiecookie
Robo de cookieRobo de cookieCuidado con XSSCuidado con XSS
Usar Usar RequireSSL y !PersistentRequireSSL y !Persistent
Modificación de cookieModificación de cookieSi contiene información del usuarioSi contiene información del usuario
Utilizar MACUtilizar MAC
Cookie TamperingCookie Tampering
SumarioSumario
La gran mayoría de las aplicaciones La gran mayoría de las aplicaciones tienen agujeros de seguridadtienen agujeros de seguridad
Reglas de protecciónReglas de protecciónValidación de entradaValidación de entrada
Evitar SQL dinámicoEvitar SQL dinámico
Aplicar Encoding a toda la salidaAplicar Encoding a toda la salida
Ejecutar con los mínimos privilegiosEjecutar con los mínimos privilegios
Cifrar los secretos (connstr, pass’s, etc.)Cifrar los secretos (connstr, pass’s, etc.)
Minimizar la superficie de exposiciónMinimizar la superficie de exposición
Y si fallamos, hacerlo de modo privadoY si fallamos, hacerlo de modo privado
Próximas accionesPróximas acciones
8 Junio Evento Windows Workflow 8 Junio Evento Windows Workflow Mad.nugMad.nug
13 Junio. Seguridad Práctica para 13 Junio. Seguridad Práctica para EmpresasEmpresas
Hacking Web SitesHacking Web Sites
http://www.microsoft.com/spain/technethttp://www.microsoft.com/spain/technet
Isabel Gomez - MicrosoftIsabel Gomez - [email protected]@microsoft.com
Miguel Jiménez – Ilitia / MAD.NUGMiguel Jiménez – Ilitia / [email protected]@ilitia.com