Inyección SQL
Inyección SQL es un método de infiltración de código in-
truso que se vale de una vulnerabilidad informática pre-
sente en una aplicación en el nivel de validación de las
entradas para realizar operaciones sobre una base de da-
tos.
El origen de la vulnerabilidad radica en el incorrecto che-
queo y/o filtrado de las variables utilizadas en un progra-
ma que contiene, o bien genera, código SQL. Es, de he-
cho, un error de una clase más general de vulnerabilidades
que puede ocurrir en cualquier lenguaje de programación
o script que esté embebido dentro de 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.
1 Descripción
Se dice que existe o se produjo una inyección SQL cuan-
do, de alguna manera, se inserta o “inyecta” código SQL
invasor dentro del código SQL programado, a fin de al-
terar 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 ma-
licioso, 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 ig-
norancia del problema, podrá resultar ser vulnerable, y la
seguridad del sistema (base de datos) podrá quedar even-
tualmente 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án-
dose en el servidor que los aloja.
La vulnerabilidad se puede producir automáticamen-
te 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 cual-
quier caso, siempre que el programador necesite y haga
uso de parámetros a ingresar por parte del usuario, a efec-
tos 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 “nombreU-
suario” 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 nom-
bre = '" + nombreUsuario + "';"
Si el operador escribe un nombre, por ejemplo “Alicia”,
nada anormal sucederá, la aplicación generaría una sen-
tencia SQL similar a la siguiente, que es perfectamente
correcta, en donde se seleccionarían 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 nom-
bre de usuario a consultar:
“Alicia'; DROP TABLE usuarios; SELECT *
FROM datos WHERE nombre LIKE '%"
(sin las comillas externas), se generaría la siguiente con-
sulta SQL, (el color verde es lo que pretende el programa-
dor, 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 WHE-
RE nombre LIKE '%';
En la base de datos se ejecutaría la consulta en el orden
dado, se seleccionarían todos los registros con el nom-
bre '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 que-
dar disponible para ser leído o modificado por un usuario
malintencionado.
Nótese por qué se llama "Inyección" SQL. Si se obser-
va 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 progra-
mador, en la mayoría de los lenguajes de programación
1
2 3 ALGUNAS FORMAS DE EVITAR LA INYECCIÓN SQL
que permiten desarrollar aplicaciones web. En la siguien-
te sección se trata brevemente ese tema.
2 Blind SQL injection
Ataque a ciegas por inyección SQL, en inglés, Blind
SQL injection, es una técnica de ataque que utiliza la
inyección SQL. Se evidencia cuando en una página web,
por una falla de seguridad, no se muestran mensajes de
error al no producirse resultados correctos ante una con-
sulta 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 verda-
dero) por lo cual suelen ser usadas por los programadores
como formas de comprobación. El problema para la se-
guridad de la página radica en que esta técnica es utiliza-
da 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 pro-
bando” cada carácter consiguiendo un resultado positivo
acumulable cuando hay una coincidencia. De esta manera
se puede saber, por ejemplo, que una contraseña comien-
za 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 “tan-
teos” letra por letra en el resultado de la consulta SQL,
que un intruso podría enviar inyectado.
3 Algunas formas de evitar la In-
yección SQL
3.1 Ruby on Rails
En el framework Ruby on Rails (RoR), las consultas son
verificadas automáticamente por cualquiera de los méto-
dos de búsqueda incluidos. Por ejemplo:
Project.find(:all, :conditions => ["name = ?", pa-
rams[:name]]) # o bien Project.find(:all, :conditions =>
{:name => params[:name]})
La única forma de que un usuario mal intencionado pue-
da 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 ejem-
plo:
# NO SE DEBERÍA HACER ESTO Project.find(:all,
:conditions => “name = '#{params[:name]}'")
3.2 Perl
En lenguaje Perl DBI, el método DBI::quote filtra los ca-
racteres especiales (asumiendo que la variable $sql con-
tiene 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);
3.3 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 = mysq-
li_query($conexion, “SELECT * FROM usuarios WHE-
RE nombre = '" . mysqli_real_escape_string($conexion,
$nombre) . "'"); // Orientado a objetos heredando la cla-
se: $query = $this->query(“SELECT * FROM usuarios
WHERE nombre = '" . $this->real_escape_string( $nom-
bre ) . "'"); // 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 */
3.4 Java
En lenguaje Java, se puede usar la clase PreparedState-
ment
3
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, co-
mo se indica en los siguiente apartados.
3.4.1 Parametrización de sentencias SQL
Connection con = (acquire Connection) PreparedState-
ment pstmt = con.prepareStatement(“SELECT * FROM
usuarios WHERE nombre = ?"); pstmt.setString(1,
nombreUsuario); ResultSet rset = pstmt.executeQuery();
3.4.2 Escape de las variables a insertar en la senten-
cia 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 escapeSQL de la cla-
se StringEscapeUtils procedente de la librería de Apache
Commons Lang
Connection con = (acquire Connection) State-
ment stmt = con.createStatement(); ResultSet
rset = stmt.executeQuery(“SELECT * FROM
usuarios WHERE nombre = '" + StringEscapeU-
tils.escapeSQL(nombreUsuario) + "';");
3.5 En C#
En lenguaje C#, de la plataforma .NET (o su alternati-
va libre Mono), se tiene ADO.NET SqlCommand (pa-
ra Microsoft SQL Server) o OracleCommand (para ser-
vidores de bases de datos Oracle). El ejemplo siguien-
te 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 pue-
de 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 SqlCom-
mand(“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() ){ ... } } }
4 Véase también
• SQL
• Base de datos
• Modelo de base de datos
5 Enlaces externos
• Referencia para Inyección SQL por Roberto Salga-
do (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 "Inyección SQL y Oracle, Parte
uno“escrito por Pete Finnigan (en inglés)
• Artículo "Ataques de inyección SQL - ¿Estás a sal-
vo?" escrito por Mitchell Harper (en inglés)
• Artículo "Protegiéndose frente a la inyección SQL"
esrito por Umachandar Jayachandran (en inglés)
• Artículo "Detén los ataques de Inyección SQL antes
de que ellos te detengan a ti" escrito por Paul Litwin
(en inglés)
• "Protección contra los ataques de inyección" (en in-
glés)
• "Tutorial básico de la inyección SQL" (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 CGISecu-
rity.com (en inglés)
4 5 ENLACES EXTERNOS
• "Inyección de código SQL: Excelente artículo resu-
mido y completo " escrito por Juan Martínez Llinás
(en español)
• Artículo "Inyección de código SQL en MS SQL Ser-
ver 2005" "Pdf" Ejemplo y pasos a seguir para ex-
plotar un SQL SERVER 2005
• Artículo "Automatización de inyección SQL con
PANGOLIN" Uso de herramientas gráficas para
realizar tareas.
• Artículo "Automatización de inyección SQL con
SQLiHelper " Uso de herramientas gráficas para
realizar tareas.
• bsqlbf.pl : programa escrito por un español en len-
guaje Perl.
• Video de demostración de ataque BLIND SQL IN-
JECTION mediante bsqlbf.pl
• Video-Enumerando DB con una Blind Sql Injection
• Tutorial sobre cómo funciona el ataque SQL Injec-
tion escrito en solvetic.com
5
6 Texto e imágenes de origen, colaboradores y licencias
6.1 Texto
• Inyección SQL Fuente: https://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL?oldid=83206568 Colaboradores: JorgeGG, Pilaf, Dodo,
Sms, Elwikipedista, Murphy era un optimista, Enric Naval, Cinabrium, Renabot, Caos, Yrithinnd, Orgullobot~eswiki, RobotQuistnix, Su-
perzerocool, Chobot, Yrbot, Acaele, BOTijo, YurikBot, GermanX, KnightRider, Santiperez, FedericoMP, Eskimbot, Banfield, Sirdarckcat,
Maldoror, Chlewbot, Jfwiki, Filipo, BOTpolicia, CEM-bot, Alexav8, Mnln, Thijs!bot, Daemon21, Isha, Jugones55, Gsrdzl, Luis junco,
Humberto, DeDMoNeY35, Idioma-bot, Pólux, VolkovBot, Matdrodes, Lucien leGrey, Muro Bot, Martin paliza, SieBot, DaBot~eswiki, Gi-
bon~eswiki, PixelBot, Automotores777, Alexbot, Raulshc, SilvonenBot, UA31, SergioN, AVBOT, MastiBot, Ezarate, Diegusjaimes, Vasiľ,
Andreasmperu, Luckas-bot, Bngs, Xqbot, Jkbw, Rubinbot, Magomaitin, Panderine!, Ajesusflores, Reinaldo irrazabal, Soriasoft, Alph Bot,
Waeswaes, Savh, JackieBot, Waka Waka, Manubot, AvocatoBot, MetroBot, Elvisor, Zerquix18, Pjoaquin, Ecoal95, Addbot, Balles2601,
Solvetic, JoseGCheca y Anónimos: 87
6.2 Imágenes
6.3 Licencia de contenido
• Creative Commons Attribution-Share Alike 3.0

Inyección_sql

  • 1.
    Inyección SQL Inyección SQLes un método de infiltración de código in- truso que se vale de una vulnerabilidad informática pre- sente en una aplicación en el nivel de validación de las entradas para realizar operaciones sobre una base de da- tos. El origen de la vulnerabilidad radica en el incorrecto che- queo y/o filtrado de las variables utilizadas en un progra- ma que contiene, o bien genera, código SQL. Es, de he- cho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o script que esté embebido dentro de 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. 1 Descripción Se dice que existe o se produjo una inyección SQL cuan- do, de alguna manera, se inserta o “inyecta” código SQL invasor dentro del código SQL programado, a fin de al- terar 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 ma- licioso, 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 ig- norancia del problema, podrá resultar ser vulnerable, y la seguridad del sistema (base de datos) podrá quedar even- tualmente 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án- dose en el servidor que los aloja. La vulnerabilidad se puede producir automáticamen- te 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 cual- quier caso, siempre que el programador necesite y haga uso de parámetros a ingresar por parte del usuario, a efec- tos 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 “nombreU- suario” 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 nom- bre = '" + nombreUsuario + "';" Si el operador escribe un nombre, por ejemplo “Alicia”, nada anormal sucederá, la aplicación generaría una sen- tencia SQL similar a la siguiente, que es perfectamente correcta, en donde se seleccionarían 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 nom- bre de usuario a consultar: “Alicia'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%" (sin las comillas externas), se generaría la siguiente con- sulta SQL, (el color verde es lo que pretende el programa- dor, 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 WHE- RE nombre LIKE '%'; En la base de datos se ejecutaría la consulta en el orden dado, se seleccionarían todos los registros con el nom- bre '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 que- dar disponible para ser leído o modificado por un usuario malintencionado. Nótese por qué se llama "Inyección" SQL. Si se obser- va 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 progra- mador, en la mayoría de los lenguajes de programación 1
  • 2.
    2 3 ALGUNASFORMAS DE EVITAR LA INYECCIÓN SQL que permiten desarrollar aplicaciones web. En la siguien- te sección se trata brevemente ese tema. 2 Blind SQL injection Ataque a ciegas por inyección SQL, en inglés, Blind SQL injection, es una técnica de ataque que utiliza la inyección SQL. Se evidencia cuando en una página web, por una falla de seguridad, no se muestran mensajes de error al no producirse resultados correctos ante una con- sulta 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 verda- dero) por lo cual suelen ser usadas por los programadores como formas de comprobación. El problema para la se- guridad de la página radica en que esta técnica es utiliza- da 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 pro- bando” cada carácter consiguiendo un resultado positivo acumulable cuando hay una coincidencia. De esta manera se puede saber, por ejemplo, que una contraseña comien- za 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 “tan- teos” letra por letra en el resultado de la consulta SQL, que un intruso podría enviar inyectado. 3 Algunas formas de evitar la In- yección SQL 3.1 Ruby on Rails En el framework Ruby on Rails (RoR), las consultas son verificadas automáticamente por cualquiera de los méto- dos de búsqueda incluidos. Por ejemplo: Project.find(:all, :conditions => ["name = ?", pa- rams[:name]]) # o bien Project.find(:all, :conditions => {:name => params[:name]}) La única forma de que un usuario mal intencionado pue- da 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 ejem- plo: # NO SE DEBERÍA HACER ESTO Project.find(:all, :conditions => “name = '#{params[:name]}'") 3.2 Perl En lenguaje Perl DBI, el método DBI::quote filtra los ca- racteres especiales (asumiendo que la variable $sql con- tiene 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); 3.3 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 = mysq- li_query($conexion, “SELECT * FROM usuarios WHE- RE nombre = '" . mysqli_real_escape_string($conexion, $nombre) . "'"); // Orientado a objetos heredando la cla- se: $query = $this->query(“SELECT * FROM usuarios WHERE nombre = '" . $this->real_escape_string( $nom- bre ) . "'"); // 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 */ 3.4 Java En lenguaje Java, se puede usar la clase PreparedState- ment
  • 3.
    3 En lugar de: Connectioncon = (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, co- mo se indica en los siguiente apartados. 3.4.1 Parametrización de sentencias SQL Connection con = (acquire Connection) PreparedState- ment pstmt = con.prepareStatement(“SELECT * FROM usuarios WHERE nombre = ?"); pstmt.setString(1, nombreUsuario); ResultSet rset = pstmt.executeQuery(); 3.4.2 Escape de las variables a insertar en la senten- cia 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 escapeSQL de la cla- se StringEscapeUtils procedente de la librería de Apache Commons Lang Connection con = (acquire Connection) State- ment stmt = con.createStatement(); ResultSet rset = stmt.executeQuery(“SELECT * FROM usuarios WHERE nombre = '" + StringEscapeU- tils.escapeSQL(nombreUsuario) + "';"); 3.5 En C# En lenguaje C#, de la plataforma .NET (o su alternati- va libre Mono), se tiene ADO.NET SqlCommand (pa- ra Microsoft SQL Server) o OracleCommand (para ser- vidores de bases de datos Oracle). El ejemplo siguien- te 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 pue- de 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 SqlCom- mand(“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() ){ ... } } } 4 Véase también • SQL • Base de datos • Modelo de base de datos 5 Enlaces externos • Referencia para Inyección SQL por Roberto Salga- do (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 "Inyección SQL y Oracle, Parte uno“escrito por Pete Finnigan (en inglés) • Artículo "Ataques de inyección SQL - ¿Estás a sal- vo?" escrito por Mitchell Harper (en inglés) • Artículo "Protegiéndose frente a la inyección SQL" esrito por Umachandar Jayachandran (en inglés) • Artículo "Detén los ataques de Inyección SQL antes de que ellos te detengan a ti" escrito por Paul Litwin (en inglés) • "Protección contra los ataques de inyección" (en in- glés) • "Tutorial básico de la inyección SQL" (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 CGISecu- rity.com (en inglés)
  • 4.
    4 5 ENLACESEXTERNOS • "Inyección de código SQL: Excelente artículo resu- mido y completo " escrito por Juan Martínez Llinás (en español) • Artículo "Inyección de código SQL en MS SQL Ser- ver 2005" "Pdf" Ejemplo y pasos a seguir para ex- plotar un SQL SERVER 2005 • Artículo "Automatización de inyección SQL con PANGOLIN" Uso de herramientas gráficas para realizar tareas. • Artículo "Automatización de inyección SQL con SQLiHelper " Uso de herramientas gráficas para realizar tareas. • bsqlbf.pl : programa escrito por un español en len- guaje Perl. • Video de demostración de ataque BLIND SQL IN- JECTION mediante bsqlbf.pl • Video-Enumerando DB con una Blind Sql Injection • Tutorial sobre cómo funciona el ataque SQL Injec- tion escrito en solvetic.com
  • 5.
    5 6 Texto eimágenes de origen, colaboradores y licencias 6.1 Texto • Inyección SQL Fuente: https://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL?oldid=83206568 Colaboradores: JorgeGG, Pilaf, Dodo, Sms, Elwikipedista, Murphy era un optimista, Enric Naval, Cinabrium, Renabot, Caos, Yrithinnd, Orgullobot~eswiki, RobotQuistnix, Su- perzerocool, Chobot, Yrbot, Acaele, BOTijo, YurikBot, GermanX, KnightRider, Santiperez, FedericoMP, Eskimbot, Banfield, Sirdarckcat, Maldoror, Chlewbot, Jfwiki, Filipo, BOTpolicia, CEM-bot, Alexav8, Mnln, Thijs!bot, Daemon21, Isha, Jugones55, Gsrdzl, Luis junco, Humberto, DeDMoNeY35, Idioma-bot, Pólux, VolkovBot, Matdrodes, Lucien leGrey, Muro Bot, Martin paliza, SieBot, DaBot~eswiki, Gi- bon~eswiki, PixelBot, Automotores777, Alexbot, Raulshc, SilvonenBot, UA31, SergioN, AVBOT, MastiBot, Ezarate, Diegusjaimes, Vasiľ, Andreasmperu, Luckas-bot, Bngs, Xqbot, Jkbw, Rubinbot, Magomaitin, Panderine!, Ajesusflores, Reinaldo irrazabal, Soriasoft, Alph Bot, Waeswaes, Savh, JackieBot, Waka Waka, Manubot, AvocatoBot, MetroBot, Elvisor, Zerquix18, Pjoaquin, Ecoal95, Addbot, Balles2601, Solvetic, JoseGCheca y Anónimos: 87 6.2 Imágenes 6.3 Licencia de contenido • Creative Commons Attribution-Share Alike 3.0