InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
Handler para manipular imagenes
IIS 6 y la Autenticacion integrada
Como modificar el web.config sin reiniciar la aplicacion ASP.NET
Conversiones de tipos personalizadas (VB y C#)
Compresión por gzip y deflate
La página Web que está abriendo contiene tanto elementos seguros como no seguros.
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008
Iconlook y Ajaxinfo - Imagenes para tus aplicaciones
Un control interesante y gratuito para aplicaciones ASP.NET: FreeTextBox!
Aprende Ajax desde cero

Afiliados
La Web del programador
MundoProgramacion


Seguridad en Internet.

SQL Injections.

    SQL Injections es una técnica por la cúal un atacante de una página Web es capaz de acceder a nuestra base de datos y ejecutar sentencias SQL sobre ella.

    La técnica se basa en aprovechar las páginas con formularios de toma de datos (logins, busquedas ...) para montar sentencias SQL que se ejecutaran en el servidor aprovechando los errores comunes de programación en los entornos Web.

    El escenario sobre el que vamos a desarrollar el articulo es una página de login que dará acceso a la zona privada de la Web. Esta página solicitará el nombre de usuario y password de acceso. El código de la página está escrito en ASP, pero debemos tener claro que SQL Injections no es una vulnerabilidad de ASP, sino que cualquier página PHP, JSP, ASP.NET, CGI ... es susceptible de recibir este tipo de ataques.

    El siguiente código html ilustra la página de entrada de datos, la página se guardará con el nombre frmLogin.html:

 
<html>
 <body>
  <form name="frmLogin" action="/asp/login.asp" method="post">
   <table align="center" border="1" >
    <tr>
     <td align="center" colspan="2"><b> Datos de Acceso </b>
     </td>
    </tr>
    <tr>
     <td>Usuario:</td>
     <td><input type="text" name="usrtxt" ID="Text1" /></td>
    </tr>
    <tr>
     <td>Password:</td>
     <td><input type="text" name="pwdtxt" ID="Text2" /></td>
    </tr>
   </table>
   <p align="center"><input type="submit" value="enviar" ></p>
  </form>
 </body>
</html>

    En este ejemplo hemos dejado el campo password (pwdtxt) como texto normal, para poder ver que es lo que tecleamos.

      Los datos se envian a la pagina login.asp, que recoge los parámetros de la página frmLogin.html, y consulta nuestra base de datos para comprobar si el nombre de usuario y password es correcto. La base de datos podría tener los datos que muestra la imagen.

 
     El codigo de login.asp sería así:

   
<% 
      Option Explicit
      Dim strLogin, strPassword, strSQL 
      Dim connection, rs 
      strLogin = Request("usrtxt")  
      strPassword = Request("pwdtxt") 
      strSQL = " SELECT * FROM USUARIOS " & _          
         " WHERE USUARIO='" & strLogin & "' AND " &_
         "       PASSWORD='" & strPassword & "'"
      Set connection = Server.CreateObject("ADODB.Connection")
connection.Open "DRIVER={SQL Server};SERVER=SERVIDOR;" _
& "Database=DBNAME;User Id=USER;password=CLAVE" 

      Set rs = connection.Execute(strSQL) 
     
      If( Not rs.EOF ) Then           
            Response.Write("Indentificacion correcta")             
      else 
            Response.Write("Indentificacion INCORRECTA") 
      End If 
     
      rs.Close 
      connection.Close

      Set rs = Nothing 
      Set connection = Nothing
   %>

   
    Esta sería una página totalmente normal que cualquier desarrollador medio podría haber desarrollado. Existen miles de páginas como ésta (y peores) colgadas en Internet, en ocasiones como única "guardia" de datos valiosos.

    El funcionamiento de la página es simple, se conecta a la base de datos, ejecuta la consulta contra la base de datos y nos valida o invalida el acceso. Sencillo.

    Supongamos que el usuario llega a su formulario de identificación, e inserta los datos "Devjoker" como identificación y "secreta" como contraseña. Por tanto, la cadena SQL que ejecutaría la página sería como esta:

 


SELECT * FROM USUARIOS
WHERE USUARIO='Devjoker' AND password='secreta'

    Este es el funcionamiento esperado, pero un atacante podría introducir ciertos valores que alteren este comportamiento ....        

    Para entender el ataque hay que tener dos conceptos previos:

  • SQL no utiliza comillas dobles para los valores de texto, sino comillas simples.
  • Los comentarios en lenguaje SQL se escriben con un doble guíon "--".

    Con estas premisas resulta sencillo "cerrar" la cláusula SQL que creemos que el servidor va a ejecutar mediante los valores que introducimos en la página frmLogin.html.

    En la casilla Login, se escribiría un valor cualquiera, por ejemplo "usuario", y en la casilla Password, escribiríamos lo siguiente : 'or 1=1 --. 

    El formulario de entrada de datos quedaría del siguiente modo:
              Usuario:USUARIO_CUALQUIERA
              Clave:'  OR 1=1 --

    El resultado es que el sistema nos da acceso ...

    ¿Que ha pasado?¿Porque ha dado como válido el usuario y la contraseña si en realidad no lo son?

    Cuando la página login.asp forma su sentencia SQL, concatena los valores que hemos enviado desde frmLogin.html. La primera comilla simple que hemos tecleado en el campo password hace que se cierre la cadena, y se añade una cláusula OR que siempre será cierta (1=1). Además, para prevenir que el sistema dé un error, ya que todavía quedaría una comilla simple sin cerrar, se añade el símbolo del comentario en SQL, que hace que el sistema no haga caso al resto de la cadena SQL.      
   
    La sentencia SQL que finalmente ejecutaría el servidor es:


SELECT *
  FROM USUARIOS
 WHERE USUARIO = 'usuario'
   AND PASSWORD ='' OR 1=1 --'

    Como resultado de la ejecución de esta consulta tendremos acceso a la zona privada. En realidad da lo mismo lo que pongamos en el campo usuario, ya que la segunda condición se cumple siempre y se especifica con un operador OR. 
  
    El uso de nombres de usuario previsibles, tales como "Admin" o "Administrador" es otra puerta abierta. Si tecleamos "Admin" como usuario, la query quedaría del siguiente modo ...


SELECT *
  FROM USUARIOS
 WHERE USUARIO = 'ADMIN'
   AND PASSWORD ='' OR 1=1 --'

    Si se produce este caso, no solo tenemos acceso al sistema sino que además tendremos privilegios de administrador.

    Pero la peor parte de este tipo de ataques esta por llegar. Algunos gestores de bases de datos son capaces de ejecutar mas de una sentencia SQL, separadas por punto y coma. Por lo que si sabemos cual es el nombre de una tabla podríamos ejecutar sentencias SQL con la intención de borrar los datos o la propia tabla.

    En el siguiente ataque el usuario introduce los siguientes valores:
              Usuario:Pedro
              Clave:' HAVING 1=1 --

    La sentencia SQL que se compone es la siguiente:


SELECT
*
  FROM USUARIOS
 WHERE USUARIO = 'ADMIN'
   AND PASSWORD ='' HAVING 1=1 --

    La sentencia SQL que ha quedado formada es incorrecta, por lo que la ejecución fallará y se devolverá el error correspondiente, en nuestro caso seria el siguiente:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'USUARIOS.CO_USUARIO' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

    El error nos esta informando de que la tabla se llama USUARIOS, por lo que ahora podemos escribir lo siguiente en el formulario de entrada:

              Usuario:Pedro
              Clave:' ; DROP TABLE USUARIOS ; --

    Con esta ejecución el usuario ha conseguido eliminar nuestra tabla de usuarios ...

Como protegerse de este tipo de ataques.

    Para protegerse de este tipo de ataques podemos (y debemos) tomar varias medidas.

  • Parametrizar las consultas utilizando comandos preparados. Con esto conseguimos evitar la ejecución de código no deseado. Es la mejor forma de protegernos. En muchos articulos recomiendan "reemplazar" las comillas simples y otros caracteres "peligrosos", pero este método es mucho mas seguro y fácil de implementar.

 
<%
sql = "Select * from USUARIOS where USUARIO=? and CLAVE=?"
 set cmd = Server.CreateObject("ADODB.Command")
 cmd.ActiveConnection = connection
 cmd.CommandText =sql
 cmd.Parameters(0).Value = usuario
 cmd.Parameters(1).Value = clave

 set rs = cmd.Execute()
%>

  • Conectar a la base de datos con usuarios que solo tengan permisos de lectura, de esta forma el atacante no tendrá permisos de ejecución. Esta es una tarea que debe realizar el DBA, y debemos tener usuarios de solo lectura para aquellas partes de nuestra aplicación que pensemos que pueden ser victimas de ataques.

    Saludos y hasta la proxima , DJK


 Versión para imprimir  Foros de consulta

 
d por dd
Respuesta recibida el [13/04/2007 05:47:21]
d

 
Hacerlo con php por YoMismo
Respuesta recibida el [17/07/2007 05:40:05]
Necesito proteger mis consultas ya que he recibido muchos mensajes indeseados en mis tablas, pero mi página esta programada con php y no se nada de asp, si pueden diganme como le hago con php.


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

Seguridad en Internet - SQL Injections
Autor: Pedro Herrarte Sánchez
Visitas: 5618 Fecha de publicación: 07/06/2006
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 201 | Comentarios: 0 | Archivo: Articulos
Categorias: C#
Visitas: 312 | Comentarios: 1 | Archivo: Articulos
Visitas: 386 | Comentarios: 1 | Archivo: Articulos
Categorias: Humor
Visitas: 612 | Comentarios: 3 | Archivo: Articulos
Categorias: C#|ASP.NET
Visitas: 1176 | Comentarios: 4 | Archivo: Articulos
Visitas: 696 | Comentarios: 1 | Archivo: Articulos
Categorias: ASP.NET|ASP|Windows XP|Windows 2003
Visitas: 826 | Comentarios: 2 | Archivo: Articulos
Categorias: Java|Solaris
Visitas: 582 | Comentarios: 0 | Archivo: Articulos
Visitas: 1482 | Comentarios: 1 | Archivo: Articulos
Categorias: ADO.NET
Visitas: 1530 | Comentarios: 3 | Archivo: Articulos
Categorias: ASP.NET

Útimos temas recibidos en los foros ...
Manual Visual Studio.NET por Shiko ... [Visual Basic .NET] 34 26/10/2006
llamar procedimientos de pl/sql en java por jhon ... [ORACLE] 0 03/07/2009
consulta multitablas por anga ... [mySQL] 0 03/07/2009
objetos helper php bajo oracle por objetos_helper_oracle ... [ISAPI] 0 02/07/2009
ranuras isa o pci por sara ... [Access] 5 30/03/2006
descargar tutorial C# por afmp ... [C#] 54 14/10/2008
Tutorial TOAD para Oracle en Español por ijpj ... [ORACLE] 19 14/03/2009
quiero mi numero de mi autogenerado por pablo ... [Visual Basic .NET] 1 15/06/2009
Ayuda con cargar fotografias de otra pc por Alex ... [ASP.NET] 0 01/07/2009
splash screen por zelca ... [Visual Basic .NET] 0 01/07/2009
Error de inicio de aplicación por Danrre ... [C#] 0 30/06/2009
sumar los precios de la columna "precio" del grig por jardinderosas ... [C#] 7 01/11/2007

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
13/07/2006 Paquetes en PL/SQL    forma parte de...Tutorial PL/SQL
27/10/2007 Lista de compatibilidad de software con Windows Mobile 5.0
12/01/2006 Introducción a PLSQL    forma parte de...Tutorial PL/SQL
21/07/2006 Funciones integradas de PL/SQL    forma parte de...Tutorial PL/SQL
21/11/2007 Desencriptar Texto y variables con .NET VB y C# (segunda parte)
16/10/2006 Delegados y eventos    forma parte de...Tutorial C#
03/10/2006 Introduccion a C#    forma parte de...Tutorial C#
16/11/2005 Delegados en C#
19/10/2005 Configurar el IIS para ejecutar aplicaciones ASP.net
03/10/2006 Ocultación de miembros    forma parte de...Tutorial C#

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]