Iframes in XSS, CSP and SOP
Last updated
Last updated
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Hay 3 formas de indicar el contenido de una página en un iframe:
A través de src
indicando una URL (la URL puede ser de origen cruzado o del mismo origen)
A través de src
indicando el contenido usando el protocolo data:
A través de srcdoc
indicando el contenido
Accediendo a las variables de Padre e Hijo
Si accedes al html anterior a través de un servidor http (como python3 -m http.server
), notarás que todos los scripts se ejecutarán (ya que no hay CSP que lo impida). el padre no podrá acceder a la var secret
dentro de ningún iframe y solo los iframes if2 e if3 (que se consideran del mismo sitio) pueden acceder al secreto en la ventana original.
Nota cómo if4 se considera que tiene origen null
.
Por favor, nota cómo en los siguientes bypasses la respuesta a la página enmarcada no contiene ningún encabezado CSP que impida la ejecución de JS.
El valor self
de script-src
no permitirá la ejecución del código JS utilizando el protocolo data:
o el atributo srcdoc
.
Sin embargo, incluso el valor none
del CSP permitirá la ejecución de los iframes que pongan una URL (completa o solo la ruta) en el atributo src
.
Por lo tanto, es posible eludir el CSP de una página con:
Note cómo el CSP anterior solo permite la ejecución del script en línea.
Sin embargo, solo se van a ejecutar los scripts if1
y if2
, pero solo if1
podrá acceder al secreto del padre.
Por lo tanto, es posible eludir un CSP si puedes subir un archivo JS al servidor y cargarlo a través de un iframe incluso con script-src 'none'
. Esto potencialmente también se puede hacer abusando de un endpoint JSONP de mismo sitio.
Puedes probar esto con el siguiente escenario donde se roba una cookie incluso con script-src 'none'
. Simplemente ejecuta la aplicación y accede a ella con tu navegador:
El contenido dentro de un iframe puede estar sujeto a restricciones adicionales mediante el uso del atributo sandbox
. Por defecto, este atributo no se aplica, lo que significa que no hay restricciones en su lugar.
Cuando se utiliza, el atributo sandbox
impone varias limitaciones:
El contenido se trata como si proviniera de una fuente única.
Cualquier intento de enviar formularios es bloqueado.
La ejecución de scripts está prohibida.
El acceso a ciertas APIs está deshabilitado.
Evita que los enlaces interactúen con otros contextos de navegación.
El uso de plugins a través de <embed>
, <object>
, <applet>
o etiquetas similares está prohibido.
Se impide que el contenido navegue por el contexto de navegación de nivel superior por sí mismo.
Las características que se activan automáticamente, como la reproducción de video o el enfoque automático de los controles de formulario, están bloqueadas.
El valor del atributo se puede dejar vacío (sandbox=""
) para aplicar todas las restricciones mencionadas anteriormente. Alternativamente, se puede establecer en una lista de valores específicos separados por espacios que eximan al iframe de ciertas restricciones.
Consulta las siguientes páginas:
Bypassing SOP with Iframes - 1Bypassing SOP with Iframes - 2Blocking main page to steal postmessageSteal postmessage modifying iframe locationAprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)