> For the complete documentation index, see [llms.txt](https://beafn28.gitbook.io/beafn28/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://beafn28.gitbook.io/beafn28/web-security/laboratorios-portswigger/server-side-request-forgery-ssrf.md).

# Server-side request forgery (SSRF)

## Lab: Basic SSRF against the local server

### Enunciado

Este laboratorio tiene una funcionalidad de **verificación de stock** que obtiene datos desde un **sistema interno**. **Modificar la URL usada en la verificación de stock para acceder a la interfaz de administración en `http://localhost/admin`** y **eliminar al usuario `carlos`**.

### Resolución

Entramos a un producto y comprobamos la petición.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FtC0fpI7uXtcyPoEuDKzy%2Fimage.png?alt=media&amp;token=74e6e2cf-d380-4a56-a3f4-3f0d2b1a5970" alt=""><figcaption></figcaption></figure>

Como el servidor web tiene esos permisos accedemos a la URL cambiandola ya que en el **/admin** nos decía que se podría entrar en localhost.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FUduWL43Ur7cRaNflHkpV%2Fimage.png?alt=media&amp;token=de5892c8-f25e-489d-a57a-077ef3ff1456" alt=""><figcaption></figcaption></figure>

Ahora vemos la ruta para eliminar al usuario y hacemos lo mismo cambiando la URL para enviarlo y así se elimina.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FJUT0gaBgpKvNbjiLNBzO%2Fimage.png?alt=media&amp;token=0980ac76-b008-41bb-bef9-f8f6cbc04fe3" alt=""><figcaption></figcaption></figure>

## Lab: Basic SSRF against another back-end system

### Enunciado

Este laboratorio tiene una funcionalidad de **verificación de stock** que obtiene datos desde un **sistema interno**. Usar la funcionalidad de verificación de stock para **escanear el rango interno `192.168.0.X` en el puerto 8080**, localizar una **interfaz de administración**, y utilizarla para **eliminar al usuario `carlos`**.

### Resolución

No se encuentra **/admin** por lo que vamos a ver el stock de un producto y su petición.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FYCrtxw4Tc60Z1ddV1vol%2Fimage.png?alt=media&amp;token=b9552268-ff7b-49a0-ad39-529fa77a6f34" alt=""><figcaption></figcaption></figure>

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FJiqGj2J9dsqAMnuNCve6%2Fimage.png?alt=media&amp;token=eea9bca5-7199-40b9-9119-f0146d36ef47" alt=""><figcaption></figcaption></figure>

Hacer peticiones a una IP eso está mal por lo que enviamos esa petición pero para la ruta **/admin**.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fe2lvZAiHcP2PA0rnOC18%2Fimage.png?alt=media&amp;token=726d8071-62e6-4226-9e11-36ddabd3584d" alt=""><figcaption></figcaption></figure>

Nos da error por lo que no se encuentra en esa IP. Enviamos al **Intruder** y realizamos una fuerza bruta para ver que IP es.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FtruoOBy9DxCL8f2mChrV%2Fimage.png?alt=media&amp;token=da8e92bc-828e-40e6-8489-ef301f0d7f68" alt=""><figcaption></figcaption></figure>

Encontramos una solución que nos da código 200.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FXCeBh2GOVUY9ghVNiXLl%2Fimage.png?alt=media&amp;token=0b7b907b-943d-408d-ba5c-64da0d4ea502" alt=""><figcaption></figcaption></figure>

Con la petición del stock con la ruta de eliminar como hicimos antes pero con la IP correcta.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FKIZN2rhVP0U0CP12thzp%2Fimage.png?alt=media&amp;token=2bf2ea9d-8a5f-4481-b756-9828b508dc36" alt=""><figcaption></figcaption></figure>

## Lab: Blind SSRF with out-of-band detection

### Enunciado

Este sitio utiliza un **software de análisis** que **obtiene (fetch)** la URL especificada en el **header Referer** cuando se carga una página de producto.

Para resolver el laboratorio, **aprovecha esta funcionalidad** para provocar que se realice una **solicitud HTTP** al servidor público de **Burp Collaborator**.

### Resolución

Interceptamos la petición.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FejCE1JYVS3snMrMoE7x2%2FCaptura%20de%20pantalla%202025-07-10%20102048.png?alt=media&amp;token=2c2e67e4-b233-414c-b64b-f281afa9e7c0" alt=""><figcaption></figcaption></figure>

Cambiamos el header Referer por el enlace del Collaborator.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fk9y5Kn8MGVIqGOhfOjDS%2FCaptura%20de%20pantalla%202025-07-10%20102141.png?alt=media&amp;token=28ab4d87-7c10-4d22-ac3a-2aeec83620c0" alt=""><figcaption></figcaption></figure>

Enviamos petición.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FqVgnCYYs2gmRzpwzW8Sd%2FCaptura%20de%20pantalla%202025-07-10%20102205.png?alt=media&amp;token=0b46f268-9bca-4140-bf9e-d3cc206c4d08" alt=""><figcaption></figcaption></figure>

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FQZ5jLCBLLxTLdtoMSwJ5%2FCaptura%20de%20pantalla%202025-07-10%20102226.png?alt=media&amp;token=4ba80e3b-7828-4f71-835b-085ffcdff9de" alt=""><figcaption></figcaption></figure>

## Lab: SSRF with blacklist-based input filter

### Enunciado

Este laboratorio tiene una función de **verificación de stock** que obtiene datos de un **sistema interno**.

Para resolver el laboratorio, **modifica la URL de verificación de stock** para acceder a la interfaz de administración en:

```
http://localhost/admin
```

y **elimina al usuario carlos**.

El desarrollador ha implementado **dos defensas anti-SSRF débiles** que tendrás que **eludir**.

### Resolución

Miramos la petición de stock.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FldINj5J6YifNBvKvUTgL%2Fimage.png?alt=media&amp;token=487110df-9b5d-4e3d-a571-7f1b76fb10fa" alt=""><figcaption></figcaption></figure>

Enviamos el enlace del enunciado.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FTrSVa0HIoiqJM9pNO06c%2Fimage.png?alt=media&amp;token=16623b98-3b40-4edd-b04e-db275dd7b0d1" alt=""><figcaption></figcaption></figure>

Vemos varias maneras de encodearlo y nos salión con la codificación doble de caracteres.

```
http://127.1/%2561dmin
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FRNhseQFcOpTChUxhQqUx%2Fimage.png?alt=media&amp;token=d754d22f-ae5c-4ab3-849a-d296cdee0ddb" alt=""><figcaption></figcaption></figure>

Ya podemos eliminar al usuario Carlos.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FvXNyM6ndWgNRR0SkqUjj%2Fimage.png?alt=media&amp;token=aead8570-fd88-461c-82ad-25fe7c20cb95" alt=""><figcaption></figcaption></figure>

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FNmnaKVAOhp36wcZFZ8Zx%2Fimage.png?alt=media&amp;token=b9f54f33-8886-485d-aea1-7cecddb2c4a4" alt=""><figcaption></figcaption></figure>

## Lab: SSRF with filter bypass via open redirection vulnerability

### Enunciado

Este laboratorio tiene una función de **verificación de stock** que obtiene datos de un **sistema interno**.

Para resolver el laboratorio, **modifica la URL de verificación de stock** para acceder a la interfaz de administración en:

```
http://192.168.0.12:8080/admin
```

y **elimina al usuario carlos**.

El verificador de stock ha sido **restringido para acceder únicamente a la aplicación local**, por lo que primero **necesitarás encontrar un open redirect** que afecte a la aplicación.

### Resolución

Miramos la petición de stock.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2Fdmlp44pWjCAj76NeHTSv%2Fimage.png?alt=media&amp;token=ad0835be-8f5c-4286-b503-30b720091941" alt=""><figcaption></figcaption></figure>

No nos deja completar dominios ni subdominios.

Detectamos una **vulnerabilidad de redirección abierta** en el parámetro **path** del endpoint `nextProduct`.

Aprovechamos esta redirección para lograr que el **stock checker** accediera de forma indirecta al **panel de administración interno** en:

```
http://192.168.0.12:8080/admin
```

Una vez allí, aplicamos la misma técnica para **construir una URL** que permitiera **eliminar al usuario carlos**, logrando así completar el laboratorio.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FHWOHfEwBOVVvr264b18l%2Fimage.png?alt=media&amp;token=e2569c95-54ad-4b82-aefb-58ad0b5070bd" alt=""><figcaption></figcaption></figure>

Ya podemos eliminar al usuario.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FDc2IgudyVRkdjICnouEN%2Fimage.png?alt=media&amp;token=b3528a68-437d-40bf-a187-c97b0b600964" alt=""><figcaption></figcaption></figure>

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FgNopKcuNulZyKzFlyfJA%2Fimage.png?alt=media&amp;token=11bca96a-7ac0-40c1-af9a-d1297e9fcb50" alt=""><figcaption></figcaption></figure>
