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ón
query="SELECT * FROM users WHERE username = '"
+ req.query.username + "' AND password = '"
+ req.query.password + "'"
//…
connection.query(query, function (error,
results, fields) {
//…
}
A1: Inyección
query="SELECT * FROM users WHERE username = '"
+ req.query.username + "' AND password = '"
+ req.query.password + "'"
//…
connection.query(query, function (error,
results, fields) {
//…
}
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--
A1: Inyección
query="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ón
query="SELECT * FROM users WHERE username = ?
AND password = ?"
//…
connection.query(query,
[req.query.username, req.query.password],
function (error, results, fields) {
//…
}
A1: Inyección
app.post('/login', function (req, res) {
db.users.find({username: req.body.username,
password: req.body.password},
function (err, users) {
//…
})
})
A1: Inyección
app.post('/login', function (req, res) {
db.users.find({username: req.body.username,
password: req.body.password},
function (err, users) {
//…
})
})
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": ""}
}
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 &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)
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
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 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

Gracias!

Inyección, XSS, CSRF en ChelaJS

  • 1.
    Los 10 principales riesgosen aplicaciones web (OWASP Top 10 2013) @SuperSerch
  • 2.
    OWASP Top Ten2013 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 Ten2013 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 • Unafalla 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 enSQL • 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) { //… }
  • 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.
    A1: Inyección app.post('/login', function(req, res) { db.users.find({username: req.body.username, password: req.body.password}, function (err, users) { //… }) })
  • 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.
    A1: Inyección Mitigación enMongoDB • 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.
    A1: Inyección • eval() •setTimeout() • setInterval() • new Function()
  • 16.
    A1: Inyección • eval("…….") •setTimeout("…….", x) • setInterval("…….", x) • new Function("…….")
  • 17.
    A1: Inyección • while(1){} •process.exit() • process.kill(process.pid)
  • 18.
    A1: Inyección • res.end(require('fs').
 readdirSync('.').toString()) •res.end(require('fs').
 readdirSync('..').toString()) • res.end(require('fs').
 readFileSync(filename))
  • 19.
    A1: Inyección Mitigación enjavascript • 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
  • 21.
    A3: Cross-Site Scripting (XSS) app.post('/',function( req, res) { res.end("hola " + req.body.nombre) })
  • 22.
    A3: Cross-Site Scripting (XSS) app.post('/',function( req, res) { res.end("hola " + req.body.nombre) }) <script>alert('Hola')</script>
  • 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 &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) 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.
    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.
    A8: Cross SiteRequest 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 SiteRequest 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 SiteRequest 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 SiteRequest 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.
    A8: Cross SiteRequest 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.
    Referencias • OWASP TopTen
 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.