Upload
superserch
View
193
Download
5
Embed Size (px)
Citation preview
Los 10 principales riesgos en aplicaciones
web(OWASP Top 10 2013)
@SuperSerch
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
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
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.
A1: Inyecciónquery="SELECT * FROM users WHERE username = '" + req.query.username + "' AND password = '" + req.query.password + "'"
//… connection.query(query, function (error, results, fields) {
//… }
A1: Inyecciónquery="SELECT * FROM users WHERE username = '" + req.query.username + "' AND password = '" + req.query.password + "'"
//… connection.query(query, function (error, results, fields) {
//… }
A1: Inyecciónquery="SELECT * FROM users WHERE username = '" + req.query.username + "' AND password = '" + req.query.password + "'"
//… connection.query(query, function (error, results, fields) {
//… }
admin' or 1=1--
A1: Inyecciónquery="SELECT * FROM users WHERE username = '" + req.query.username + "' AND password = '" + req.query.password + "'"
//… connection.query(query, function (error, results, fields) {
//… }
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
A1: Inyecciónquery="SELECT * FROM users WHERE username = ? AND password = ?"
//… connection.query(query, [req.query.username, req.query.password], function (error, results, fields) {
//… }
A1: Inyecciónapp.post('/login', function (req, res) { db.users.find({username: req.body.username, password: req.body.password}, function (err, users) {
//… }) })
A1: Inyecciónapp.post('/login', function (req, res) { db.users.find({username: req.body.username, password: req.body.password}, function (err, users) {
//… }) })
A1: Inyecciónapp.post('/login', function (req, res) { db.users.find({username: req.body.username, password: req.body.password}, function (err, users) {
//… }) })
{ "username": {"$gt": ""}, "password": {"$gt": ""} }
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
A1: Inyección
• eval()
• setTimeout()
• setInterval()
• new Function()
A1: Inyección
• eval("…….")
• setTimeout("…….", x)
• setInterval("…….", x)
• new Function("…….")
A1: Inyección
• while(1){}
• process.exit()
• process.kill(process.pid)
A1: Inyección• res.end(require('fs').
readdirSync('.').toString())
• res.end(require('fs').readdirSync('..').toString())
• res.end(require('fs').readFileSync(filename))
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
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
A3: Cross-Site Scripting (XSS)
app.post('/', function( req, res) { res.end("hola " + req.body.nombre) })
A3: Cross-Site Scripting (XSS)
app.post('/', function( req, res) { res.end("hola " + req.body.nombre) })
<script>alert('Hola')</script>
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>
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
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)
JavaScriptAsegurar 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
A3: Cross-Site Scripting (XSS)Mitigación en NodeJS
swig.init({ root: __dirname + "/app/views", autoescape: true //valor por defecto })
app.use(express.session({ secret: "s3creT0", cookie: { httpOnly: true, secure: true } }))
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
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
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" />
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
A8: Cross Site Request Forgery (CSRF)Mitigación
app.use(express.csrf())
app.use(function(req, res.next) { res.locals.csrftoken = res.csrfToken() next() })
<input type="hidden" name="_csrf" value="{{ csrftoken }}">
Referencias• OWASP Top Ten
https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project
• OWASP NodeGoathttps://github.com/OWASP/NodeGoat
• Server-Side JavaScript Injection https://media.blackhat.com/bh-us-11/Sullivan/BH_US_11_Sullivan_Server_Side_WP.pdf
• Node.js Securityhttps://www.owasp.org/images/3/31/Node.js_Security_Old_vulnerabilities_in_new_bottles_-
_Sven_Vetsch.pdf
Gracias!