33
Los 10 principales riesgos en aplicaciones web (OWASP Top 10 2013) @SuperSerch

Inyección, XSS, CSRF en ChelaJS

Embed Size (px)

Citation preview

Page 1: Inyección, XSS, CSRF en ChelaJS

Los 10 principales riesgos en aplicaciones

web(OWASP Top 10 2013)

@SuperSerch

Page 2: Inyección, XSS, CSRF en ChelaJS

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

Page 3: Inyección, XSS, CSRF en ChelaJS

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

Page 4: Inyección, XSS, CSRF en ChelaJS

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.

Page 5: Inyección, XSS, CSRF en ChelaJS

A1: Inyecciónquery="SELECT * FROM users WHERE username = '" + req.query.username + "' AND password = '" + req.query.password + "'"

//… connection.query(query, function (error, results, fields) {

//… }

Page 6: Inyección, XSS, CSRF en ChelaJS

A1: Inyecciónquery="SELECT * FROM users WHERE username = '" + req.query.username + "' AND password = '" + req.query.password + "'"

//… connection.query(query, function (error, results, fields) {

//… }

Page 7: Inyección, XSS, CSRF en ChelaJS

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

Page 8: Inyección, XSS, CSRF en ChelaJS

A1: Inyecciónquery="SELECT * FROM users WHERE username = '" + req.query.username + "' AND password = '" + req.query.password + "'"

//… connection.query(query, function (error, results, fields) {

//… }

Page 9: Inyección, XSS, CSRF en ChelaJS

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

Page 10: Inyección, XSS, CSRF en ChelaJS

A1: Inyecciónquery="SELECT * FROM users WHERE username = ? AND password = ?"

//… connection.query(query, [req.query.username, req.query.password], function (error, results, fields) {

//… }

Page 11: Inyección, XSS, CSRF en ChelaJS

A1: Inyecciónapp.post('/login', function (req, res) { db.users.find({username: req.body.username, password: req.body.password}, function (err, users) {

//… }) })

Page 12: Inyección, XSS, CSRF en ChelaJS

A1: Inyecciónapp.post('/login', function (req, res) { db.users.find({username: req.body.username, password: req.body.password}, function (err, users) {

//… }) })

Page 13: Inyección, XSS, CSRF en ChelaJS

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

Page 14: Inyección, XSS, CSRF en ChelaJS

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

Page 15: Inyección, XSS, CSRF en ChelaJS

A1: Inyección

• eval()

• setTimeout()

• setInterval()

• new Function()

Page 16: Inyección, XSS, CSRF en ChelaJS

A1: Inyección

• eval("…….")

• setTimeout("…….", x)

• setInterval("…….", x)

• new Function("…….")

Page 17: Inyección, XSS, CSRF en ChelaJS

A1: Inyección

• while(1){}

• process.exit()

• process.kill(process.pid)

Page 18: Inyección, XSS, CSRF en ChelaJS

A1: Inyección• res.end(require('fs').

readdirSync('.').toString())

• res.end(require('fs').readdirSync('..').toString())

• res.end(require('fs').readFileSync(filename))

Page 19: Inyección, XSS, CSRF en ChelaJS

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

Page 20: Inyección, XSS, CSRF en ChelaJS

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

Page 21: Inyección, XSS, CSRF en ChelaJS

A3: Cross-Site Scripting (XSS)

app.post('/', function( req, res) { res.end("hola " + req.body.nombre) })

Page 22: Inyección, XSS, CSRF en ChelaJS

A3: Cross-Site Scripting (XSS)

app.post('/', function( req, res) { res.end("hola " + req.body.nombre) })

<script>alert('Hola')</script>

Page 23: Inyección, XSS, CSRF en ChelaJS

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>

Page 24: Inyección, XSS, CSRF en ChelaJS

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

Page 25: Inyección, XSS, CSRF en ChelaJS

A3: Cross-Site Scripting (XSS)Mitigación

Código HTML convertir & en &amp; < en &lt; > en &gt; " en &quot; ' en &#27; y / en &#x2F;

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

Page 26: Inyección, XSS, CSRF en ChelaJS

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

Page 27: Inyección, XSS, CSRF en ChelaJS

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

Page 28: Inyección, XSS, CSRF en ChelaJS

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

Page 29: Inyección, XSS, CSRF en ChelaJS

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

Page 30: Inyección, XSS, CSRF en ChelaJS

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

Page 31: Inyección, XSS, CSRF en ChelaJS

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

Page 32: Inyección, XSS, CSRF en ChelaJS

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

Page 33: Inyección, XSS, CSRF en ChelaJS

Gracias!