Inyeccion SQL




¿Qué es la inyección de código SQL y como podemos evitarla?
Inyección de código SQL
La inyección SQL consiste en la modificación del comportamiento de nuestras consultas mediante la introducción de parámetros no deseados en los campos a los que tiene acceso el usuario. Este tipo de errores puede permitir a usuarios malintencionados acceder a datos a los que de otro modo no tendrían acceso y, en el peor de los casos, modificar el comportamiento de nuestras aplicaciones. Vamos a ver con un ejemplo que significa eso de “Inyección de código”: Supongamos que tenemos una aplicación Web (realizada en ASP por sencillez) en la que el acceso a ciertas secciones está restringido. Para restringir ese acceso creamos una tabla de usuarios y contraseñas y sólo los usuarios que se validen contra esa tabla podrán acceder a esos contenidos. Una manera de que los usuarios se validen será colocar un par de cuadros de texto en nuestra página Web (por ejemplo txtUsuario y txtPassword) donde puedan introducir su nombre y su contraseña y enviar ese par usuario/contraseña a la base de datos para comprobar si es válido. Primero creamos la tabla que vamos a usar y la rellenamos con datos:
use web-- Nuestra base de datos se llama webgo-- Creamos una tabla para almacenar los pares usuario/contraseñacreate table usuarios (Usuario varchar (50) not null primary key, Password varchar (50))go-- Introducimos un par de datos de pruebainsert into usuarios (Usuario, Password) values ('Admin', '1234')insert into usuarios (Usuario, Password) values ('Usuario', 'abcd') Ahora veamos el código de las páginas que forman parte del proceso de login.
index.htm
Nombre:
Password:
Esta primera página es sencilla. Simplemente los dos cuadros de texto mencionados que enviarán los datos a la página de login.
Login.asp<% Dim Usuario, Password, RS, SSQL Usuario = Request.Form("txtUsuario") Password = Request.Form("txtPassword") SSQL = "SELECT count(*) FROM Usuarios WHERE Usuario = '" & Usuario & "' AND password='" & Password & "'" Set RS = Server.CreateObject("ADODB.Recordset") RS.Open SSQL, "Cadena de conexion" If (RS.EOF) Then Response.Write "Acceso denegado." Else Response.Write "Te has identificado como " & RS("Usuario") End If Set RS = Nothing%>
Y en esta segunda página creamos dinámicamente una sentencia SQL que enviamos a la base de datos para la validación. Si el usuario escribe Admin y 1234 la sentencia creada será:
“SELECT Count(*) FROM Usuarios WHERE Usuario=’Admin’ AND Password=’1234’”
Y como esta sentencia nos devuelve un registro dejaremos que el usuario entre en la Web. Si el usuario escribe por ejemplo 'Admin' y de contraseña cualquier otra cosa, la sentencia no nos devolverá registros y no permitiremos entrar a esa persona. Pero ¿qué ocurre si el usuario escribe ' or '1'='1 como usuario y lo mismo de contraseña?
En este caso la variable Consulta contendrá la cadena:

"SELECT Count(*) FROM Usuarios WHERE Usuario = '' or '1'='1' AND password = '' or '1'='1'"
Y obviamente esta sentencia nos devuelve registros con lo que el usuario entrará en nuestra Web sin tener permiso.
Pero esto no es lo peor. Lo peor será que el usuario utilice estos trucos de inyección de SQL para ejecutar código arbitrario en nuestro servidor. Sentencias DDL, cambiar permisos, utilizar procedimientos almacenados y un largo etcétera. Qué ocurriría si alguien escribiese de contraseña cosas como:


' exec master..xp_cmdshell 'net user test /ADD' –
Como evitarlo

Y ahora lo más importante, ¿qué podemos hacer para evitar estos errores?
Pues hay varios sistemas para evitarlo. Por ejemplo podemos filtrar las entradas de los usuarios reemplazando la aparición de ‘ por ‘’ (dos comillas simples) e incluso evitando que los usuarios puedan pasar caracteres como \ / “ ‘ o cualquier otro que se nos ocurra que puede causar problemas. Estos filtros pueden ser tan sencillos como utilizar la sentencia replace de Visual Basic:


SSQL= "SELECT count(*) FROM Usuarios WHERE Usuario = '" & Replace txtUsuario.Text, "'", "''") & "' AND password='" & Replace(txtPassword.Text, "'", "''") & "'"
Otro factor importante en cuanto a la seguridad es limitar al máximo los permisos del usuario que ejecuta estas sentencias para evitar posibles problemas. Por ejemplo utilizando un usuario distinto para las sentencias SELECT, DELETE, UPDATE y asegurándonos que cada ejecución de una sentencia ejecute una sentencia del tipo permitido.
Por supuesto utilizar el usuario ‘sa’ o uno que pertenezca al rol ‘db_owner’ para ejecutar las sentencias de uso habitual de la base de datos debería quedar descartado.
Una solución definitiva sería trabajar con procedimientos almacenados. El modo en el que se pasan los parámetros a los procedimientos almacenados evita que la inyección SQL pueda ser usada. Por ejemplo utilizando el siguiente procedimiento almacenado:


CREATE Procedure Validar @usuario varchar(50), @password varchar(50) ASIf (SELECT Count(*) FROM Usuarios WHERE Usuario=@Usuario and Password=@password)>0 Return 1Return 0
También deberíamos validar los datos que introduce el usuario teniendo en cuenta por ejemplo la longitud de los campos y el tipo de datos aceptados. Esto lo podemos hacer en el cliente con los RegularExpressionValidator o con los CustomValidators del VB.NET. De todos modos si la seguridad es importante todas estas validaciones hay que repetirlas en el servidor.
Por ultimo, y ya que estamos pensando en entornos Web, podemos programar en ASP.NET y utilizar siempre que sea posible las clases System.Web.Security.FormsAuthentication para que los usuarios entren en nuestras aplicaciones Web.


Fuente:
http://sql.manivesa.com

Otras artículos de interés:

Instalar Bitcoin en ubuntu / Linux Mint
Si desconoces el uso de Bitcoin te recomiendo este enlace: http://www.teleobjetivo.org/ allí podrás tener una idea general de su uso. ...
Programación en Lenguaje Go (Golang)
Go es un lenguaje de programación concurrente y compilado inspirado en la sintaxis de C. Desarrollado por Google, diseñado por Robert Griesemer, Rob Pike y Ken Thompson. Actualmente sólo está disponible para los sistemas operativos Windows, G...
Instalar Windows XP en UBUNTU usando VirtualBox
VirtualBox es un excelente software de virtualización que nos permite ejecutar otros sistemas operativos como cualquier distribución de GNU/Linux o versión de Windows en Ubuntu. V...
Instala LibreOffice en Ubuntu
Debido al futuro incierto de algunas aplicaciones adquiridas por Oracle en la compra de Sun Microsystem. Los desarrolladores de OpenOffice decidieron hacer un fork de esta suite ofimatica, desvinculandose de Oracle. Por ello usemos LibreOffice...
Navega más rápido cacheando las DNS en Ubuntu
Para cachear las DNS nos instalaremos un servidor DNS y DHCP(no usaremos esta función) liviano llamado dnsmasq. Para ello proceremos: Para comprobar cuanto tiempo nos tarda en resolver una DNS : escribimos : dig google.es y nos que...
Actualizar al Kernel 3.3.7 en Ubuntu / LinuxMint
Entre las novedades de este Kernel: Mayor Velocidad Mejor Estabilidad Mayor Seguridad Puedes leer más en: ...
Instalar DenyHosts en CentOS 6
Como root Añadimos el repositorio rpm -Uvh http://mirror.metrocast.net/fedora/epel/6/i386/epel-release-6-8.noarch.rpm Instalamos yum install denyhosts Edite la confi...
Peligros de los ataques XSS y CSRF
Entre todas las vulnerabilidades que atañen a las aplicaciones web, principalmente a las escritas en PHP, sin duda alguna las más populares son los ataques XSS (ing. Cross-Site Scripting) y CSRF (ing. Cross-Site Request Forg...
INTRODUCCIÓN A LA CRIPTOGRAFÍA
La palabra Criptografía viene del griego Kryptos, escondido, y Graphos, escritura. Es decir, cuando hablamos de Criptografía estamos hablando de Escritura escondida. Se trata de escribir algo de manera que otra persona que quiera leer lo qu...
Cambiar la fuente (FONTS) predeterminada de Ubuntu
Aunque se puede hacer con cualquiera, vamos a predeterminar al sistema para que use las fuentes Tahoma.ttf y tahomabd.ttf. Esto no es ni más ni menos porque son dos de las fuentes que trae Windows por defecto, y no solo tenemos un fácil acceso a...

Brindanos
un o una


Redes Sociales

Publicidad


Gana Bitcoins desde tu casa

Categorías


Planeta Vaslibre

Blog Roll




Nube de tags

  • anonimato
  • anonimo
  • antivirus
  • apache
  • blog
  • bsd
  • bug
  • centos
  • chrome
  • cifrado
  • computer
  • debian
  • exploits
  • fedora
  • fice
  • firefox
  • forense
  • freebsd
  • gentoo
  • github
  • gnome
  • gnu
  • gpl
  • gtk
  • hack
  • hacking
  • hosting
  • informatica
  • internet
  • inyeccion
  • isos
  • libre
  • licencias
  • linux
  • linuxmint
  • lxde
  • micros
  • mint
  • mit
  • mozilla
  • mysql
  • noticia
  • opensource
  • pgp
  • php
  • sabayon
  • seguridad
  • sql
  • system
  • tecnologia
  • thunar
  • thunderbird
  • tor
  • troyanos
  • tware
  • ubuntu
  • underground
  • vaslibre
  • virus
  • viserproject
  • vivaldi
  • vulnerabilidades
  • web
  • website
  • windows
  • xanadu
  • xfce
  • xombra