fbpx
Wikipedia

Inyección SQL

Inyección SQL es un método de infiltración de código intruso que se vale de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para realizar operaciones sobre una base de datos.

El origen de la vulnerabilidad radica en la incorrecta comprobación o filtrado de las variables utilizadas en un programa que contiene, o bien genera, código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o script que esté incrustado en otro.

Se conoce como Inyección SQL, indistintamente, al tipo de vulnerabilidad, al método de infiltración, al hecho de incrustar código SQL intruso y a la porción de código incrustado.

Descripción

Se dice que existe o se produjo una inyección SQL cuando, de alguna manera, se inserta o "inyecta" código SQL invasor dentro del código SQL programado, a fin de alterar el funcionamiento normal del programa y lograr así que se ejecute la porción de código "invasor" incrustado, en la base de datos.

Este tipo de intrusión normalmente es de carácter malicioso, dañino o espía, por tanto es un problema de seguridad informática, y debe ser tomado en cuenta por el programador de la aplicación para poder prevenirlo. Un programa elaborado con descuido, displicencia o con ignorancia del problema, podrá resultar ser vulnerable, y la seguridad del sistema (base de datos) podrá quedar eventualmente comprometida.

La intrusión ocurre durante la ejecución del programa vulnerable, ya sea, en computadores de escritorio o bien en sitios Web, en este último caso obviamente ejecutándose en el servidor que los aloja.

La vulnerabilidad se puede producir automáticamente cuando un programa "arma descuidadamente" una sentencia SQL en tiempo de ejecución, o bien durante la fase de desarrollo, cuando el programador explicita la sentencia SQL a ejecutar en forma desprotegida. En cualquier caso, siempre que el programador necesite y haga uso de parámetros a ingresar por parte del usuario, a efectos de consultar una base de datos; ya que, justamente, dentro de los parámetros es donde se puede incorporar el código SQL intruso.

Al ejecutarse la consulta en la base de datos, el código SQL inyectado también se ejecutará y podría hacer un sinnúmero de cosas, como insertar registros, modificar o eliminar datos, autorizar accesos e, incluso, ejecutar otro tipo de código malicioso en el computador.

Por ejemplo, asumiendo que el siguiente código reside en una aplicación web y que existe un parámetro "nombreUsuario" que contiene el nombre de usuario a consultar, una inyección SQL se podría provocar de la siguiente forma:

El código SQL original y vulnerable es:

consulta := "SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';"

Si el operador escribe un nombre, por ejemplo "Pepe", nada anormal sucederá, la aplicación generaría una sentencia SQL similar a la siguiente, que es perfectamente correcta, en donde se seleccionarían todos los registros con el nombre "Pepe" en la base de datos:

SELECT * FROM usuarios WHERE nombre = 'Pepe';

Pero si un operador malintencionado escribe como nombre de usuario a consultar:

Alicia'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%

, se generaría la siguiente consulta SQL, (el color verde es lo que pretende el programador, el azul es el dato, y el rojo, el código SQL inyectado):

SELECT * FROM usuarios WHERE nombre = 'Alicia'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%'; 

En la base de datos se ejecutaría la consulta en el orden dado, se seleccionarían todos los registros con el nombre 'Alicia', se borraría la tabla 'usuarios' y finalmente se seleccionaría toda la tabla "datos", que no debería estar disponible para los usuarios web comunes.

En resumen, cualquier dato de la base de datos puede quedar disponible para ser leído o modificado por un usuario malintencionado.

Nótese por qué se llama "Inyección" SQL. Si se observa el código malicioso, de color rojo, se notará que está insertado en el medio del código bueno, el verde. Así, el código rojo ha sido "inyectado" dentro del verde.

La inyección SQL es fácil de evitar, por parte del programador, en la mayoría de los lenguajes de programación que permiten desarrollar aplicaciones web. En la siguiente sección se trata brevemente ese tema.

Blind SQL injection

'Ataque a ciegas por inyección SQL', en inglés, Blind SQL injection, es una función y una técnica de ataque que utiliza la inyección SQL. Se evidencia cuando en una página web, por un fallo de seguridad, no se muestran mensajes de error al no producirse resultados correctos ante una consulta a la base de datos, mostrándose siempre el mismo contenido (es decir, solo hay respuesta si el resultado es correcto).

Sentencias condicionales con el tipo "Or 1=1" o "having 1=1" ofrecen respuestas siempre correctas (true o verdadero) por lo cual suelen ser usadas por los programadores como formas de comprobación. El problema para la seguridad de la página radica en que esta técnica es utilizada en combinación con diccionarios o fuerza bruta para la búsqueda, carácter por carácter, de una contraseña, un nombre de usuario, un número de teléfono o cualquier otra información que albergue la base de datos atacada; para ello se utiliza código SQL específico que "va probando" cada carácter consiguiendo un resultado positivo acumulable cuando hay una coincidencia. De esta manera se puede saber, por ejemplo, que una contraseña comienza por "F...", luego continúa con ".i...", y luego "..r...", etc (acumula Fir...), hasta dar con la palabra completa.

Existen programas que automatizan este proceso de "tanteos" letra por letra en el resultado de la consulta SQL, que un intruso podría enviar inyectado.

Algunas formas de evitar la Inyección SQL

Ruby on Rails

En el framework Ruby on Rails (RoR), las consultas son verificadas automáticamente por cualquiera de los métodos de búsqueda incluidos. Por ejemplo:

 Project.find consulta := "SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';" # o bien Project.find(:all, :conditions => {:name => params[:name]}) 

La única forma de que un usuario mal intencionado pueda usar una inyección de SQL en RoR es que mediante código se transforme la variable a tipo string y se utilice como argumento de la búsqueda directamente. Por ejemplo:

 # NO SE DEBERÍA HACER ESTO Project.find(:all, :conditions => "name = '#{params[:name]}'") 

Perl

En lenguaje Perl DBI, el método DBI::quote filtra los caracteres especiales (asumiendo que la variable $sql contiene una referencia a un objeto DBI):

 $query = $sql->prepare (  "SELECT * FROM usuarios WHERE nombre = " .  $sql->quote($nombre_usuario) ); 

O también se puede usar la característica placeholder (con comillado automático) como sigue:

 $query = $sql->prepare("SELECT * FROM usuario WHERE nombre = ?"); $query->execute($nombre_usuario); 

PHP

En el lenguaje PHP, hay diferentes funciones que pueden servir de ayuda para usar con distintos sistemas de gestión de bases de datos.

Si se usa MySQL, la función a usar es mysql_real_escape_string:

 $query_result = mysql_query("SELECT * FROM usuarios WHERE nombre = \"" . mysql_real_escape_string($nombre_usuario) . "\""); 

No obstante es más recomendado usar alternativas que ofrecen consultas preparadas como la clase PDO.

$statement = $pdo->prepare("SELECT * FROM usuarios WHERE nombre = :nombre"); $statement->bindParam(':nombre', $nombre_usuario); $statement->execute(); $result = $statement->fetch(); 

Y si se utiliza MySQLi...

// Con funciones $conexion = mysqli_connect("host", "usuario", "clave", "bdd"); $query = mysqli_query($conexion, "SELECT * FROM usuarios WHERE nombre = '" . mysqli_real_escape_string($conexion, $nombre) . "'"); // Orientado a objetos heredando la clase: $query = $this->query("SELECT * FROM usuarios WHERE nombre = '" . $this->real_escape_string( $nombre ) . "'"); // Sin heredar la clase $query = $this->mysqli->query("SELECT * FROM usuarios WHERE nombre = '" . $this->mysqli->real_escape_string($nombre) . "'"); /* donde $this->mysqli es el enlace mysqli a la base de datos */ 

Java

En lenguaje Java, se puede usar la clase PreparedStatement

En lugar de:

 Connection con = (acquire Connection) Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';"); 

se puede usar parametrización o escape de variables, como se indica en los siguientes apartados.

Parametrización de sentencias SQL

 Connection con = (acquire Connection) PreparedStatement pstmt = con.prepareStatement("SELECT * FROM usuarios WHERE nombre = ?"); pstmt.setString(1, nombreUsuario); ResultSet rset = pstmt.executeQuery(); 

Escape de las variables a insertar en la sentencia SQL

Escapar el texto contenido en la variable remplazando los caracteres especiales en SQL por su equivalente textual, de tal forma que SQL interprete todo el contenido de la variable como si fuera texto.

 Connection con = (acquire Connection) Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario.replace("\\", "\\\\").replace("'", "\\'") + "';"); 

También se puede utilizar el método de la clase procedente de la librería de Apache Commons Lang

 Connection con = (acquire Connection) Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE Nombre = '" + StringEscapeUtils.escapeSQL(NombreUsuario) + "';"); 

En C#

En lenguaje C#, de la plataforma .NET (o su alternativa libre Mono), se tiene ADO.NET SqlCommand (para Microsoft SQL Server) u OracleCommand (para servidores de bases de datos Oracle). El ejemplo siguiente muestra cómo prevenir los ataques de inyección de código usando el objeto SqlCommand. El código para ADO.NET se programa de forma similar, aunque puede variar levemente según la implementación específica de cada proveedor.

En vez de:

 using( SqlConnection con = (acquire connection) ) { con. Open(); using( SqlCommand cmd = new SqlCommand("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "'", con) ) { using( SqlDataReader rdr = cmd.ExecuteReader() ){  ... } } } 

se podría usar lo siguiente:

 using( SqlConnection con = (acquire connection) ) { con. Open(); using( SqlCommand cmd = new SqlCommand("SELECT * FROM usuarios WHERE nombre = @nombreUsuario", con) ) { cmd.Parameters.AddWithValue("@nombreUsuario", nombreUsuario); using( SqlDataReader rdr = cmd.ExecuteReader() ){  ... } } } 

Véase también

Enlaces externos

  • Referencia para Inyección SQL por Roberto Salgado (en inglés)
  • Técnicas de ataque en servidores web con scripts vía inyección SQL (en inglés)
  • Artículo "Ataques a servidores SQL: Hacking, Cracking, y Técnicas de protección" escrito por Seth Fogie y Cyrus Peikari (en inglés)
  • Artículo ""escrito por Pete Finnigan (en inglés)
  • Artículo "Ataques de inyección SQL - ¿Estás a salvo?" escrito por Mitchell Harper (en inglés)
  • Artículo "" escrito por Umachandar Jayachandran (en inglés)
  • Artículo "" escrito por Paul Litwin (en inglés)
  • "Protección contra los ataques de inyección" (en inglés)
  • "" (en inglés)
  • "SQLrand: Previniendo los ataques de Inyección SQL" escrito por Stephen W. Boyd y Angelos D. Keromytis (en inglés)
  • "¿Qué es la Inyección SQL?" escrito por CGISecurity.com (en inglés)
  • "" escrito por Juan Martínez Llinás (en español)
  • Artículo "" "" Ejemplo y pasos a seguir para explotar un SQL SERVER 2005
  • Artículo "" Uso de herramientas gráficas para realizar tareas.
  • Artículo "" Uso de herramientas gráficas para realizar tareas.
  •  : programa escrito por un español en lenguaje Perl.
  •   Datos: Q506059

inyección, método, infiltración, código, intruso, vale, vulnerabilidad, informática, presente, aplicación, nivel, validación, entradas, para, realizar, operaciones, sobre, base, datos, origen, vulnerabilidad, radica, incorrecta, comprobación, filtrado, variabl. Inyeccion SQL es un metodo de infiltracion de codigo intruso que se vale de una vulnerabilidad informatica presente en una aplicacion en el nivel de validacion de las entradas para realizar operaciones sobre una base de datos El origen de la vulnerabilidad radica en la incorrecta comprobacion o filtrado de las variables utilizadas en un programa que contiene o bien genera codigo SQL Es de hecho un error de una clase mas general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programacion o script que este incrustado en otro Se conoce como Inyeccion SQL indistintamente al tipo de vulnerabilidad al metodo de infiltracion al hecho de incrustar codigo SQL intruso y a la porcion de codigo incrustado Indice 1 Descripcion 2 Blind SQL injection 3 Algunas formas de evitar la Inyeccion SQL 3 1 Ruby on Rails 3 2 Perl 3 3 PHP 3 4 Java 3 4 1 Parametrizacion de sentencias SQL 3 4 2 Escape de las variables a insertar en la sentencia SQL 3 5 En C 4 Vease tambien 5 Enlaces externosDescripcion EditarSe dice que existe o se produjo una inyeccion SQL cuando de alguna manera se inserta o inyecta codigo SQL invasor dentro del codigo SQL programado a fin de alterar el funcionamiento normal del programa y lograr asi que se ejecute la porcion de codigo invasor incrustado en la base de datos Este tipo de intrusion normalmente es de caracter malicioso danino o espia por tanto es un problema de seguridad informatica y debe ser tomado en cuenta por el programador de la aplicacion para poder prevenirlo Un programa elaborado con descuido displicencia o con ignorancia del problema podra resultar ser vulnerable y la seguridad del sistema base de datos podra quedar eventualmente comprometida La intrusion ocurre durante la ejecucion del programa vulnerable ya sea en computadores de escritorio o bien en sitios Web en este ultimo caso obviamente ejecutandose en el servidor que los aloja La vulnerabilidad se puede producir automaticamente cuando un programa arma descuidadamente una sentencia SQL en tiempo de ejecucion o bien durante la fase de desarrollo cuando el programador explicita la sentencia SQL a ejecutar en forma desprotegida En cualquier caso siempre que el programador necesite y haga uso de parametros a ingresar por parte del usuario a efectos de consultar una base de datos ya que justamente dentro de los parametros es donde se puede incorporar el codigo SQL intruso Al ejecutarse la consulta en la base de datos el codigo SQL inyectado tambien se ejecutara y podria hacer un sinnumero de cosas como insertar registros modificar o eliminar datos autorizar accesos e incluso ejecutar otro tipo de codigo malicioso en el computador Por ejemplo asumiendo que el siguiente codigo reside en una aplicacion web y que existe un parametro nombreUsuario que contiene el nombre de usuario a consultar una inyeccion SQL se podria provocar de la siguiente forma El codigo SQL original y vulnerable es consulta span style color 008000 SELECT FROM usuarios WHERE nombre span span style color 0000FF nombreUsuario span span style color 008000 span Si el operador escribe un nombre por ejemplo Pepe nada anormal sucedera la aplicacion generaria una sentencia SQL similar a la siguiente que es perfectamente correcta en donde se seleccionarian todos los registros con el nombre Pepe en la base de datos span style color 008000 SELECT FROM usuarios WHERE nombre span style color 0000FF Pepe span span Pero si un operador malintencionado escribe como nombre de usuario a consultar span style color 0000FF Alicia span span style color FF0000 DROP TABLE usuarios SELECT FROM datos WHERE nombre LIKE span se generaria la siguiente consulta SQL el color verde es lo que pretende el programador el azul es el dato y el rojo el codigo SQL inyectado SELECT FROM usuarios WHERE nombre Alicia DROP TABLE usuarios SELECT FROM datos WHERE nombre LIKE En la base de datos se ejecutaria la consulta en el orden dado se seleccionarian todos los registros con el nombre Alicia se borraria la tabla usuarios y finalmente se seleccionaria toda la tabla datos que no deberia estar disponible para los usuarios web comunes En resumen cualquier dato de la base de datos puede quedar disponible para ser leido o modificado por un usuario malintencionado Notese por que se llama Inyeccion SQL Si se observa el codigo malicioso de color rojo se notara que esta insertado en el medio del codigo bueno el verde Asi el codigo rojo ha sido inyectado dentro del verde La inyeccion SQL es facil de evitar por parte del programador en la mayoria de los lenguajes de programacion que permiten desarrollar aplicaciones web En la siguiente seccion se trata brevemente ese tema Blind SQL injection Editar Ataque a ciegas por inyeccion SQL en ingles Blind SQL injection es una funcion y una tecnica de ataque que utiliza la inyeccion SQL Se evidencia cuando en una pagina web por un fallo de seguridad no se muestran mensajes de error al no producirse resultados correctos ante una consulta a la base de datos mostrandose siempre el mismo contenido es decir solo hay respuesta si el resultado es correcto Sentencias condicionales con el tipo Or 1 1 o having 1 1 ofrecen respuestas siempre correctas true o verdadero por lo cual suelen ser usadas por los programadores como formas de comprobacion El problema para la seguridad de la pagina radica en que esta tecnica es utilizada en combinacion con diccionarios o fuerza bruta para la busqueda caracter por caracter de una contrasena un nombre de usuario un numero de telefono o cualquier otra informacion que albergue la base de datos atacada para ello se utiliza codigo SQL especifico que va probando cada caracter consiguiendo un resultado positivo acumulable cuando hay una coincidencia De esta manera se puede saber por ejemplo que una contrasena comienza por F luego continua con i y luego r etc acumula Fir hasta dar con la palabra completa Existen programas que automatizan este proceso de tanteos letra por letra en el resultado de la consulta SQL que un intruso podria enviar inyectado Algunas formas de evitar la Inyeccion SQL EditarRuby on Rails Editar En el framework Ruby on Rails RoR las consultas son verificadas automaticamente por cualquiera de los metodos de busqueda incluidos Por ejemplo Project find consulta SELECT FROM usuarios WHERE nombre nombreUsuario o bien Project find all conditions gt name gt params name La unica forma de que un usuario mal intencionado pueda usar una inyeccion de SQL en RoR es que mediante codigo se transforme la variable a tipo string y se utilice como argumento de la busqueda directamente Por ejemplo NO SE DEBERIA HACER ESTO Project find all conditions gt name params name Perl Editar En lenguaje Perl DBI el metodo DBI quote filtra los caracteres especiales asumiendo que la variable sql contiene una referencia a un objeto DBI query sql gt prepare SELECT FROM usuarios WHERE nombre sql gt quote nombre usuario O tambien se puede usar la caracteristica placeholder con comillado automatico como sigue query sql gt prepare SELECT FROM usuario WHERE nombre query gt execute nombre usuario PHP Editar En el lenguaje PHP hay diferentes funciones que pueden servir de ayuda para usar con distintos sistemas de gestion de bases de datos Si se usa MySQL la funcion a usar es mysql real escape string query result mysql query SELECT FROM usuarios WHERE nombre mysql real escape string nombre usuario No obstante es mas recomendado usar alternativas que ofrecen consultas preparadas como la clase PDO statement pdo gt prepare SELECT FROM usuarios WHERE nombre nombre statement gt bindParam nombre nombre usuario statement gt execute result statement gt fetch Y si se utiliza MySQLi Con funciones conexion mysqli connect host usuario clave bdd query mysqli query conexion SELECT FROM usuarios WHERE nombre mysqli real escape string conexion nombre Orientado a objetos heredando la clase query this gt query SELECT FROM usuarios WHERE nombre this gt real escape string nombre Sin heredar la clase query this gt mysqli gt query SELECT FROM usuarios WHERE nombre this gt mysqli gt real escape string nombre donde this gt mysqli es el enlace mysqli a la base de datos Java Editar En lenguaje Java se puede usar la clase PreparedStatementEn lugar de Connection con acquire Connection Statement stmt con createStatement ResultSet rset stmt executeQuery SELECT FROM usuarios WHERE nombre nombreUsuario se puede usar parametrizacion o escape de variables como se indica en los siguientes apartados Parametrizacion de sentencias SQL Editar Connection con acquire Connection PreparedStatement pstmt con prepareStatement SELECT FROM usuarios WHERE nombre pstmt setString 1 nombreUsuario ResultSet rset pstmt executeQuery Escape de las variables a insertar en la sentencia SQL Editar Escapar el texto contenido en la variable remplazando los caracteres especiales en SQL por su equivalente textual de tal forma que SQL interprete todo el contenido de la variable como si fuera texto Connection con acquire Connection Statement stmt con createStatement ResultSet rset stmt executeQuery SELECT FROM usuarios WHERE nombre nombreUsuario replace replace Tambien se puede utilizar el metodo escapeSQL de la clase procedente de la libreria de Apache Commons Lang Connection con acquire Connection Statement stmt con createStatement ResultSet rset stmt executeQuery SELECT FROM usuarios WHERE Nombre StringEscapeUtils escapeSQL NombreUsuario En C Editar En lenguaje C de la plataforma NET o su alternativa libre Mono se tiene ADO NET SqlCommand para Microsoft SQL Server u OracleCommand para servidores de bases de datos Oracle El ejemplo siguiente muestra como prevenir los ataques de inyeccion de codigo usando el objeto SqlCommand El codigo para ADO NET se programa de forma similar aunque puede variar levemente segun la implementacion especifica de cada proveedor En vez de using SqlConnection con acquire connection con Open using SqlCommand cmd new SqlCommand SELECT FROM usuarios WHERE nombre nombreUsuario con using SqlDataReader rdr cmd ExecuteReader se podria usar lo siguiente using SqlConnection con acquire connection con Open using SqlCommand cmd new SqlCommand SELECT FROM usuarios WHERE nombre nombreUsuario con cmd Parameters AddWithValue nombreUsuario nombreUsuario using SqlDataReader rdr cmd ExecuteReader Vease tambien EditarSQL Base de datos Modelo de base de datos Base de datos relacional Inseguridad informaticaEnlaces externos EditarReferencia para Inyeccion SQL por Roberto Salgado en ingles Tecnicas de ataque en servidores web con scripts via inyeccion SQL en ingles Articulo Ataques a servidores SQL Hacking Cracking y Tecnicas de proteccion escrito por Seth Fogie y Cyrus Peikari en ingles Articulo Inyeccion SQL y Oracle Parte uno escrito por Pete Finnigan en ingles Articulo Ataques de inyeccion SQL Estas a salvo escrito por Mitchell Harper en ingles Articulo Protegiendose frente a la inyeccion SQL escrito por Umachandar Jayachandran en ingles Articulo Deten los ataques de Inyeccion SQL antes de que ellos te detengan a ti escrito por Paul Litwin en ingles Proteccion contra los ataques de inyeccion en ingles Tutorial basico de la inyeccion SQL en ingles SQLrand Previniendo los ataques de Inyeccion SQL escrito por Stephen W Boyd y Angelos D Keromytis en ingles Que es la Inyeccion SQL escrito por CGISecurity com en ingles Inyeccion de codigo SQL Excelente articulo resumido y completo escrito por Juan Martinez Llinas en espanol Articulo Inyeccion de codigo SQL en MS SQL Server 2005 Pdf Ejemplo y pasos a seguir para explotar un SQL SERVER 2005 Articulo Automatizacion de inyeccion SQL con PANGOLIN Uso de herramientas graficas para realizar tareas Articulo Automatizacion de inyeccion SQL con SQLiHelper Uso de herramientas graficas para realizar tareas bsqlbf pl programa escrito por un espanol en lenguaje Perl Video de demostracion de ataque BLIND SQL INJECTION mediante bsqlbf pl Video Enumerando DB con una Blind Sql Injection Datos Q506059Obtenido de https es wikipedia org w index php title Inyeccion SQL amp oldid 136235412, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos