Ataques por inyección de código en URL

¿Quién no está sufriendo últimamente ataques de Inyección de SQL en URL?

Si te ha pasado como a mí, que tienes desarrollos antiguos en ASP contra SQL Server, y has sufrido alguna inyección del tipo: http://www.mitxatxidominio.com/mipaginitamalprogramada.asp?miparam=23;DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C41524520405420564152434…txurro que te crio. Y si encima has tenido la mala suerte de no hacer un cast del request con cint y te la han colao ….., te habrás encontrado con código basura en todos los campos de texto de la base de datos.

Para limpiar la “mierda” de tu servidor, este es el procedimiento almacenado que he utilizado (es un procedimiento para realizar sustituciones de cadenas en todos los campos de texto de todas las tablas de tu BD) (USALO CON PRECAUCIÓN, Y RECETA MÉDICA):

CREATE PROC SearchAndReplace
(
@SearchStr nvarchar(100),
@ReplaceStr nvarchar(100)
)
AS
BEGIN

— Copyright 2002 Narayana Vyas Kondreddi. All rights reserved.
— Purpose: To search all columns of all tables for a given search string and replace it with another string
— Written by: Narayana Vyas Kondreddi
— Modificación: Juan Carlos Febrer
— Site: http://vyaskn.tripod.com
— Tested on: SQL Server 7.0 and SQL Server 2000 and SQL Server 2005
— Date modified: 2nd November 2002 13:50 GMT 

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110), @SQL nvarchar(4000), @RCTR int
SET @TableName = ”
SET @SearchStr2 = QUOTENAME(‘%’ + @SearchStr + ‘%’,””)
SET @RCTR = 0

WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ”
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + ‘.’ + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = ‘BASE TABLE’
AND QUOTENAME(TABLE_SCHEMA) + ‘.’ + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + ‘.’ + QUOTENAME(TABLE_NAME)
), ‘IsMSShipped’
) = 0
)

WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN (‘char’, ‘varchar’, ‘nchar’, ‘nvarchar’, ‘ntext’, ‘text’)
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)

IF @ColumnName IS NOT NULL
BEGIN
SET @SQL= ‘UPDATE ‘ + @TableName +
‘ SET ‘ + @ColumnName
+ ‘ = REPLACE(cast(‘ + @ColumnName + ‘ as varchar(8000)), ‘
+ QUOTENAME(@SearchStr, ””) + ‘, ‘ + QUOTENAME(@ReplaceStr, ””) +
‘) WHERE ‘ + @ColumnName + ‘ LIKE ‘ + @SearchStr2
EXEC (@SQL)
SET @RCTR = @RCTR + @@ROWCOUNT
END
END
END

SELECT ‘Replaced ‘ + CAST(@RCTR AS varchar) + ‘ occurence(s)’ AS ‘Outcome’
END

 

Esta es una versión modificada de la realizada por Narayana Vyas Kondreddi que permite buscar y sustituir también en los campos “ntext” y “text” (memo).

Si deseas más información sobre este tipo de ataques, te recomiendo:

-Técnicas avanzadas en ataques Blind SQL Inyección (Chema Alonso)
-Protegerse de las inyecciones SQL por URL (Rodrigo Corral)
-Gustavo Velez (SkunkWorks)

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: