sábado, 6 de diciembre de 2008

Inyeccion SQL - Ejemplo de inyeccion SQL (SQL injection) en C# y MySQL

Los requisitos



En esta entrada les mostraré un sencillo ejemplo de inyección SQL en un programa escrito en C# con Visual Studio 2005 en un Sistema Operativo WIndows Vista Homa Basic y utilizando MySQL como gestor de base de datos. También se ha instalado en Service Pack 1 para Visual Studio y su respectiva actualización para Windows Vista.

Primeros Pasos:

Lo primero para realizar la demostración es crear un nuevo proyecto en Visual Studio 2005, y realizar la respectiva conexión con MySQL. Dentro de MySQL se tiene una base de datos con nombre "ejemplo" y una tabla de nombre "login", en la tabla login se cuenta con dos registros, uno para cada usuario; un usuario es "alfonso" y su contraseña es "123", el otro usuario es "jesus y su contraseña es "456".

La lógica para el acceso es muy simple y no debería emplearse para uso en sistemas reales, pero para este ejemplo bastara.


Visual Studio:

Dentro del proyecto de Visual Studio, el programa únicamente verificará que existen registros cuyos datos se ingresan mediante un campo de texto de usuario y otro de contraseña; la verificación en la base de datos se realiza mediante una consulta SQL:

SELECT * FROM login WHERE usuario='nombre_usuario' AND pass='contraseña_usuario';

Dentro del código de C# tenemos una función autenticación que recibe una consulta SQL de formato parecido a la consulta de la parte de arriba y devuelve un valor booleano si la consulta devuelve por lo menos un registro:

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;
}



esta función se llama desde el formulario principal, el cual sustituye el nombre de usuario y la contraseña con los valores que se obtienen del cuadro de texto de usuario y del cuadro de texto contraseña. Este procedimiento se lleva a cabo por medio de dos botones: Ver instruccion SQL y Ejecutar instrucción.

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.




miércoles, 26 de noviembre de 2008

Retos de la seguridad informática - implementaciones y generalidades





En la dura lucha contra la inseguridad de los sistemas encontramos 3 vertientes principales:

  • El atacante contra el defensor
  • La seguridad y la usabilidad de los sistemas seguros
  • La seguridad como esfuerzo extra

El atacante contra el defensor

En este punto el defensor se encuentra en una desventaja, ya que el defensor debe de asegurar todos los posibles puntos de acceso por los cuales un atacante puede llegar a obtener algún beneficio; mientras que el atacante puede observar algún tipo de vulnerabilidad y explotar esa vulnerabilidad al máximo.
Otro aspecto es que el defensor debe estar siempre atento a cualquier eventualidad, ya que el atacante puede llevar a cabo su ataque en cualquier momento, a cualquier hora del dia y desde cualquier lugar.


La seguridad y la usabilidad de los sistemas seguros


El que nosotros como defensores, intentemos llevar la seguridad al punto extremo, puede hacer que los sistemas sean realmente dificiles de usar. Los encargados de diseñar los mecanismos de seguridad tienen que pensar también en la usabilidad que tendrá el sistema, teniendo en cuenta el no llegar a la inseguridad.
Este punto afecta también a los usuarios, ya que usualmente los usuarios prefieren las contraseñas fáciles de recordar, el problema es que estas contraseñas fáciles de recordar, también son fáciles de obtener; una buena contraseña debe contener una combinación de letras mayúsculas y minúsculas, números y carácteres de todo tipo


La seguridad como esfuerzo extra


Algunas ocasiones, los desarrolladores ven la seguridad como un esfuerzo extra y que no rinde beneficios económicos, la verdad es que la seguridad no aporta ningún beneficio económico, pero se encarga de algo mucho mas importante: no perder los beneficios obtenidos hasta ese momento; un buen sistema de seguridad ayuda a evitar la perdida de información, el robo de la información o la modificación no autorizada de la información.

viernes, 21 de noviembre de 2008

Microsoft Baseline Security Analizer

El software Microsoft Baseline Security Analizer es una herramienta que propiamente desarrolla Microsoft diseñado para que las pequeñas empresas conozcan sus vulnerabilidades en cuanto a seguridad informática se refiere.

Es una herramienta gratuita que tiene una versión disponible para Vista y se puede descargar de manera gratuita (lo cual es bueno) desde la página oficial de Microsoft, es muy ligero y rápido a la hora de realizar el escaneo, esta disponible en inglés y otros idiomas que no recuerdo (creo que japonés y alemán).
Aqui les pondré las imágenes del proceso de instalación, creo que es algo muy sencillo e intuitivo, por lo que no explicaré ese proceso.
Una vez descargado, ejecutamos el programa y seguiremos de acuerdo a las siguientes imágenes:





















Eso es únicamente de la instalación, al momento de querer utilizarlo, lo tenemos que buscar en el menú inicio, cuando por fin logramos ejecutar el programa, nos aparece una ventana como esta:

En este ejemplo, voy a mostrarles el escaneo para mi computadora, aunque el programa tiene soporte para realizar escaneos en red. Como se va a escanear una sola computadora, damos clic en "Scan a computer"

Después de haber dado clic en "Scan a Computer", veremos una pantalla como la siguiente:

En este caso, analizaré mi máquina, la cual tiene la dirección IP: 192.168.1.12, tengo que escribir esa dirección IP en el  campo "IP Address".

También tengo que seleccionar las opciones de análisis, las que se encuentran son las siguientes:
  • Check Windows for administrative vulnerabilities: si habilitamos esta opción, MBSA analizará el equipo en busqueda de vulnerabilidades por parte de los administradores del sistema (cuentas administrativas)
  • Check for weak passwords: Esta opción analiza los passwords de las cuentas de usuarios e identifica passwords que son fáciles de descifrar
  • Check for IIS administrative vulnerabilities: Esta opción analiza el servidor IIS (si se encuentra instalado)
  • Check for SQL administrative vulnerabilities: Con esta opción habilitada, MBSA analizará nuestra base de datos SQL en busca que debilidades en seguridad.
  • Check for security updates: SI habilitamos esta opción, el sistema buscará actualizaciones en línea para nuestro sistema operativo.
Después de haber seleccionado las opciones con las cuales se lleve a cabo el análisis, haremos clic en el botón "Start Scan"







jueves, 20 de noviembre de 2008

Ataque de Negación de servicio / Denial of Service (Dos)

Un ataque de negación de servicio es un ataque hacia las computadoras, los servidores o hacia la red, el cual causa que un recurso (o servicio) sea inaccesible para los usuarios legítimos. En este tipo de ataques, la forma mas común y fácil de llevarlo a cabo es la de consumir completamente el ancho de banda de la red en la que se encuentra el sistema o equipo que contiene el recurso (o servicio).

Estos ataques pueden llevarse a cabo por diversos métodos:
  • Forzar al procesador a realizar cálculos intensivos de una manera repetitiva;
  • Forzar a las aplicaciones a utilizar grandes cantidades de memoria;
  • Forzar a las aplicaciones a utilizar un número excesivo de recursos (conexiones a otros servidores o conexiones a bases de datos) y
  • Llenar la red en la que se encuentra la máquina a atacar de información sin importancia.

Los tres primeros puntos se pueden realizar mediante buffer overflow, que es básicamente el asignar a una variable un valor mucho mas grande del que puede manejar; esto ocasiona que este nuevo valor se escriba completo en memoria, pero ahora puede utilizar espacio reservado para las instrucciones del programa, lo que ocasiona un mal funcionamiento en el sistema.

El último punto es el que mas se utiliza y se puede llevar a cabo de distintas formas:

a través de enviar información innecesaria al servidor; para realizar esto, el atacante debe tener un mayor ancho de banda que el sistema atacado, debido a que el atacante consume todo el ancho de banda, el sistema atacado queda imposibilitado para atender a otros clientes.

Otro método que han utilizado los atacantes es el de inundar de peticiones de conexión al servidor atacado pero con información falsificada, el atacante falsifica la dirección de origen y el servidor al intentar realizar la conexión con una dirección inexistente, consume sus recursos esperando una respuesta, esto ocasiones que deje de atender a otros clientes.

Un método ingenioso es muy parecido al anterior, pero el atacante en lugar de falsificar su dirección con una dirección inexistente, pone la misma dirección del servidor, enviando una petición de conexión al servidor con la dirección de origen del servidor, lo que ocasiona que el servidor intente crear una conexión consigo mismo, esto consume mucho mas recursos que el método anterior, por lo que se necesitan mucho menos peticiones.

miércoles, 19 de noviembre de 2008

Windows puede ofrecer nuevo antivirus gratis (profesional)


Al parecer, los chicos de Microsoft han decidido aumentar aún mas la seguridad en sus sistemas operativos y mejorar la experiencia del usuario. ¿cómo?, pues ofreciendo un antivirus profesional gratuito en sus sistemas operativos. Este nuevo antivirus tiene el nombre codigo: morro. Este nuevo antivirus probablemente estará disponible el segunda mitad del 2009 y planea sustituir el actual OneCare, que es de paga; esta diseñado para trabajar especificamente con pocos recursos para hacerlo compatible con máquinas un poco antiguas.

Asi es, Microsoft reemplazará el actual sistema de paga OneCare por el nuevo sistema gratuito Morro.

Solo espero que este nuevo antivirus me permita instalar nuevos antivirus.

Aunque tal vez la mejor opción sea la de construir el sistema operativo con la protección antivirus desde su núcleo.

martes, 18 de noviembre de 2008

Importancia de la seguridad


En esta primera entrada de este blog sobre seguridad, les contaré un poco acerca de la seguridad informática.

Resulta que conforme Internet ha ido creciendo a lo largo de la historia, especialmente en las áreas de gobierno, educación, investigación, salud, comercio e industria; las aplicaciones se han tenido que volver altamente interconectables entre si, inclusive se han tenido que desarrollar aplicaciones web. Internet ofrece y ha ofrecido, grandes oportunidades de negocio para todos, en especial para los desarrolladores de software. Todo el progreso de Internet ha traido consigo una gran desventaja: los sistemas y aplicaciones 
se vuelven mucho mas susceptibles a ataques y con un mayor número de brechas en la seguridad. Es por eso que, en terminos de seguridad, necesitamos 3 elementos primordiales:
  • Fiabiliadad;
  • Seguridad y
  • Privacidad.

Fiabilidad:
Por fiabilidad entendemos que un sistema es confiable, siempre que se necesita esta disponible y realiza todas las operaciones tal y como se espera que se realicen

Seguridad:
La seguridad significa que un sistema es robusto (resi
stente a ataques, la información es confiable y tanto el sistema como sus datos estan protegidos)

Privacidad:
La privacidad es la capacidad que tienen los usuarios del sistema para compartir públicamente su información, asi como denegar la exposición de esta a ciertas personas.
Visita mi otro blog.

Introducción


Aparte de eso, este blog será sobre temas de seguridad informática sin hacer distinción sobre sistemas Linux o Windows.