SQL - usando concatenación de cadenas, ¿cómo puedo explotar este procedimiento?

2

Tengo un procedimiento almacenado simple:

create procedure [dbo].[test]
@str varchar (100)
AS
BEGIN
select * from [AdventureWorks2012].[HumanResources].[Employee] where JobTitle like '%' + @str +'%'
END
GO

Dado este tipo de código, ¿de qué manera puedo explotarlo?

Siempre me han dicho que las hazañas del tipo

exec test ''' ''; truncate table [AdventureWorks2012].[HumanResources].[Employee];--'

Debería funcionar, pero ahora es la primera vez que tengo la oportunidad de probarlo de manera práctica y no funciona.

La explicación que me dieron fue que

''' ''; truncate table [AdventureWorks2012].[HumanResources].[Employee];--'

Cuando se concatena con la consulta se convierte en

select * from [AdventureWorks2012].[HumanResources].[Employee] where JobTitle like '%' + ' ' ; truncate table [AdventureWorks2012].[HumanResources].[Employee];-- + '%'

Por lo tanto, la consulta SELECT se ejecutará con jobtitle buscando cualquier carácter seguido de un espacio. El ; termina la condición donde y luego se ejecuta la instrucción de tabla truncada. ¿A dónde me voy mal? Estoy usando Microsoft SQL Server 2012.

    
pregunta Akash 06.12.2012 - 06:28
fuente

3 respuestas

5
  

donde JobTitle le gusta '%' + @str + '%'

Esto no es una vulnerabilidad de inyección SQL. No está inyectando contenido en la consulta desde un nivel de control más alto, como una cadena EXEC o una llamada de C #.

Aquí hay un error de inyección, sin embargo, no es una inyección SQL. La concatenación que se está haciendo es un término de búsqueda en un patrón de consulta LIKE . Los metacaracteres en los patrones de LIKE son % , _ y, en SQL Server, [ (no estándar ANSI).

El resultado de esto es que si alguien realiza una búsqueda, por ejemplo, 50% , obtendrá resultados que contienen la subcadena 50 y no solo los que contienen 50% . El uso de [ también puede dar como resultado un error de sintaxis. Eso es indeseable, pero no permite ninguno de los ataques de seguridad tradicionales que hacen las inyecciones de SQL.

Para corregir las inyecciones de LIKE, necesita nominar un carácter personalizado de LIKE-escape y usarlo para reemplazar cualquier metacarácter de LIKE, por ejemplo:

SET @liketerm = REPLACE(REPLACE(REPLACE(REPLACE(@str, '!', '!!'), '%', '!%'), '_', '!_'), '[', '![');

... WHERE jobtitle LIKE '%'+@liketerm+'%' ESCAPE '!';
    
respondido por el bobince 06.12.2012 - 11:19
fuente
3

Solo para aclarar la respuesta de @ bobince (acepte su respuesta, ¡no la mía!), esto no es un problema de inyección de SQL porque la declaración no se construye de forma dinámica usando su variable @str. pasó a una declaración estática.

Si el procedimiento lee en su lugar:

BEGIN
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = 'select * from [AdventureWorks2012].[HumanResources].[Employee] where JobTitle like ''%' + @str + '%''';
    EXEC @sql;
END

... estaría abierto a una inyección usando términos similares a los que escribió anteriormente. Por lo general, este tipo de construcciones tienden a ocurrir en la capa de la aplicación, como una aplicación PHP o ASP (que no las selecciona):

// NON-LANGUAGE-SPECIFIC PSEUDO CODE
var searchTerm = Request.Form("searchField");
var sql "select * from [AdventureWorks2012].[HumanResources].[Employee] where JobTitle like '%" & searchTerm & "%'";
var results = db.execute(sql);

Un lugar común donde se ve este código es en los procedimientos de búsqueda en varios campos, donde el usuario puede proporcionar una serie de valores y cada valor se compara con un campo diferente o requiere una combinación diferente. El SQL se construye para agregar solo aquellas cláusulas WHERE o JOIN cuando se da un término (lo que puede puede proporcionar una consulta más eficaz). Debe tener un cuidado considerable para sanear adecuadamente sus comentarios si necesita hacer esto en su aplicación.

    
respondido por el jimbobmcgee 06.12.2012 - 17:40
fuente
0

Las entradas que estás dando no funcionarán.

Primero deberá cerrar el carácter '%' y luego agregar la consulta. Su consulta final debe ser:

donde JobTitle tiene gusto de '% str%'; consultar para agregar - '

Espero que esto ayude.

    
respondido por el Anuj sharma 06.12.2012 - 07:08
fuente

Lea otras preguntas en las etiquetas