Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Inyección, XSS, CSRF en ChelaJS

1,054 views

Published on

Presentación dada en el ChelaJS de Junio 2015

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Inyección, XSS, CSRF en ChelaJS

  1. 1. Los 10 principales riesgos en aplicaciones web (OWASP Top 10 2013) @SuperSerch
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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) { //… }
  11. 11. A1: Inyección app.post('/login', function (req, res) { db.users.find({username: req.body.username, password: req.body.password}, function (err, users) { //… }) })
  12. 12. A1: Inyección app.post('/login', function (req, res) { db.users.find({username: req.body.username, password: req.body.password}, function (err, users) { //… }) })
  13. 13. A1: Inyección app.post('/login', function (req, res) { db.users.find({username: req.body.username, password: req.body.password}, function (err, users) { //… }) }) { "username": {"$gt": ""}, "password": {"$gt": ""} }
  14. 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
  15. 15. A1: Inyección • eval() • setTimeout() • setInterval() • new Function()
  16. 16. A1: Inyección • eval("…….") • setTimeout("…….", x) • setInterval("…….", x) • new Function("…….")
  17. 17. A1: Inyección • while(1){} • process.exit() • process.kill(process.pid)
  18. 18. A1: Inyección • res.end(require('fs').
 readdirSync('.').toString()) • res.end(require('fs').
 readdirSync('..').toString()) • res.end(require('fs').
 readFileSync(filename))
  19. 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. 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
  21. 21. A3: Cross-Site Scripting (XSS) app.post('/', function( req, res) { res.end("hola " + req.body.nombre) })
  22. 22. A3: Cross-Site Scripting (XSS) app.post('/', function( req, res) { res.end("hola " + req.body.nombre) }) <script>alert('Hola')</script>
  23. 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. 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. 25. A3: Cross-Site Scripting (XSS)
 Mitigación Código HTML convertir & en &amp; < en &lt; > en &gt; " en &quot; ' 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
  26. 26. 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 } }))
  27. 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. 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. 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. 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
  31. 31. 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 }}">
  32. 32. Referencias • OWASP Top Ten
 https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project • OWASP NodeGoat
 https://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 Security
 https://www.owasp.org/images/3/31/Node.js_Security_Old_vulnerabilities_in_new_bottles_- _Sven_Vetsch.pdf

  33. 33. Gracias!

×