Sei sulla pagina 1di 7

Inyeccin SQL

1
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
2
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.
Blind SQL injection
Ataque a ciegas por inyeccin SQL, en ingls, Blind SQL injection, es una tcnica de ataque que utiliza la
inyeccin SQL. Se evidencia cuando en una pgina web, por una falla de seguridad, no se muestran mensajes de
error al no producirse resultados correctos ante una consulta a la base de datos, mostrndose 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 comprobacin. El problema para la
seguridad de la pgina radica en que esta tcnica es utilizada en combinacin con diccionarios o fuerza bruta para la
bsqueda, carcter por carcter, de una contrasea, un nombre de usuario, un nmero de telfono o cualquier otra
informacin que albergue la base de datos atacada; para ello se utiliza cdigo SQL especfico que "va probando"
cada carcter consiguiendo un resultado positivo acumulable cuando hay una coincidencia. De esta manera se puede
saber, por ejemplo, que una contrasea comienza por "F...", luego contina 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 podra enviar inyectado.
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]}'")

Inyeccin SQL
3
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);

PHP
En el lenguaje PHP, hay diferentes funciones que pueden servir de ayuda para usar con distintos sistemas de gestin
de bases de datos.
Si se usa 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) . "\"");

No obstante es ms 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 hererdar 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 */
Inyeccin SQL
4
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
[1]
de la clase StringEscapeUtils
[2]
procedente de la librera de
Apache Commons Lang
[3]
Connection con = (acquire Connection)
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE
nombre = '" + StringEscapeUtils.escapeSQL(nombreUsuario) + "';");

Inyeccin SQL
5
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() ){
...
}
}
}
Enlaces externos
Referencia para Inyeccin SQL
[4]
por Roberto Salgado (en ingls)
Tcnicas de ataque en servidores web con scripts va inyeccin SQL
[5]
(en ingls)
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)
Inyeccin SQL
6
"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.
bsqlbf.pl
[20]
: programa escrito por un espaol en lenguaje Perl.
Video de demostracin de ataque BLIND SQL INJECTION mediante bsqlbf.pl
[21]
Video-Enumerando DB con una Blind Sql Injection
[22]
Tutorial sobre cmo funciona el ataque SQL Injection escrito en solvetic.com
[23]
Referencias
[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. websec. ca/ kb/ sql_injection
[5] http:/ / www. derkeiler.com/ Mailing-Lists/ securityfocus/ secprog/ 2001-07/ 0001. html
[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
[20] http:/ / web.archive. org/ web/ http:/ / www. unsec. net/ download/ bsqlbf. pl
[21] http:/ / web.archive. org/ web/ http:/ / www. unsec. net/ download/ bsqlbf. avi
[22] http:/ / web.archive. org/ web/ http:/ / p1mp4m. es/ videos/ blindsqlinjection-codebit/
[23] http:/ / www.solvetic. com/ tutorials/ article/ 280-como-funciona-el-ataque-sql-injection/
Fuentes y contribuyentes del artculo
7
Fuentes y contribuyentes del artculo
Inyeccin SQL Fuente: http://es.wikipedia.org/w/index.php?oldid=74294994 Contribuyentes: Acaele, Ajesusflores, Alexav8, Andreasmperu, Automotores777, Balles2601, Banfield, Bngs,
Caos, Cinabrium, Daemon21, DeDMoNeY35, Diegusjaimes, Dodo, Ecoal95, Elwikipedista, Enric Naval, Ezarate, FedericoMP, Filipo, GermanX, Gibon, Humberto, Isha, Jfwiki, Jkbw, JorgeGG,
Jugones55, Lucien leGrey, Luis junco, Magomaitin, Martin paliza, Matdrodes, Mnln, Murphy era un optimista, Pilaf, Pjoaquin, Plux, Raulshc, Reinaldo irrazabal, Santiperez, Savh, SergioN,
Sirdarckcat, Solvetic, Soriasoft, Superzerocool, Vasi, Waeswaes, Waka Waka, Yrithinnd, Zerquix18, 121 ediciones annimas
Licencia
Creative Commons Attribution-Share Alike 3.0
//creativecommons.org/licenses/by-sa/3.0/

Potrebbero piacerti anche