Actualmente estoy trabajando en la aplicación web pentest donde descubrí una pequeña vulnerabilidad Unrestricted File Upload
. El único (y gran) problema es que todavía no puedo escalar esto a un shell web remoto que funcione completamente.
Básicamente, puedo cargar el contenido que quiera en el servidor (usando change Avatar picture feature
). Punto importante, el archivo cargado se almacena en whatever.com/something/avatar/2
.
Parece que la tecnología subyacente es un servidor Apache que se ejecuta en CentOS y un servlet de JBoss.
Intenté cargar un shell inverso JSP que no funcionó. Luego leí que, para los servlets de JBoss, los archivos war deberían usarse para desplegar páginas web. Los archivos war deberían colocarse en una carpeta específica /deploy
. Mi problema aquí es que cuando subo un archivo, siempre termina siendo almacenado en whatever.com/something/avatar/2
.
¿Alguien tiene algunas sugerencias que podrían ayudarme a obtener un shell web inverso?
EDIT1:
Al cargar un archivo, debo establecer Content-type
en image/jpeg
, pero la extensión del archivo se puede establecer en lo que quiera, por lo que, obviamente, la única comprobación se realiza en el Content-type
.
EDIT2:
Solicitud / respuesta para subir un archivo:
POST /something/profile/upload HTTP/1.1
Host: HOST
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Referer: REFERER
Cookie: JSESSIONID=COOKIE
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------18769807824524
Content-Length: 1541
-----------------------------18769807824524
Content-Disposition: form-data; name="email"
[email protected]
-----------------------------18769807824524
Content-Disposition: form-data; name="avatarImageUpload"; filename="cmd.war"
Content-Type: image/jpeg
Hello world
HTTP/1.1 200 OK
Date: Mon, 16 Jan 2017 17:26:12 GMT
Content-Type: text/html;charset=ISO-8859-1
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Length: 54
{"success":true,"fileUrl":"/something/profile/avatar/2"}
Solicitud / respuesta al acceder al archivo cargado: para mostrar correctamente la respuesta en el navegador, solo tengo que manipular el encabezado Content-type
devuelto:
GET /something/profile/avatar/2 HTTP/1.1
Host: HOST
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: */*
Accept-Language: en-GB,en;q=0.5
Referer: REFERER
Cookie: JSESSIONID=COOKIE
Connection: keep-alive
HTTP/1.1 200 OK
Date: Tue, 17 Jan 2017 09:18:34 GMT
Content-Type: image/jpeg
Content-Length: 11
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Hello world