Presentación de la charla disertada por Juan Manuel García en el OWASP LATAM TOUR 2016 BUENOS AIRES el día 22 de Abril de 2016 sobre detección y explotación avanzada de la vulnerabilidad Cross Site Scripting (XSS).
XSS to the MAX - Juan Manuel Garcia (OWASP LATAM TOUR 2016)
1. XSSto the MAX
Juan Manuel García
CEH/GPEN/CHFI/CEI/CICP/SCSE/STS
Cross Site Scripting
2. $Whoami
Juan Manuel García
Profesional de Seguridad
Ethical Hacker / Researcher
Instructor
http://packetstormsecurity.org/files/author/8294/
www.linkedin.com/in/juanmagarcia
3. Define:Cross Site Scripting (XSS)
Vulnerabilidad que permite la inyección de scripts maliciosos (JavaScript, HTML, etc.) en
aplicaciones web que no chequean correctamente las salidas provenientes de las
peticiones del usuario (GET, POST, COOKIES, etc.).
Atacante inyecta el payload
<script>alert(document.cookie)</script>
La aplicación no valida correctamente el input y
devuelve el payload al browser de la víctima
El browser de la vícitma no filtra correctamente la
respuesta del server y ejecuta el payload
4. Define:Cross Site Scripting (XSS)
Vulnerabilidad que permite la inyección de scripts maliciosos (JavaScript, HTML, etc.) en
aplicaciones web que no chequean correctamente las salidas provenientes de las
peticiones del usuario (GET, POST, COOKIES, etc.).
Atacante inyecta el payload
<script>alert(document.cookie)</script>
La aplicación no valida correctamente el input y
devuelve el payload al browser de la víctima
El browser de la vícitma no filtra correctamente la
respuesta del server y ejecuta el payload
5. Define:Cross Site Scripting (XSS)
Vulnerabilidad que permite la inyección de scripts maliciosos (JavaScript, HTML, etc.) en
aplicaciones web que no chequean correctamente las salidas provenientes de las
peticiones del usuario (GET, POST, COOKIES, etc.).
Atacante inyecta el payload
<script>alert(document.cookie)</script>
La aplicación no valida correctamente el input y
devuelve el payload al browser de la víctima
El browser de la vícitma no filtra correctamente la
respuesta del server y ejecuta el payload
Atacante toma control del Browser de la víctima:
Contenido Cookie / Redirección a otro sitio / Iframe /
CSRF/ Keylogging/ XSS Tunneling
9. Define:DOM
Es la estructura de objetos que genera el navegador cuando se carga un
documento y se puede alterar mediante Javascript para cambiar
dinámicamente los contenidos y aspecto de la página.
Netscape 2.0 fue el primero en incorporarlo, se lo llama “DOM0” (nivel 0). La
última especificación publicada es DOM4.
Las implementación de DOM difiere de browser en browser…
11. Algunos Inputs susceptibles DOM Based XSS:
document.referer
document.writte
document.documentURI
location.href
location.search
location
location.hash
location.*
document.url
window.name
window.location
(element).innerHTML
eval
setTimout / setInterval
execScript
DOM Based XSShttps://www.owasp.org/index.php/Types_of_Cross-Site_Scripting#DOM_Based_XSS_.28AKA_Type-0.29
12. Define:DOM's innerHTML property
Setea o devuelve el contenido HTML de un elemento,
es utilizado para crear “paginas interactivas” (generalmente con JavaScript).
<script type="text/javascript"> function changeText2(){ var
userInput = document.getElementById('userInput').value;
document.getElementById('boldStuff2').innerHTML =
userInput; } </script> <p>Welcome to the site <b
id='boldStuff2'>dude</b> </p> <input type='text'
id='userInput' value='Enter Text Here' /> <input type='button'
onclick='changeText2()' value='Change Text'/>
Qué pasa si se manipula el contenido ingresado por el
usuario antes de ser procesado por el innerHTML?
13. Mutation (mXSS)
Mario Heiderich: https://cure53.de/fp170.pdf
La webapp es vulnerable si inserta inputs del usuario a través de innertHTML
- o propiedades relacionadas- (Ej: jQuery) en el DOM del browser
14. 1. Ningún sitio conocido es vulnerable a XSS
2. Explotando XSS no se ownea nada
realmente
3. El filtrado Anti-XSS es infalible
Mitos sobre XSS
15. Reflected XSS en sitios populares
Desmitificación 1: Ningún sitio es vulnerable a XSS
16. Persistent XSS en sitios populares
Desmitificación 1: Ningún sitio es vulnerable a XSS
17. Incidentes provocados por XSS…
2013: Apple Developer Website Hacked
http://mytechblog.com/other/apple/apple-developer-website-hacked-what-happened/
2013: Ubuntu Forums Hacked
http://blog.canonical.com/2013/07/30/ubuntu-forums-are-back-up-and-a-post-mortem/
2010: Servidor Apache Foundation Owneado
https://blogs.apache.org/infra/entry/apache_org_04_09_2010
Desmitificación 1: Ningún sitio es vulnerable a XSS
19. XSS en aplicaciones (cont.)
Desmitificación 2: Explotando XSS no se ownea nada realmente
20.
21.
22. XSS Tunneling
Establecen un canal bidireccional entre el atacante y el browser un usuario víctima
El atacante inyecta un link a un .js, logrando que cuando el usuario ingrese a la aplicación
vulnerable, el browser ejecute el Javascript alojado en el servidor del atacante.
Esto permite que el atacante obtenga control sobre el Navegador Web de la víctima ;)
Desmitificación 2: Explotando XSS no se ownea nada realmente
23. Cómo obtener acceso como Domain Admin
1
•Inyectar un payload (BeeF) en una aplicación vulnerable a XSS persistente
2
•El usuario víctima accede y el payload es ejecutado por su browser.
•Explotamos alguna vulnerabilidad (Metasploit) e inyectamos meterpreter
3
•Impersonalizamos un token con privilegios de “domain admin”
• Obtenemos IP del DC (post/windows/gather/enum_ad_computers)
•Hacemos un “port fw” del puerto 3389 del equipo víctima a nuestro equipo
4
•Nos conectamos vía RDP al escritorio del servidor de Active Directory
Desmitificación 2: Explotando XSS no se ownea nada realmente
24.
25. Anti-XSS: Server-Side (App)
Escape (&, <, >, ", '): HTML / JavaScript …
Ej: <script>alert(1)</script>
Sanitize HTML Markup (remoción de “etiquetas inseguras” como <script>):
HtmlSanitizer / OWASP AntiSamy / OWASP Java HTML Sanitizer…
Ej: AntiSamy as = new AntiSamy(); CleanResults cr = as.scan(dirtyInput, new
File(policyFilePath));
X-XSS-Protection: Fuerza la activación del filtro Anti-XSS del browser
Ej: X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff Previene ataques de MIME (contenido)
HTTPOnly: Flag opcional de la cookie que le indica al browser que la cookie no
debe ser accedida por client-side scripts.
Ej: Set-Cookie: path=/; Secure; HttpOnly
Puede ser seteado en el código de la WebApp o agregado on the fly por un WAF
26. Es una solución de seguridad (proxy) que analiza tráfico (entrante y
saliente) a nivel de capa 7 con el fin de detectar y bloquear/alertar
ataques web (SQLi, XSS, DDoS, …)
Anti-XSS: Server-Side (WAF)
Características típicas:
Detección de ataques basado en Firmas (texto o regex)
Uso de “listas negras” (IP, Browser, etc.)
Importación de salidas de DAST Scanners para aplicar“Virtual Patching”
Aplicación de protecciones en la respuestas HTTP (Ej: Httponly)
27. Anti-XSS: Client-Side
Protecciones de XSS en Browsers
Browser Anti-XSS Filters: Son filtros integrados nativamente en los browsers.
Si detectan una “condición peligrosa” reescriben el código para hacerlo inocuo
Compatibilidad con protecciones de XSS indicadas por el webserver:
• Httponly
• X-XSS-Protection
• X-Content-Type-Options: nosniff
Content Security Policy: Crea “Listas blancas” de origen de recursos client-
side. Más info en: http://content-security-policy.com/
Ej: Content-Security-Policy: default-src 'self';
Extensiones Anti XSS complementarias
Filtran inyecciones de HTML o JavaScript basándose en la detección de
“caracteres peligrosos”
Soporte de “X-Content-Type-Options: nosniff” para Firefox
28.
29. Técnicas para saltear protecciones
Url Encoding: http://meyerweb.com/eric/tools/dencoder/
%3Cscript%3Ealert(1)%3C%2Fscript%3E
Double Encoding: [(ASCII -> Hexa) + Url Encoding]-> Hexa + Url Encoding
Mixed Encoding: Double URL Encoding + HTML Encoding + Unicode Encoding
<img/src="x"/onerror="promt(‘XSS’);">
%3Cimg%2Fsrc%3D%22x%22%2Fonerror%3D%22prom%5Cu0070t%2526%2523x28%3B%2526%25
23x27%3B%2526%2523x58%3B%2526%2523x53%3B%2526%2523x53%3B%2526%2523x27%3B%25
26%2523x29%3B%22%3E
JS-FUCK Encoding: Encoding de JavaScript usando solo estos 6 caracteres: ! ( ) + [ ]
http://jscrew.it/
%253Cscript%253Ealert(1)%253C%252Fscript%253E
http://www.asciitohex.com/
Desmitificación 3: El filtrado Anti-XSS es infalible
30. Técnicas para saltear protecciones
Url Encoding: http://meyerweb.com/eric/tools/dencoder/
%3Cscript%3Ealert(1)%3C%2Fscript%3E
Double Encoding: [(ASCII -> Hexa) + Url Encoding]-> Hexa + Url Encoding
Mixed Encoding: Double URL Encoding + HTML Encoding + Unicode Encoding
<img/src="x"/onerror="promt(‘XSS’);">
%3Cimg%2Fsrc%3D%22x%22%2Fonerror%3D%22prom%5Cu0070t%2526%2523x28%3B%2526%25
23x27%3B%2526%2523x58%3B%2526%2523x53%3B%2526%2523x53%3B%2526%2523x27%3B%25
26%2523x29%3B%22%3E
JS-FUCK Encoding: Encoding de JavaScript usando solo estos 6 caracteres: ! ( ) + [ ]
http://jscrew.it/
%253Cscript%253Ealert(1)%253C%252Fscript%253E
http://www.asciitohex.com/
JS-FUCK Encoding del XSS payload alert(1)
Desmitificación 3: El filtrado Anti-XSS es infalible
31. Técnicas para saltear protecciones
Url Encoding: http://meyerweb.com/eric/tools/dencoder/
%3Cscript%3Ealert(1)%3C%2Fscript%3E
Double Encoding: [(ASCII -> Hexa) + Url Encoding]-> Hexa + Url Encoding
Mixed Encoding: Double URL Encoding + HTML Encoding + Unicode Encoding
<img/src="x"/onerror="promt(‘XSS’);">
%3Cimg%2Fsrc%3D%22x%22%2Fonerror%3D%22prom%5Cu0070t%2526%2523x28%3B%2526%25
23x27%3B%2526%2523x58%3B%2526%2523x53%3B%2526%2523x53%3B%2526%2523x27%3B%25
26%2523x29%3B%22%3E
JS-FUCK Encoding: Encoding de JavaScript usando solo estos 6 caracteres: ! ( ) + [ ]
http://jscrew.it/
%253Cscript%253Ealert(1)%253C%252Fscript%253E
http://www.asciitohex.com/
JS-FUCK Encoding del XSS payload alert(1)
Tamaño del payload
Ideal para inyectarlo usando POST, ya
que la mayoría de los webservers
limitan el tamaño de los GET
Desmitificación 3: El filtrado Anti-XSS es infalible
32. Técnicas para saltear protecciones (cont.)
Bypassing de filtrados de caracteres
“lalala " onmouseover="alert(1);
' onmouseover='alert(1);
''onerror=alert(1)
Ataque de URL Context
javascript:alert(1)
JaVaScRiPt:confirm%28location%29
Regular expression Denial of Service (ReDoS)
https://www.checkmarx.com/wp-content/uploads/2015/03/ReDoS-Attacks.pdf
* Regex: ^([a-z0-9]+([-a-z0-9]*[a-z0-9]+)?.){0,}([a-z0-9]+([-a-z0-9]*[a-z0- 9]+)?){1,63}(.[a-
z0-9]{2,7})+$
* Payload: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
Bypass HTTPOnly
Apache <v2.2.1 divulga el contenido de la cookie en la página default de error código 400
http://www.securityfocus.com/bid/51706
Desmitificación 3: El filtrado Anti-XSS es infalible
33. Técnicas para saltear protecciones (cont.)
mXSS
https://cure53.de/fp170.pdf
Inyectamos: <p style="font-family:'223bx:expression(alert(1))/*'">
Después del Anti XSS Filter se ejecutará: <P style="FONT-FAMILY: ; x:expression(alert(1))"></P>
Bypassing de Filtros Anti XSS de Internet Explorer
https://www.whitehatsec.com/blog/internet-explorer-xss-filter/
Bypassing de Filtros Anti XSS de Chrome
https://packetstormsecurity.com/files/132431/Google-Chrome-43.0.2357.124-XSS-Filter-Bypass.html
http://blog.elevenpaths.com/2014/01/how-to-bypass-antixss-filter-in-chrome.html
Bypassing de Extensión “NoScript” (Firefox)
http://labs.detectify.com/2015/06/30/using-google-cloud-to-bypass-noscript/
El payload debe ser subido a un sitio que este en la “white list” de NoScript
Recopilación de técnicas de evasión de OWASP
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
Desmitificación 3: El filtrado Anti-XSS es infalible
34.
35. Detección típica de XSS
Manual Auto
www.xss-payloads.com
http://pastebin.com/u6FY1xDA
36. OWASP Xenotix
Advanced XSS Detection & Explotation Framework
No tiene falsos-positivos en los resultados
Renderiza la respuesta del webserver usando 3 engines (Trident/Webkit/Gecko)
+4800 Payloads (bypassean WAF y Filtrado de caracteres)
Incluye varios módulos de explotación / post-explotación y encoders
3 tipos de Fuzzers
Ajin Abraham: https://www.owasp.org/index.php/OWASP_Xenotix_XSS_Exploit_Framework