Authentication Bypass
Last updated
Last updated
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.
-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
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.
-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")]
-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 de falla lógica
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.
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.
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:
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.
Ilustremos esto usando la herramienta curl para realizar manualmente la solicitud al servidor web.
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.
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.
Si todo a ido bien, deberiamos tener en nuestro correo el reset de password.