2. OWASP Top Ten 2013 Edition
A1: Inyección
A2: Fallos de
Autenticación y
manejo de
sessiones
A3: Cross-Site
Scripting (XSS)
A4: Referencias
inseguras a
objetos directos
A5: Mala
configuración
de la seguridad
A6: Exposición
de datos
sensibles
A7: Falta de
controles de
acceso por
función
A8: Cross Site
Request
Forgery (CSRF)
A9: Usar
componentes
con
vulnerabilidades
conocidas
A10:
Redirecciones
sin validación
3. OWASP Top Ten 2013 Edition
A1: Inyección
A2: Fallos de
Autenticación y
manejo de
sessiones
A3: Cross-Site
Scripting (XSS)
A4: Referencias
inseguras a
objetos directos
A5: Mala
configuración
de la seguridad
A6: Exposición
de datos
sensibles
A7: Falta de
controles de
acceso por
función
A8: Cross Site
Request
Forgery
(CSRF)
A9: Usar
componentes
con
vulnerabilidades
conocidas
A10:
Redirecciones
sin validación
4. A1: Inyección
• Una falla de inyección ocurre cuando se envían
datos no confiables a un interprete como parte
de una instrucción o una consulta.
• Los datos no confiables del atacante pueden
engañar al interprete para ejecutar instrucciones
no esperadas o entregar información no
autorizada.
5. A1: Inyección
query="SELECT * FROM users WHERE username = '"
+ req.query.username + "' AND password = '"
+ req.query.password + "'"
//…
connection.query(query, function (error,
results, fields) {
//…
}
6. A1: Inyección
query="SELECT * FROM users WHERE username = '"
+ req.query.username + "' AND password = '"
+ req.query.password + "'"
//…
connection.query(query, function (error,
results, fields) {
//…
}
7. A1: Inyección
query="SELECT * FROM users WHERE username = '"
+ req.query.username + "' AND password = '"
+ req.query.password + "'"
//…
connection.query(query, function (error,
results, fields) {
//…
}
admin' or 1=1--
8. A1: Inyección
query="SELECT * FROM users WHERE username = '"
+ req.query.username + "' AND password = '"
+ req.query.password + "'"
//…
connection.query(query, function (error,
results, fields) {
//…
}
9. A1: Inyección
Mitigación en SQL
• No mezclar datos provenientes del usuario en la
construcción de queries
• Utilizar queries parametrizados
• Sanitizar y parsear los datos antes de
mezclarlos
10. A1: Inyección
query="SELECT * FROM users WHERE username = ?
AND password = ?"
//…
connection.query(query,
[req.query.username, req.query.password],
function (error, results, fields) {
//…
}
14. A1: Inyección
Mitigación en MongoDB
• No mezclar datos provenientes del usuario en la
construcción de queries
• Sanitizar y parsear los datos antes de mezclarlos
• Validar los datos contra valores esperados
• Usar cuentas con mínimos privilegios según la
acción a realizar
19. A1: Inyección
Mitigación en javascript
• Validar los datos antes de procesarlos en el servidor
• No usar eval() para parsear los datos
• Evitar usar las eval, setTimeout, setInterval y Function
• Para parsear usar JSON.parse()
• Usar "use strict" al inicio de la función para limitar lo
que puede hacer
20. A3: Cross-Site Scripting
(XSS)
• Ocurre cuando una aplicación toma datos de un
usuario y los manda a un navegador sin una
adecuada validación o escape.
• Permite que un atacante utilice nuestro sitio
para ejecutar código en el navegador de la
víctima.
• Existe en dos modalidades: Reflejado y
Almacenado
23. A3: Cross-Site Scripting (XSS)
áreas a vigilar
Código HTML <span>DATOS<span>
Atributos HTML
<input type="text" name="pnombre"
value="DATOS">
URIs
<a href="/site/search?value="DATOS"
>Más Info</a>
JavaScript
<script> var currentValue='DATOS' </script>
<script> algunaFuncion('DATOS')</script>
CSS <div style="width:DATOS;">encabezado</div>
24. A3: Cross-Site Scripting (XSS)
Mitigación
• Sanitizar y Validar los datos
• Codificar la salida de forma adecuada
• Usar la opción HTTPOnly para las cookies
• Aplicar estas reglas tanto en el cliente como en
el server
25. A3: Cross-Site Scripting (XSS)
Mitigación
Código HTML
convertir & en & < en < > en > " en
" ' en  y / en /
Atributos HTML
Excepto para caracteres alfanuméricos convertir
todo a entidades HTML &#xHH; (HH valor hexadecimal)
URIs
Excepto para caracteres alfanuméricos convertir
todo a entidades HTML &#xHH; (HH valor hexadecimal)
JavaScript
Asegurar que todas las variables tienen " y todo
caracter ASCII abajo de 256 codificarlo como
unicode uXXXX (X -> entero) ó uxHH
CSS
Excepto para caracteres alfanuméricos convertir
todo caracter ASCII abajo de 256 en HH
27. A8: Cross Site Request
Forgery (CSRF)
• Consiste en forzar al navegador, autenticado, de
la víctima a enviar una petición HTTP falsificada,
dado que los valores de autenticación se
incluyen automáticamente a cada petición, la
aplicación atacada ve la petición como una
solicitud autentica
28. A8: Cross Site Request
Forgery (CSRF)
Sitio vulnerable a
CSRF
1. El usuario se firma a su aplicación
Sitio usado para
distribuir el
ataque
2. El usuario entra a un sitio trampa
3. En el código del sitio trampa
existe una llamada al sitio
vulnerable
4. El sitio vulnerable
recibe la petición y la
procesa como una
petición normal
29. A8: Cross Site Request
Forgery (CSRF)
Sitio vulnerable a
CSRF
1. El usuario se firma a su aplicación
Sitio usado para
distribuir el
ataque
2. El usuario entra a un sitio trampa
3. En el código del sitio trampa
existe una llamada al sitio
vulnerable
4. El sitio vulnerable
recibe la petición y la
procesa como una
petición normal
<img src=”https://
www.bancoenlinea/usuario/
transfiere?
ctaDestino=A113&cantidad=1000"
/>
30. A8: Cross Site Request Forgery (CSRF)
Mitigación
• Agregar un “secreto” (token) que no se envíe
automáticamente a todas las peticiones sensibles
• Los Tokens deben ser criptográficamente fuertes
o completamente aleatorios
• No permitas que los atacantes coloquen ataques
en tus sitios
• Codifica adecuadamente todo dato que recibas
de los usuarios