Como desarrolladores web, una de las principales preocupaciones es cuán vulnerables son nuestros sitios o aplicaciones web. Esta charla explica algunos riesgos de seguridad y, más importante, cómo evitarlos. Basado en los riesgos de seguridad más críticos en el desarrollo web según OWASP Top Ten 2010, y con algunos ejemplos en PHP (aunque es fácilmente aplicable en otros entornos).
4. Tres principios, tres
1 Defensa en profundidad
2 Menos privilegios
3 Lo menos complicado
5. Dos prácticas generales
Filtrar entradas
Asegurarse que los datos de entrada son válidos
Escapar salidas
Asegurar que los datos salientes no se malinterpreten
8. OWASP
● Proyecto Abierto de Seguridad en
Aplicaciones Web
● Comunidad abierta dedicada a habilitar a
las organizaciones para desarrollar,
comprar y mantener aplicaciones
confiables.
9. OWASP Top 10 2010
● Diez Riesgos Más Críticos sobre
Seguridad en Aplicaciones
11. 1
Inyección - Ejemplo
● Efectuar una consulta a partir de un dato
enviado como parámetro
● http://caralibro.com/usuario.php?id=8262
● $sql = 'SELECT * FROM USERS where id = '.
$_GET['id'];
● ¿Qué pasa si ingreso sentencias SQL?
12. 1
Inyección - Riesgos
Explotación
FÁCIL
Prevalencia
COMÚN
Detección
MEDIA
Impacto
SEVERO
13. 1
Inyección - Nota
● Inyección no es sólo SQL
● LDAP
● Envío de e-mail
● Comandos de SO
● ...
14. 1
Inyección - Defensa
● Usar una API segura que evite el uso del
intérprete o provea una interface
parametrizada
● $stmt = $dbh->prepare("SELECT * FROM
USERS where id = ?");
● if ($stmt->execute(array($_GET['id']))) {
15. 1
Inyección - Defensa
● Si no hay una API segura validar entradas
● if (is_int($_GET['id'])) {
● if
(filter_var($_GET['id'],FILTER_VALIDATE_IN
T))
17. Secuencia de Comandos en Sitios
2
Cruzados (XSS) - Ejemplo
● El contenido de una página se carga
imprimiendo un dato ingresado
previamente
● http://caralibro.com/buscar.php?
cadena=Equipos
● echo $cadena;
● ¿Qué pasa si ingreso etiquetas HTML en
la variable cadena?
18. Secuencia de Comandos en Sitios
2
Cruzados (XSS) - Ejemplo
● ¿Y si comparto el enlace modificado?
● ¿Y si vuelvo persistente el dato en la base
de datos?
20. Secuencia de Comandos en Sitios
2
Cruzados (XSS) - Riesgos
Explotación
MEDIA
Prevalencia
MUY DIFUNDIDA
Detección
FÁCIL
Impacto
MODERADO
21. Secuencia de Comandos en Sitios
2
Cruzados (XSS) - Defensa
● Escapar todos los datos no confiables
● htmlentities($_GET['cadena']);
● filter_var($_GET['cadena'],
FILTER_SANITIZE_FULL_SPECIAL_CHAR
S);
22. Secuencia de Comandos en Sitios
2
Cruzados (XSS) - Defensa
● Validación de entradas positivas (permitir
ciertas etiquetas)
● Funciones más complicadas
24. Pérdida de Autenticación y Gestión
3
de Sesiones - Ejemplo
● Un usuario mantiene su sesión activa
siguiendo enlaces que incluyen su
identificador de sesión
● http://caralibro.com/preferencias.php?
sessionid=52e83279678a
● ¿Si copio el enlace en otra PC, ingreso a
la misma página?
25. Pérdida de Autenticación y Gestión
3
de Sesiones - Ejemplo
● Un usuario inicia sesión desde una cabina
de Internet y luego cierra el navegador sin
cerrar sesión
● ¿Qué sucede si luego otro usuario entra a
la misma web?
26. Pérdida de Autenticación y Gestión
3
de Sesiones - Ejemplo
● Un atacante accede a la base de datos de
contraseñas SIN CIFRAR
27. Pérdida de Autenticación y Gestión
3
de Sesiones - Riesgos
Explotación
MEDIA
Prevalencia
COMÚN
Detección
MEDIA
Impacto
SEVERO
28. Pérdida de Autenticación y Gestión
3
de Sesiones - Defensa
● Un fuerte control de gestión de sesiones
● Tiempos límites de vigencia
● ¡¡¡Cifrar las claves de tus usuarios!!!
● session_regenerate_id(TRUE)
30. Referencia Directa Insegura 4
a Objetos - Ejemplo
● El usuario accede a información personal
con una dirección que incluye su
identificador
● http://caralibro.com/cuenta.php?id=87392
● ¿Qué pasa si cambio el valor de id?
31. Referencia Directa Insegura 4
a Objetos - Riesgo
Explotación
FÁCIL
Prevalencia
COMÚN
Detección
FÁCIL
Impacto
MODERADO
32. Referencia Directa Insegura 4
a Objetos - Defensa
● Comprobar que el usuario tiene los
privilegios para acceder al recurso
● if ($_GET['id']==$_SESSION['id'])
34. Falsificación de Peticiones en Sitios
5
Cruzados (CSRF) - Ejemplo
● Una aplicación de correo electrónico
permite configurar una cuenta adicional
para reenviar los mensajes
● http://caralibro.com/reenviar.php?
mail=root@local.com
● Qué pasa si creo una página con una
etiqueta HTML que hace una llamada a la
URL con otra dirección e-mail
35. Falsificación de Peticiones en Sitios
5
Cruzados (CSRF) - Riesgos
Explotación
MEDIA
Prevalencia
MUY COMÚN
Detección
FÁCIL
Impacto
MODERADO
36. Falsificación de Peticiones en Sitios
5
Cruzados (CSRF) - Defensa
● Incluir token (testigo) en la petición, de
preferencia de manera oculta:
● <input type="hidden" name="token"
value="856c2f50ddc49fd710f14a406ec1fef6
52d3c9f">
38. Defectuosa Configuración de 6
Seguridad (NUEVO) - Ejemplo
● Se descubre una vulnerabilidad
importante en el framework empleado en
la aplicación
● Una actualización corrige el problema
● ¿Qué pasa si nadie actualiza la versión
en la aplicación?
40. Defectuosa Configuración de 6
Seguridad (NUEVO) - Ejemplo
● Una herramienta administrativa es
instalada en el servidor web y se deja
accesible sin clave
● http://caralibro.com/phpmyadmin
● ¿Qué sucede si comienzan a adivinar
URLs?
41. Defectuosa Configuración de 6
Seguridad (NUEVO) - Ejemplo
● Se suben por error carpetas .SVN en el
servidor de producción
● ¿Qué sucede si la configuración del
servidor web permite ver archivos
ocultos?
42. Defectuosa Configuración de 6
Seguridad (NUEVO) - Ejemplo
● La aplicación muestra el detalle completo
de los errores
● ¿Y si el detalle completo muestra
información relevante del funcionamiento
de la aplicación?
ERROR [credit-card-db] (MySqlSystem.java:1331) - Invalid column name
java.sql.SQLException: Invalid column name ‘social_security_numbre’: select
username, password, ssn from users where id = ?
sun.jdbc.rowset.CachedRowSet.getColIdxByName(CachedRowSet.java:1383)
at com.mysql.Driver.MySQLDriver.a(MySQLDriver.java:2531)
at sun.jdbc.rowset.CachedRowSet.getString(CachedRowSet.java:2167)
at com.ppe.db.MySqlSystem.getReciPaying(MySqlSystem.java:1318)
at control.action.FindUserAction.perform(FindKeyUserAction.java:81)
at org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1586)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:492)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
44. Defectuosa Configuración de 6
Seguridad (NUEVO) - Riesgos
Explotación
FÁCIL
Prevalencia
COMÚN
Detección
FÁCIL
Impacto
MODERADO
45. Defectuosa Configuración de 6
Seguridad (NUEVO) - Defensa
● Definir procesos para actualizar versiones
de herramientas empleadas
● Verificar que herramientas administrativas
no se encuentren accesibles
● Proteger la configuración de los
componentes que usa la aplicación
● Deshabilitar mensajes de errores,
advertencias o información
47. Almacenamiento Criptográfico 7
Inseguro - Ejemplo
● Una aplicación almacena archivos
cifrados pero la clave de cifrado es
accesible.
48. Almacenamiento Criptográfico 7
Inseguro - Ejemplo
● La base de datos de claves usa algún
algoritmo hash pero sin “sal” (un dato
adicional que se suma al valor original)
● md5($_POST['clave']);
● Un ataque de fuerza bruta demora menos
en encontrar la clave si ésta no está
sumada a una “sal”
49. Almacenamiento Criptográfico 7
Inseguro - Riesgos
Explotación
DIFÍCIL
Prevalencia
POCO COMÚN
Detección
DIFÍCIL
Impacto
SEVERO
50. Almacenamiento Criptográfico 7
Inseguro - Defensa
● Asegúrese de que los datos cifrados y la
clave que los descrifra se encuentran en
lugares distintos
51. Almacenamiento Criptográfico 7
Inseguro - Defensa
● Utilice una “sal” al usar un algoritmo hash
● md5($sal.$_POST['clave']);
55. Falla de Restricción de Acceso a 8
URL - Ejemplo
● Generalmente una aplicación web tiene
una sección administrativa
● http://caralibro.com/admin
● ¿La sección administrativa requiere
clave?
56. Falla de Restricción de Acceso a 8
URL - Riesgos
Explotación
FÁCIL
Prevalencia
POCO COMÚN
Detección
MEDIA
Impacto
MODERADO
57. Falla de Restricción de Acceso a 8
URL - Defensa
● Verificar por cada página que se requiera
que el usuario tenga los privilegios
suficientes para acceder a ella.
● if (is_capable($_SESSION['userid'],$page))
59. Protección Insuficiente en la Capa
9
de Transporte - Ejemplo
● Una aplicación no utiliza certificados de
seguridad en la transmisión de datos
sensibles
● ¿Qué sucede si un atacante lee las
transmisiones del usuario?
60. Protección Insuficiente en la Capa
9
de Transporte - Ejemplo
● Una aplicación utiliza certificados de
seguridad pero han sido mal configurados
y muestran errores frecuentemente a los
usuarios
● ¿Qué sucede si un atacante crea una
página falsa y que muestra errores
similares?
61. Protección Insuficiente en la Capa
9
de Transporte - Riesgos
Explotación
DIFÍCIL
Prevalencia
COMÚN
Detección
FÁCIL
Impacto
MODERADO
62. Protección Insuficiente en la Capa
9
de Transporte - Defensa
● Usar SSL para todas las páginas que
utilizan datos sensibles
63. Protección Insuficiente en la Capa
9
de Transporte - Defensa
● Verificar que el certificado sea válido, no
se haya vencido y esté configurado para
todos los dominios usados por la
aplicación.
65. Redirecciones y reenvíos no 10
validados (NUEVO) - Ejemplo
● Una aplicación tiene páginas del tipo
redirect, con un parámetro URL
● http://caralibro.com/ir.php?url=curso.php
● ¿Qué sucede si coloco una dirección
externa en url?
66. Redirecciones y reenvíos no 10
validados (NUEVO) - Ejemplo
● Una petición envía, además de los datos
normales, la url que mostrará al
confirmarse la transacción
● http://caralibro.com/transaccion.php?
dato1=cualquiera&exito=inicio.php
● ¿Qué sucede si cambio el valor de exito?
67. Redirecciones y reenvíos no 10
validados (NUEVO) - Riesgos
Explotación
MEDIA
Prevalencia
POCO COMÚN
Detección
FÁCIL
Impacto
MODERADO
68. Redirecciones y reenvíos no 10
validados (NUEVO) - Defensa
● Evitar usar redirecciones.
● Si se utiliza, evitar que el usuario pueda
manipular el destino.
● También se debe asegurar que el destino
será válido y autorizado.
69. Y esto es sólo el comienzo
(para ustedes :D) Clickjacking
●
● Plugins (Flash,
Acrobat, Java)
● XSS con CSS
● JSON con datos
sensibles
● Remote Code
Injection
● XSS + Ajax + CSRF
https://secure.flickr.com/photos/anonymous9000/3644243073/
70. Referencias bibliográficas
● OWASP Top Ten Project [Spanish Translation]
https://www.owasp.org/index.php/Top_10
● 2010: A Web Hacking Odyssey - Top Ten Hacks of the Year
http://www.slideshare.net/jeremiahgrossman/2010-a-web-hacking-odyssey-
top-ten-hacks-of-the-year
● RIA And AJAX Security Workshop, Part 1
http://www.slideshare.net/astamos/ria-and-ajax-security-workshop-part-1-
presentation
● Evolution Of Web Security http://www.slideshare.net/shiflett/evolution-of-web-
security
● Rails Security Best Practices http://www.slideshare.net/ihower/rails-security-
3299368
● Web Application Security Tutorial
http://www.slideshare.net/xplodersuv/EducauseAnnualWebAppSecTutorialV3
● Web Security Horror Stories http://www.slideshare.net/simon/web-security-
horror-stories-presentation
● PHP Security Consortium http://phpsec.org/
● PHP Filtros de saneamiento http://php.net/manual/es/filter.filters.sanitize.php
72. Futuras publicaciones de Firefox
Firefox (Estable), Aurora y Mobile
firefox.com/channel
Firefox Portable (ejecutable desde USB)
mozilla.pe/firefox-portable