---
title: "Writeup URL-based access control can be circumvented — PortSwigger Web Security Academy"
machine: "URL-based access control can be circumvented"
platform: "PortSwigger Web Security Academy"
difficulty: "Fácil"
operating_system: ["Linux", "Web"]
tags: ["web"]
author: "juanluismm520"
author_url: "https://writeups.es/u/juanluismm520"
source: "https://writeups.es/writeups/portswigger/url-based-access-control-can-be-circumvented/juanluismm520"
license: "CC BY-SA 4.0"
published: "2026-06-08T18:35:40.801795+00:00"
updated: "2026-08-14T18:15:44.659871+00:00"
words: 339
reading_minutes: 2
---# URL-based access control can be circumvented — PortSwigger Web Security Academy

# URL-based access control can be circumvented

> Plataforma: **PortSwigger Web Security Academy** | Dificultad: **Fácil** | IP: `<IP>`

---

## 📝 Resumen

Este laboratorio expone una vulnerabilidad crítica de **control de acceso defectuoso (Broken Access Control)** provocada por una discrepancia en la interpretación de las rutas de enrutamiento entre el sistema *front-end* (como un proxy inverso o WAF) y la aplicación *back-end*.

El objetivo consiste en evadir las restricciones perimetrales para acceder sin autenticación al panel de administración ubicado en `/admin` y proceder con la eliminación del usuario `carlos`.

---

## 🔍 Análisis y Arquitectura

Al auditar la aplicación web, se determina que la infraestructura cuenta con dos capas de procesamiento de solicitudes HTTP:

1. **Front-end:** Actúa como un proxy perimetral. Tiene una regla estricta que deniega cualquier petición dirigida explícitamente a la ruta `/admin` (devolviendo un código de estado de bloqueo, típicamente HTTP 403 Forbidden).
2. **Back-end:** Es el servidor interno que ejecuta la aplicación web real. Está construido sobre un framework que da soporte e interpreta la cabecera HTTP no estándar `X-Original-URL`.

### El Mecanismo de Discrepancia
Si intentamos realizar una navegación convencional hacia la administración:
`Cliente` ──[ GET /admin ]──> `Front-end` (Bloqueo inmediato)

Sin embargo, si la solicitud se realiza hacia una ruta permitida por el front-end (como la raíz `/`), el filtro perimetral la deja pasar al considerarla inofensiva.

---

## 💥 Explotación (Bypass de Control de Acceso)

Para engañar al ecosistema de servidores, nos aprovechamos de la prioridad que el framework del *back-end* le otorga a la cabecera `X-Original-URL`. La técnica consiste en "jugar al despiste":

- Definimos el método principal apuntando a una ruta autorizada (`GET /`) para que el **front-end** valide y apruebe el tráfico.
- Añadimos la cabecera `X-Original-URL: /admin` para que, una vez que la petición supere el perímetro y llegue al **back-end**, este sobreescriba internamente la ruta real y procese la lógica del panel de administración.

### Petición HTTP Modificada (Burp Suite Repeater)

Interceptamos la petición hacia la raíz y le inyectamos la cabecera maliciosa:



```http
GET / HTTP/1.1
Host: 0ac800ff04fb1fd880ccb769002d0046.web-security-academy.net
Cookie: session=zzuE12zRfobCQJ8nNYAlm4UDeveP1txo
X-Original-URL: /admin
Cache-Control: max-age=0
... [resto de cabeceras]
Connection: close

---

> Writeup de **juanluismm520** publicado en [writeups.es](https://writeups.es/writeups/portswigger/url-based-access-control-can-be-circumvented/juanluismm520).
> Si citas este contenido, enlaza a la fuente original.
