Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Contenido
1. Introducción ................................................................................................................................ 3
1.1 Propósito ................................................................................................................................... 3
1.2 Personal involucrado ........................................................................................................... 3
1.3 Referencias .......................................................................................................................... 3
1.4 Resumen.................................................................................................................................... 4
2. Descripción General .................................................................................................................... 4
2.1 Perspectiva (enfoque) ............................................................................................................... 4
2.2. Funcionalidad. .......................................................................................................................... 4
2.2.1 Vulnerabilidades................................................................................................................. 4
2.2.1.1 Inyección SQL basada en 1=1 ...................................................................................... 5
2.2.1.2 Inyección SQL basado en “=”....................................................................................... 6
2.2.1.3 Inyección SQL basado en sentencias SQL por lotes .................................................... 7
2.2.1.4 Inyección SQL basado en comentarios de contraseña................................................ 7
2.2.1.5 Inyección basada en excepciones ............................................................................... 7
2.3 Soluciones Propuestas ........................................................................................................ 7
2.3.1 Revisión del código para inyección SQL .......................................................................... 8
2.3.2 Truncamiento cuando se usa QUOTENAME (@variable, ']') ........................................... 9
2.3.3 Ajuste de parámetros con QUOTENAME () y REPLACE () ................................................ 9
3. Referencias ................................................................................................................................ 11
Referencias ........................................................................................................................................ 11
3
1. Introducción
La inyección SQL es uno de los principales ataques que vulnera la seguridad que ocurre en la capa
de base de datos de una aplicación y amenaza las aplicaciones web. Los hackers utilizan las
inyecciones SQL para obtener acceso a los datos subyacentes y los derechos para recuperar,
eliminar y modificar la información almacenada, la estructura y a los sistemas de administración de
base de datos (DBMS). Un ataque por inyección SQL puede incrustar un código malicioso en una
aplicación mal diseñada y luego pasar a la base de datos back-end. Los datos maliciosos producen
resultados de consulta en la base de datos o acciones que nunca deberían haberse ejecutado. La
inyección SQL se conoce generalmente como una vector de ataque para sitios web, pero puede ser
usado para atacar a cualquier tipo de base de datos SQL. La idea básica es evitar el nivel de servidor
en la aplicación web para obtener acceso al back-end.
1.1 Propósito
1.3 Referencias
1.4 Resumen
En el mundo actual, la inyección SQL es una seria amenaza de seguridad en Internet para las diversas
aplicaciones web dinámicas que residen en Internet. Estas aplicaciones web realizan muchos
procesos vitales en varias empresas basadas en la web. A medida que aumenta el uso de Internet
para diversos servicios en línea, también aumentan las amenazas a la seguridad presentes en la web.
Existe una necesidad universal para todas las aplicaciones web dinámicas y esta necesidad universal
es la necesidad de almacenar, recuperar o manipular información de una base de datos. La mayoría
de los sistemas que administran las bases de datos y sus requisitos, como Oracle Database y SQL
Server, utilizan SQL como su idioma. Sin embargo, el gran uso de las bases de datos basadas en SQL
lo ha convertido en el centro de atención de los piratas informáticos. Aprovechan las aplicaciones
web mal codificadas para atacar las bases de datos. Introducen una consulta SQL aparente, a través
de una entrada de un usuario no autorizado, en la declaración de consulta legítima. En este
documento, intento presentar una revisión exhaustiva de todos los diferentes tipos de ataques de
inyección de SQL presentes, así como la detección de dichos ataques y las medidas preventivas
utilizadas.
2. Descripción General
La inyección SQL es un vector de ataque contra apps web, es bien conocido, por esa razón es
recomendable que los administradores de bases de datos y los desarrolladores de aplicaciones
tengan en cuenta buenas prácticas de desarrollo y así evitar las inyecciones de SQL y proteger los
datos.
2.2. Funcionalidad.
2.2.1 Vulnerabilidades
5
Cuando se usa SQL para mostrar datos en una página web, es muy común que los
usuarios de la web ingresen sus propios valores de búsqueda. Dado que las sentencias
de SQL son solo de texto, es fácil con un pequeño código cambiar dinámicamente las
sentencias de SQL para proporcionar al usuario los datos seleccionados. La inyección
SQL es una técnica en la que los usuarios malintencionados pueden inyectar
comandos SQL en una declaración SQL, a través de la entrada de la página web. Los
comandos SQL inyectados pueden alterar la declaración SQL y comprometer la
seguridad de una aplicación web.
Considere que el propósito del código era crear una declaración SQL para seleccionar
un usuario, con un ID de usuario determinado. Si no hay nada que impida que un
usuario ingrese una entrada "incorrecta", el usuario puede ingresar una entrada
"inteligente" como esta:
La sentencia SQL es valida y devolvera todas las folas de la tabla “Usuario” ya que la
logica OR 1=1 siempre es verdadera.
6
Como en la anterior esta también siempre va a ser verdadera, acá hay un ejemplo:
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
7
La mayoría de las bases de datos admiten sentencias SQL por medio de lotes (método
de procesamiento de consultas en el que las consultas procesan varias filas a la vez),
estos lotes van separados por punto y coma. Cada columna dentro de un lote se
almacena como un vector en un área de memoria independiente, por lo que el
procesamiento del modo por lotes se basa en vectores.
Username: admin
Password: *****
El usuario puede ingresar sintaxis SQL como (' ' ',' ” ',' –') en usuario y contraseña, esto
puede resultar en una excepción y si no se maneja correctamente, puede ser vista en
la interfaz de usuario y da una idea de la implementación del código.
por ejemplo, las clases y el nombre de la tabla sobre la base de qué el hacker puede
extraer más información sobre la tabla y nombre de las columnas.
Este documento propone varias soluciones viables a los desarrolladores para prevenir los
ataques de inyección de SQL. Como principal defensa para prevenir ataques de inyección
SQL es el uso de procedimientos almacenados parametrizados. Cuando se usan estos
procedimientos almacenados las consultas a la base de datos se hacen con subrutinas y
Hay que revisar el código EXECUTE, EXEC o sp_executesql, Puede usar consultas
similares a las siguientes para ayudarlo a identificar procedimientos que contienen
estas declaraciones Esta consulta verifica 1, 2, 3 o 4 espacios después de las palabras
EXCUTE o EXEC.
@schemaname sysname,
@tablename sysname,
AS
-- Do some operations.
GO
En cada procedimiento almacenado, hay que verificar que todas las variables que se
usan en Transact-SQL dinámico se manejen correctamente. Los datos que provienen
de los parámetros de entrada del procedimiento almacenado o que se leen de una tabla
deben incluirse en QUOTENAME () o REPLACE (). Recuerde que el valor de @variable
que se pasa a QUOTENAME () es de sysname y tiene una longitud máxima de 128
caracteres.
-- Before:
10
+ @au_lname + N'''';
-- After:
+ REPLACE(@au_lname,'''','''''') + N'''';
3. Referencias
Referencias
[5] OWASP, «Testing for SQL Injection (OTG-INPVAL-005),» 26 04 2016. [En línea]. Available:
https://www.owasp.org/index.php/Testing_for_SQL_Injection_%28OTG-INPVAL-
005%29#Alternative_Expression_of_.27or_1_.3D_1.27.
[6] C. R. C. Diaz, «Desarrollo seguro: Principios y buenas practicas,» 1993. [En línea]. Available:
https://www.owasp.org/images/9/93/Desarrollo_Seguro_Principios_y_Buenas_Pr%C3%A1ct
icas..pdf.
[8] C. Michael, «Preventing SQL injection attacks: A network admin's perspective,» 12 2009. [En
línea]. Available: https://searchsecurity.techtarget.com/tip/Preventing-SQL-injection-attacks-
A-network-admins-perspective.
[11 OWASP.org, «OWASP Testing Guide 4.0,» 2019. [En línea]. Available:
] https://www.owasp.org/images/1/19/OTGv4.pdf.
12