SQL Injection es una técnica de ataque contra aplicaciones de base de datos, consistente en aprovechar los mecanismos de entrada de la aplicación informática fruto del ataque (ej: cajas de texto, querystrings, etc.) para introducir valores a través de los mismos (cadenas peligrosas), que puedan alterar las sentencias SQL que dicha aplicación ejecutará contra su base de datos (ej: SQL Server), consiguiendo de este modo ejecutar código SQL malicioso e invasor. Esta vulnerabilidad resulta más peligrosa cuanto mayores son los permisos concedidos al usuario utilizado para acceder a la base de datos (ojito con los permisos, siempre utilizar usuarios con permisos mínimos – low privileged users). Además, como resulta evidente, la utilización de SSL (Secure Socket Layer) e IPSec (IP Security) no ofrece ninguna protección frente a ataques SQL Injection.
SQL Injection se basa principalmente en el hecho de que algunas aplicaciones (aquellas aplicaciones vulnerables a SQL Injection, que no todas) utilizan los valores introducidos como entradas de la aplicación, para la construcción de sus sentencias SQL (ej: mediante concatenaciones) sin comprobaciones previas de dichos datos de entrada, es decir, aplicaciones que construyen sentencias SQL al vuelo (o SQL Dinámico) concatenando valores introducidos por el usuario que no han sido comprobados previamente. Para la redacción de este artículo, se ha desarrollado una pequeña base de datos de ejemplo en el Laboratorio de GuilleSQL, con las correspondientes páginas ASP y html, simulando ataques de SQL Injection, comprobando los resultados y errores obtenidos en el Laboratorio de GuilleSQL, etc.
SQL Injection no es una vulnerabilidad propia de un lenguaje de programación particular. Del mismo modo, SQL Injection tampoco es una vulnerabilidad propia de un motor de base de datos en particular. Por supuesto, SQL Injection no es un problema particular de SQL Server ni de Transact-SQL, pues SQL Injection puede producirse sobre bases de datos ORACLE, IBM DB2, IBM Informix, Microsoft Acces, MySQL, etc. De hecho, SQL Injection puede considerarse como la consecuencia de una programación descuidada, capaz de comprometer la seguridad de una aplicación por ignorancia de dicho problema o por descuidos y falta de disciplina del equipo de desarrollo. Sin embargo, lo que sí es cierto, es que debido a que cada motor de base de datos tiene sus particularidades (procedimientos almacenados del sistema, seguridad de acceso, tablas del sistema o catálogo, etc.), el conocimiento por parte del atacante de las particularidades del motor de base de datos que se está atacando, facilitará enormemente la realización de un ataque con éxito, como describimos más adelante en los ejemplos del Laboratorio de GuilleSQL.
SQL Injection presenta un especial peligro en Aplicaciones Web disponibles en Internet, en grandes redes corporativas, o en cualquier otro tipo de red pública o gran red, por tratarse de escenarios con grandes poblaciones de usuarios en los que es más probable la existencia de Hackers, debido a que la gran cantidad de usuarios y dispositivos hace más fácil al atacante pasar desapercibido o robar la identidad (dirección MAC, dirección IP, credenciales, etc.) de un tercero para satisfacer su ataque (Hacking), ya se trate de un ataque SQL Injection o de cualquier otro tipo de ataque. Además, el hecho de que para acceder a una Aplicación Web es suficiente con tener un Navegador y conocer la dirección (URL) de dicha Aplicación Web, es un aliciente, frente a Aplicaciones WinForms que precisen instalarse y configurarse en cada dispositivo.
Los daños o impactos que pueden producirse como consecuencia de ataques SQL Injection son varios, pues al margen del daño estrictamente técnico (modificación de datos de la base de datos, denegación de servicio, etc.), pueden producirse daños económicos derivados directamente del propio ataque o incluso indirectamente (ej: pérdida de confianza por parte de los Usuarios de la Aplicación, coste de reparación de los daños producidos por el ataque, etc.).
A través del resto de capítulos de este Artículo, se profundizará más en este tema (SQL Injection), incluyendo ejemplos y código fuente que faciliten la comprensión de la mecánica de los ataques SQL Injection, desarrollo de alternativas de protección y seguridad ante ataques SQL Injection, etc.