Está en la página 1de 6

Inyeccin SQL

Inyeccin SQL
Inyeccin SQL es un mtodo de infiltracin de cdigo intruso que se vale de una vulnerabilidad informtica presente en una aplicacin en el nivel de validacin de las entradas para realizar consultas a una base de datos. El origen de la vulnerabilidad radica en el incorrecto chequeo y/o filtrado de las variables utilizadas en un programa que contiene, o bien genera, cdigo SQL. Es, de hecho, un error de una clase ms general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programacin o script que est embebido dentro de otro. Se conoce como Inyeccin SQL, indistintamente, al tipo de vulnerabilidad, al mtodo de infiltracin, al hecho de incrustar cdigo SQL intruso y a la porcin de cdigo incrustado.

Descripcin
Se dice que existe o se produjo una inyeccin SQL cuando, de alguna manera, se inserta o "inyecta" cdigo SQL invasor dentro del cdigo SQL programado, a fin de alterar el funcionamiento normal del programa y lograr as que se ejecute la porcin de cdigo "invasor" incrustado, en la base de datos. Este tipo de intrusin normalmente es de carcter malicioso, daino o espa, por tanto es un problema de seguridad informtica, y debe ser tomado en cuenta por el programador de la aplicacin 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 intrusin ocurre durante la ejecucin del programa vulnerable, ya sea, en computadores de escritorio o bien en sitios Web, en ste ltimo caso obviamente ejecutndose en el servidor que los aloja. La vulnerabilidad se puede producir automticamente cuando un programa "arma descuidadamente" una sentencia SQL en tiempo de ejecucin, 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 parmetros a ingresar por parte del usuario, a efectos de consultar una base de datos; ya que, justamente, dentro de los parmetros es donde se puede incorporar el cdigo SQL intruso. Al ejecutarse la consulta en la base de datos, el cdigo SQL inyectado tambin se ejecutar y podra hacer un sinnmero de cosas, como insertar registros, modificar o eliminar datos, autorizar accesos e, incluso, ejecutar otro tipo de cdigo malicioso en el computador. Por ejemplo, asumiendo que el siguiente cdigo reside en una aplicacin web y que existe un parmetro "nombreUsuario" que contiene el nombre de usuario a consultar, una inyeccin SQL se podra provocar de la siguiente forma: El cdigo SQL original y vulnerable es: consulta := "SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';" Si el operador escribe un nombre, por ejemplo "Alicia", nada anormal suceder, la aplicacin generara una sentencia SQL similar a la siguiente, que es perfectamente correcta, en donde se seleccionaran todos los registros con el nombre "Alicia" en la base de datos: SELECT * FROM usuarios WHERE nombre = 'Alicia'; Pero si un operador malintencionado escribe como nombre de usuario a consultar: "Alicia'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%" (sin las comillas externas), se generara la siguiente consulta SQL, (el color verde es lo que pretende el programador, el azul es el dato, y el rojo, el cdigo SQL inyectado):

Inyeccin SQL SELECT * FROM usuarios WHERE nombre = 'Alicia'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%'; En la base de datos se ejecutara la consulta en el orden dado, se seleccionaran todos los registros con el nombre 'Alicia', se borrara la tabla 'usuarios' y finalmente se seleccionara toda la tabla "datos", que no debera estar disponible para los usuarios web comunes. En resumen, cualquier dato de la base de datos puede quedar disponible para ser ledo o modificado por un usuario malintencionado. Ntese por qu se llama "Inyeccin" SQL. Si se observa el cdigo malicioso, de color rojo, se notar que est insertado en el medio del cdigo bueno, el verde. As, el cdigo rojo ha sido "inyectado" dentro del verde. La inyeccin SQL es fcil de evitar, por parte del programador, en la mayora de los lenguajes de programacin que permiten desarrollar aplicaciones web. En la siguiente seccin se trata brevemente ese tema.

Algunas formas de evitar la Inyeccin SQL


Ruby on Rails
En el framework Ruby on Rails (RoR), las consultas son verificadas automticamente por cualquiera de los mtodos de bsqueda incluidos. Por ejemplo: Project.find(:all, :conditions => ["name = ?", params[:name]]) # o bien Project.find(:all, :conditions => {:name => params[:name]})

La nica forma de que un usuario mal intencionado pueda usar una inyeccin de SQL en RoR es que mediante cdigo se transforme la variable a tipo string y se utilice como argumento de la bsqueda directamente. Por ejemplo: # NO SE DEBERA HACER ESTO Project.find(:all, :conditions => "name = '#{params[:name]}'")

Perl
En lenguaje Perl DBI, el mtodo 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 tambin se puede usar la caracterstica placeholder (con comillado automtico) como sigue: $query = $sql->prepare("SELECT * FROM usuario WHERE nombre = ?"); $query->execute($nombre_usuario);

Inyeccin SQL

PHP
En el lenguaje PHP, hay diferentes funciones que pueden servir de ayuda para usar con distintos sistemas de gestin de bases de datos. Para MySQL, la funcin a usar es mysql_real_escape_string: $query_result = mysql_query("SELECT * FROM usuarios WHERE nombre = \"" . mysql_real_escape_string($nombre_usuario) . "\"");

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 parametrizacin o escape de variables, como se indica en los siguiente apartados. Parametrizacin 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 reemplazando 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("'", "\\'") + "';");

Tambin se puede utilizar el mtodo escapeSQL Apache Commons Lang [3]

[1]

de la clase StringEscapeUtils

[2]

procedente de la librera de

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

Inyeccin SQL

En C#
En lenguaje C#, de la plataforma .NET (o su alternativa libre Mono), se tiene ADO.NET SqlCommand (para Microsoft SQL Server) o OracleCommand (para servidores de bases de datos Oracle). El ejemplo siguiente muestra cmo prevenir los ataques de inyeccin de cdigo usando el objeto SqlCommand. El cdigo para ADO.NET se programa de forma similar, aunque puede variar levemente segn la implementacin especfica 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 podra 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() ){ ... } } }

Vase tambin
SQL Base de datos Inyeccin de cdigo Blind SQL injection XPATH injection Modelo de base de datos

Inyeccin SQL

Enlaces externos
Tcnicas de ataque en servidores web con scripts va inyeccin SQL [4] (en ingls) "SQL Injection: Un Repaso [5]" Escrito por Hernan Racciatti (en espaol) Artculo "Ataques a servidores SQL: Hacking, Cracking, y Tcnicas de proteccin [6]" escrito por Seth Fogie y Cyrus Peikari (en ingls) Artculo "Inyeccin SQL y Oracle, Parte uno [7]"escrito por Pete Finnigan (en ingls) Artculo "Ataques de inyeccin SQL - Ests a salvo? [8]" escrito por Mitchell Harper (en ingls) Artculo "Protegindose frente a la inyeccin SQL [9]" esrito por Umachandar Jayachandran (en ingls) Artculo "Detn los ataques de Inyeccin SQL antes de que ellos te detengan a ti [10]" escrito por Paul Litwin (en ingls) "Proteccin contra los ataques de inyeccin [11]" (en ingls) "Tutorial bsico de la inyeccin SQL [12]" (en ingls) "SQLrand: Previniendo los ataques de Inyeccin SQL [13]" escrito por Stephen W. Boyd y Angelos D. Keromytis (en ingls) "Qu es la Inyeccin SQL? [14]" escrito por CGISecurity.com (en ingls) "Inyeccin de cdigo SQL: Excelente artculo resumido y completo [15]" escrito por Juan Martnez Llins (en espaol) Artculo "Inyeccin de cdigo SQL en MS SQL Server 2005 [16]" "Pdf [17]" Ejemplo y pasos a seguir para explotar un SQL SERVER 2005 Artculo "Automatizacin de inyeccin SQL con PANGOLIN [18]" Uso de herramientas grficas para realizar tareas. Artculo "Automatizacin de inyeccin SQL con SQLiHelper [19]" Uso de herramientas grficas para realizar tareas.

References
[1] http:/ / commons. apache. org/ lang/ api-2. 4/ org/ apache/ commons/ lang/ StringEscapeUtils. html#escapeSql%28java. lang. String%29 [2] http:/ / commons. apache. org/ lang/ api-2. 4/ org/ apache/ commons/ lang/ StringEscapeUtils. html [3] http:/ / commons. apache. org/ lang/ [4] http:/ / www. derkeiler. com/ Mailing-Lists/ securityfocus/ secprog/ 2001-07/ 0001. html [5] http:/ / www. hernanracciatti. com. ar/ research/ papers/ sqlinjection. pdf [6] http:/ / informit. com/ articles/ article. asp?p=30124& seqNum=3 [7] http:/ / securityfocus. com/ infocus/ 1644 [8] http:/ / www. sitepoint. com/ article/ sql-injection-attacks-safe [9] http:/ / winnetmag. com/ Article/ ArticleID/ 42216/ 42216. html [10] http:/ / msdn. microsoft. com/ msdnmag/ issues/ 04/ 09/ SQLInjection/ [11] http:/ / msdn. microsoft. com/ library/ default. asp?url=/ library/ en-us/ dnsqlmag04/ html/ InjectionProtection. asp [12] http:/ / governmentsecurity. org/ articles/ SQLinjectionBasicTutorial. php [13] http:/ / citeseer. ist. psu. edu/ 641328. html [14] http:/ / www. cgisecurity. com/ questions/ sql. shtml [15] http:/ / campusvirtual. unex. es/ cala/ epistemowikia/ index. php?title=Inyeccin_de_cdigo_SQL [16] http:/ / www. hacktimes. com/ inyecci_n_de_c_digo_sql_en_ms_sql_server_2005_1_6 [17] http:/ / www. hacktimes. com/ files/ Inyeccion-SQL-en-MSSQL-HackTimes. com. pdf [18] http:/ / www. hacktimes. com/ pangolin_automatizaci_n_de_inyecci_n_sql [19] http:/ / www. hacktimes. com/ sqlihelper_2_7_sql_injection

Article Sources and Contributors

Article Sources and Contributors


Inyeccin SQL Source: http://es.wikipedia.org/w/index.php?oldid=56265282 Contributors: Acaele, Ajesusflores, Alexav8, Andreasmperu, Automotores777, Banfield, Caos, Cinabrium, Daemon21, DeDMoNeY35, Diegusjaimes, Dodo, Elwikipedista, Enric Naval, Ezarate, FedericoMP, Filipo, GermanX, Humberto, Isha, Jfwiki, Jkbw, JorgeGG, Jugones55, Lucien leGrey, Luis junco, Magomaitin, Martin paliza, Matdrodes, Mnln, Murphy era un optimista, Pilaf, Plux, Reinaldo irrazabal, Santiperez, SergioN, Sirdarckcat, Soriasoft, Vasi, 101 anonymous edits

Licencia
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/

También podría gustarte