Tuesday, December 30, 2014

SQL Injection - example using C# and MySQL


At this post we see a simple SQL injection example using a C# app and MySQL as database manager.

First steps:

In MySQL we already have an "ejemplo" (example) database and a "login" table, our login table has 2 rows (each row is a unique user); 1st user name is "alfonso" and its  password is "123", 2nd user name is "jesus" and its password is "456".

After we create our project we need to set-up our database connection

In our Visual Studio project, our application will verify if exists a record in our database matching user name and password typed in a "user textbox" and a "password textbox", this verification is made trough a SQL query:

SELECT * FROM login WHERE usuario='username' AND pass='password';

In our C# code we have an "Autenticacion" (autentication) function; this function accepts a SQL query as parameter and returns a Boolean value indicating if our queries has returned at least one row:

public bool Autenticacion(string query)
{
 bool nivel;
 MySqlCommand miComando = new MySqlCommand(query, this.miConexion);
 MySqlDataReader miLector;

 miLector = miComando.ExecuteReader();
 if (miLector.Read())
 {
  nivel = true; // si la consulta SQL devuelve algun  registro
  miLector.Close();
 }
 else
 {
  nivel = false; //los datos no coinciden
  miLector.Close();
 }
 return nivel;
}


This function is called from main form, where user name and password are replaced with information typed by users. Our example will show the complete query to execute only as educational purpose.

Our button "Ver instrucción" allows us to print into our form the SQL query El boton Ver instrucción imprime en pantalla el contenido de la consulta SQL que se mandará como parametro a la función autenticación:

private void button1_Click(object sender, EventArgs e)
{
 q = "SELECT * FROM login WHERE usuario='" + textBoxUsuario.Text + "' and pass='" + textBoxContra.Text + "';";
labelSQL.Text = q;
}


El botón Ejecutar Instrucción ejecuta la función autenticación con la consulta SQL como parametro y si la función autenticación devuelve un valor verdadero, muestra en pantalla un mensaje que indica que el usuario si se encuentra registrado; si por el contrario, la función devuelve un valor falso, se muestra en pantalla un mensaje que indica que los datos no se encontraron dentro de la base de datos.

Ejemplos de Inyección SQL


En nuestro formulario, si introducimos como alfonso como usuario y 123 como contraseña y damos clic sobre el botón Ver instrucción SQL, podemos observar la consulta SQL tal y como se enviaría a la función autenticación:

SELECT * FROM login WHERE usuario='alfonso' AND pass='123';



y si presionamos el botón Ejecutar instrucción, esta consulta SQL se envia como parametro esta consulta. Podemos observar que se muestra en el formulario que el usuario si cuenta con derechos de acceso.








Si modificamos la contraseña y ahora ponemos 456 como contraseña y presionamos el botón Ver instrucción SQL, observamos que la consulta SQL quedaria asi:

SELECT * FROM login WHERE usuario='alfonso' AND pass='456';

Si en este momento presionamos el botón Ejecutar instrucción, recibiremos de parte de la función autenticación un valor falso, y esto muestra en el formulario un mensaje de que el usuario no tiene derecho de acceso.




Comencemos con en el ejemplo:

Al momento de ingresar un nombre de usuario, podemos engañar al sistema si utilizamos la comilla simple en el cuadro de texto y a la vez escribimos con una operación OR alguna condición que siempre de como resultado un valor verdadero (ejemplos: 1=1, 5=5, 5>1, 1<2 -="">SELECT * FROM login WHERE usuario='as' or '2'='2' AND pass='as' or '9'='9';


en esta instrucción tenemos operaciones de tipo OR que siempre dan en verdadero, ya que '2' es igual a '2' y '9' es igual a '9', esto ocasiona que siempre se devuelvan registros de la consulta (siempre y cuando existan registros en la tabla), y ya que la consulta SQL devuelve por lo menos un registro, la función autenticación devolverá un valor verdadero, esto podrá otorgarle acceso al sistema sin que realmente tenga los derechos de accesar.

Otra forma de obtener el acceso al sistema mediante inyeccion SQL es utilizar la capacidad de poder hacer comentarios en las sentencias SQL, de esta forma aprovechariamos el no tener que escribir contraseña alguna, de esta forma podriamos escribir algo como esto:

usuario: t' and 2=2;--
contraseña:

y la consulta SQL quedaria de esta forma:

SELECT * FROM login WHERE usuario='t' or 2=2;-- and pass='';

ya que utilizamos el simbolo de comentarios (--), todo lo que va después del simbolo de comentarios es ignorado por el sistema de base de datos, es como se no se escribiera, lo que nos da una sentencia SQL asi:

SELECT * FROM login WHERE usuario='t' or 2=2;

y ya que utilizamos una operacion de tipo OR en donde siempre da un resultado verdadero, obtenemos por lo menos un registro y la función autenticación nos permite el acceso del atacante aunque realmente no tenga derechos de acceso.

Actualización (21 Agosto 2013):
Un video que muestra que hasta las instituciones de gobierno sufren este tipo de problemas, realmente recomiendo verlo en pantalla completa para alcanzar a visualizar el texto que introducen.







Monday, April 7, 2014

XML serialization with C#

According to wikipedia:

"Serialization means converting an object into a data stream and writing it to storage. Any applet, application, or tool that uses that object or bean can then "reconstitute" it by deserialization. The object is then restored to its original state."

Serialization is a process that converts an object into a "bytes secuency" and those bytes can be stored or transmitted to convert that secuency into an object again.

Serialization is also known as deflating or marshall and the oposite process is also known as inflating or unmarshall.

Our example uses an "Automovil" class wich has these attributes:
-Marca [Brand]
-Modelo [Model]
-Año de fabricación [Year]
-Dirección hidráulica [Power steerging]
-Automático [Automatic]
-Placas [License plates]
-Numero de Cilindros [Cylinders]
-Numero de puertas [Doors qty]
-Color [Color]

First, we add [Serializable] attribute to our class












Wednesday, March 19, 2014

Implementing fingerprint readers in .net - Part two

This post will show us the way we can implement a fingerprint reader in .net applications.


This example is a C# app and was coded in Visual Studio 2010 using a MySQL database and Griaulle fingerprint SDK 2009. You can visit http://csharp-talks.blogspot.com/2009/10/implementing-fingerprint-readers-in-net.html. Connections between C# and MySQL were done with MySQL connector/net.

Wednesday, January 15, 2014

Working with SecureString class and passwords in .net framework

Working with apps connected to DataBases I almost always use a class to manage all connections and queries to database (avoiding saving passwords in strings). To avoid saving passwords in memory we use class SecureString [System.Security.SecureString].

A very important topic is SecureString implements CriticalFinalizerObject, this means SecureString is considered a "Constrained Execution Region - CER". Out-of-band exceptions are forbidden in CER-type regions and this way we avoid non executed code. Very important: SecureString is not managed code and is our responsability to free that resource.


Using SecureString:

In this example we use SecureString with get & set properties.



Original: http://lambdabox.blogspot.com/2011/10/securestring-almacenar-contrasenas-en.html

Friday, December 20, 2013

MDI forms in .net using C# and Visual Studio 2010 Express

There are two kinds of forms:
SDI (Single Document Interface)
MDI (Multiple Document Interface)

We are interested in MDI forms. MDI forms allow us to contain children form between.

Steps:

As 1st step, we create a new project (Windows application).

In main form, set property IsMdiContainer to True (See example)


main form, click to enlarge

Now we create our child form and it works as a form template to create multiple children form. This example tries to simulate a simple text editor and with MDI support.

We add a second form to our project.

We add a panel to our form (this panel will contain a "Save" button) and it is located at bottom. Set Dock Property to Bottom.

Set Dock property to Bottom
Now we add a 2nd panel to our form (this panel will contain a text box). Set this panel´s property Dock to Fill.


In 2nd panel set Dock property to Fill


We add a textBox inside 2dn panel and set it these properties:
Name = txtBoxContent
Multiline = True
Dock = Fill





Now we can add a button to save current working for our text editor. This button will be placed at bottom panel. And we have a form like this:

This child form works as a template form

It is time to create a menu to handle our children forms (from main form).

Notice that option "Lista ->" does not have any sub-element, this due we will create all our children windows in run time.


.

Monday, November 9, 2009

Ganadores del concurso Blogit.ms

Por fin ha salido la lista de los ganadores del concurso organizado por Microsoft "blogit.ms", para todos aquellos que seguimos el concurso de cerca, podemos ver la lista de los ganadores en el siguiente enlace:

lista de ganadores

Felicidades a los ganadores!!!!

Thursday, October 29, 2009

Implementing fingerprint readers in .net - Part one

In this post, we will see the basics for implementing a fingerprint reader to secure the access to our applications; we need a fingerprint reader (it can be Microsoft), the Griaulle Fingerprint SDK and a database.






As a first step, we need a biometric sample in a digital format (this is the fingerprint reader's job) to store into the database, lately we are going to extract the important information from this sample and get a "template".


To compare a template against another template, we can do it in two ways:


Verify: in this case, we take a template and compare it against another one (1:1), the templates can be stored in our database.


Identify: in this case, our template is compared against another ones (1:n).