🕸️Ataques Web - Skills Assesment
Escenario
Estamos realizando una prueba de penetración de aplicaciones web para una empresa de desarrollo de software y nos encargan que probemos la última versión de su aplicación web de redes sociales. Intenta utilizar las distintas técnicas que aprendiste en este módulo para identificar y explotar las múltiples vulnerabilidades que encuentres en la aplicación web.
Intenta aumentar tus privilegios y explotar diferentes vulnerabilidades para leer la flag en /flag.php.
Objetivo: 94.237.63.109:42403
User "htb-student"
Password "Academy_student!"
Nos logueamos y accedemos a la aplicación interna:

Identificación de vulnerabilidad
Después de probar todos los links, la única funcionalidad de esta herramienta es la de cambio de contraseña:

Vamos a capturar esta petición con BurpSuite para ver si encontramos algo interesante:

El endpoint GET /api.php/token/74 parece ser una API que toma un identificador de token (74) como parámetro. La combinación de esta solicitud con la referencia a una sesión activa (mediante la cookie PHPSESSID y el identificador de usuario uid=74) abre oportunidades para técnicas comunes de hacking web.
Al hacer un forward de nuevo vemos que nos devuelve lo siguiente, que podríamos usar para cambiar la contraseña a un usuario administrador si sabemos su token:

Reconocimiento del endpoint
Al cambiar el ID del token a 75, obtenemos un nuevo token: e51a8a3c-17ac-11ec-8e68-7fe51c0c175e. Esto confirma que el endpoint es vulnerable a IDOR (Insecure Direct Object Reference), ya que permite acceder a datos de otros usuarios o recursos cambiando un parámetro en la URL.
¿Qué significa esto?
Podemos enumerar los tokens de diferentes usuarios modificando el ID en la solicitud.
Si los tokens son sensibles (por ejemplo, para autenticación o acceso a recursos privados), esta vulnerabilidad puede escalar a una violación crítica.
Enumeración de IDS
Vamos a crear un script en bash para automatizar el proceso de obtención de los IDS de los usuarios de la web y exportarlos a un archivo tokens.txt:
Ejecutamos el script de la siguiente manera:
Enumeración de usuarios
En la página de profile.php nos encontramos el siguiente script, que confirma la presencia de un json con los nombres, uids y empresa:
Ahora que tenemos todos los tokens, vamos a extraer los nombres de los usuarios con el siguiente script, para ver si encontramos algún usuario administrador:
Este script nos genera un archivo de log employee_info.txt, y aplicando un filtro con grep encontramos un posible usuario administrador:
Si solamente querríamos encontrar un usuario admin lo podríamos hacer mucho más simple con este script:
Ya tenemos los datos completos del usuario administrador:
Prueba de cambio de contraseña
Vamos a probar a cambiar la contraseña de nuestro usuario por defecto con UID 74:
Vemos que funciona.
Cambio de contraseña del admin
Vamos a usar " Verb Tampering" para eludir los controles de seguridad, y vamos a añadir su token:
Parece que ha funcionado. Vamos a probar a loguearnos con su nombre de usuario a.corrales y la nueva contraseña:

Bingo! Conseguimos acceder como el usuario administrador y vemos que tiene una nueva funcionalidad Add Event:


Vamos a capturar esta petición con BurpSuite para ver si obtenemos algo interesante:

Tenemos un posible XXE. Viendo el código fuente encontramos un script que crea un nuevo archivo XML y lo envía en una solicitud POST al endpoint /addEvent.php:
Al enviar la petición al Repeater y ver la respuesta vemos que el valor del input name se nos muestra en la página. Para imprimir el contenido de un archivo externo en la página, debemos observar qué elementos se muestran, de modo que sepamos en qué elementos inyectar.

Leer el contenido de flag.php
Vamos a utilizar el siguiente payload para codificar en base64 el contenido de flag.php:
Parece que funciona y nos devuelve el contenido de flag.php codificado en base64:

Lo enviamos a Burp Decoder y al decodificarlo en base64 obtenemos la flag en plano:

Local File Disclosure
De igual manera podríamos usar un payload similar para obtener cualquier archivo del sistema (como el /etc/passwd), quedando completamente comprometido:

Última actualización
¿Te fue útil?
