What is this post about?
With this post you will learn to create users in a system that employs the ASP.NET MVC framework without needing credentials for that.

What is ASP.NET MVC?
It is a rapid application development framework for powerful and secure web applications, created by Microsoft according to MVC model like other frameworks such as Spring, Struts, Symfony or Django.

How does it work?
Very roughly we ca say that its operation is based on the separation of the visual part from the code (or software), in addition to that it has a REST format which allows to call each one of the functions (using URL to call the appropriate function, e.g. sitio.com/Users/add). Each function has a visual part or view associated to it.

The way to call a function is through REST format. Suppose you want to register a user. We should have a users set with a “high” function. This function would need an associated view, which is sent to the user’s browser, and it should read in the browser: site.com/Users/Add

A practical example
If we use Microsoft’s IDE Visual Studio, which is the most usual case, this facilitates development and allows us to create a template of a MVC site with a few methods and predefined functions to save us effort. It includes, among others: a default home, creation, deletion and registering of users, management structures, etc.

If we employ that template we need to be careful and delete what we are not going to use as, for example, the user record. Why? Because in order to register users no default authentication is needed.

Most commonly, unaware or inexperienced developers leave the code running, although it has no direct link to the functionality.

How can we take advantage of this situation? Very easily: once you know that the framework used is ASP.MVC, if you write the path “site.com /Account/Register” a form asking our data should appear in order to create our user:

Still more complicated
Perhaps we have a situation where a developer has tried to remove this functionality but he or she has succeeded only partially by eliminating the associated view. If this is the case the server will give us an error like this:

It may seem at first that the functionality is not available. But this is only an illusion. Although the view is not available the server code is executed and the error will only be shown afterwards. What does this mean? This means that if we could build a properly formed request understandable by the framework we could create a user. Very well then, let us get to it.

Since the framework is free and we have a Visual Studio express version, we can build us a default site and view information needed for a correct request.

First we pay attention to the methods employed to register users:

There is still one thing missing: knowing “RegisterModel” structure. We explore our project and check the definition of this class:

This is all the information that we need in order to create our user in a… let’s call it “ninja” ☺ way. We only need to make the request manually. We all have our whims here and I preferred to do it using the ZAP Proxy to my convenience:

The real “trick” is to send the information with the appropriate POST data and the Referer in the HTTP header. If the Referer is not sent the first method will be executed, which has no parameters and shows only the view. The actual way of invoking the second method is by using the Referer exactly as we can see it in the image.

Once this is done we will get the same error message as before but our cr0hn user would have been internally created with the password “helloworld”.

Behave and be careful where you “inject” ☺ users.

You can follow me on twitter: http://twitter.com/ggdaniel or LinkedIn: es.linkedin.com/in/garciagarciadaniel

¿De qué va este post?

Con este post aprenderás a crearte usuarios en un sistema que utilice el framework ASP.NET MVC sin necesidad de tener credenciales para ello.

¿Qué es ASP.NET MVC?

Es un framework de desarrollo rápido de aplicaciones web potentes, robustas y seguro creado por Microsoft, que sigue el modelo MVC, como otros frameworks como Spring, Struts, Symfony o Django.

¿Cómo funciona?

A muy groso modo su funcionamiento está basado en la separación de la parte visual de la parte de código (o programática), además de tener un formato REST para llamar a cada una de las funciones (utiliza la URL para hacer la llamada a la función adecuada, por ejemplo: sitio.com/Usuarios/agregar). Cada función tiene asociada una parte visual o vista.

La forma de llamar a una función es a través del formato REST. Supongamos que queremos dar de alta un usuario. Deberíamos tener un módulo de usuarios con una función “alta”. A esta función tendríamos que tener asociada una vista, que es lo que se envía al navegador del usuario, y poner en el navegador: sitio.com/Users/Add

Ejemplo práctico

Si utilizamos el IDE de desarrollo de Visual Studio de Microsoft, que es lo más habitual, éste nos facilita el desarrollo y nos permite crear una plantilla de un sitio tipo MVC con unos cuantos métodos y funciones predefinidas para ahorrarnos trabajo. Entre otras incluye: Un home por defecto, creación, eliminación y alta de usuarios, estructuras de gestión, etc.

Si hemos utilizado dicha plantilla deberemos tener cuidado y borrar aquello que no vayamos a usar como, por ejemplo: el registro de usuario. ¿Por qué? Porque para dar de alta usuarios no es necesario ningún tipo de autenticación por defecto.

Lo más habitual es que los desarrolladores despistados o sin suficiente experiencia se dejen el código funcionando, aunque no tengan ningún enlace que apunte directamente a la funcionalidad.

¿Cómo podemos aprovecharnos de esta situación? Muy fácil. Sabiendo que el framework utilizado es asp.mvc con poner la ruta:  site.com/Account/Register” debería de aparecernos un formulario que nos pide nuestros datos para crearnos nuestro usuario:

Más complicado todavía

Tal vez nos encontremos con que un desarrollador ha intentado quitar esta funcionalidad pero solo lo ha hecho parcialmente eliminando la vista asociada. Si este es el caso el servidor nos volcará un error parecido a este:

A priori puede parecer que la funcionalidad no está disponible. Pero esto es solo una ilusión. Aunque la vista no esté disponible el código del servidor es ejecutado y es después de hacerlo cuando se vuelca el error. ¿Qué significa esto? Que si pudiéramos construir una petición correctamente formada y que  l framework entendiera podríamos crear un usuario. Muy bien, pues vamos a ponernos a ello.

Como el framework es gratuito y tenemos una versión Express del Visual Studio podemos construirnos un sitio por defecto y ver información necesita para que la petición sea correcta.

Primero observamos los métodos encargados de dar de alta usuarios:

Todavía hay una cosa que nos falta: Conocer la estructura “RegisterModel”. Exploramos nuestro proyecto y vemos la definición de esta clase:

Con esto ya tenemos toda la información que necesitamos para crear nuestro usuario de forma… llamémoslo “ninja” J. Solo nos queda hacer la petición de forma manual. Aquí cada uno tienes sus manías y yo he preferido hacerlo con el ZAP Proxy por comodidad:

El verdadero “truco” está en enviar la información con los datos POST adecuados y el Referer en la cabecera HTTP. Sino enviamos el Referer ejecutará el primer método, que no tiene parámetros y solo nos muestra la vista. Cuando realmente llamamos al segundo método es utilizando el Referer tal y como lo podéis ver en la imagen.

Una vez hecho esto obtendremos el mismo mensaje de error que antes pero internamente se habrá creado nuestro usuario cr0hn con contraseña “holamundo”.

No seáis malos y cuidadito con donde “inyectáis” usuarios 🙂

Podéis seguirme en twitter: http://twitter.com/ggdaniel o en linkedIn: es.linkedin.com/in/garciagarciadaniel