Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rd111072

[Resolvido] SQL Injection - função

Recommended Posts

Bom dia rapaziada.

 

Bom, tenho uma função que peguei na net, que gostaria de usar como include em todas as páginas que recebam valores através de request.

 

Está funcionando, porém é case sensitive, ou seja se eu escrevo SQL ele pega. Se eu escrevo select ele pega. Mas se eu escrevo SeLecT, por exemplo, ele deixa passar.

 

Quer dizer tem que estar escrito exatamente como na varável hack (v. código abaixo):

 

<%

'############################################ FUNÇÃO ANT SQL INJECTION E CROSS SCRIPTING
'via formulários #######################################################
hack = Array("'or'", "'OR'", ") or (", ") OR (", "' or '", "xp_", "delet", "DELET" , "DEL" , "del" , "select", "SELECT", "having", "union", "' OR '", "<", ">", "(", ")", "#", "&", "--", "or 1", "OR 1", "ftp", "FTP", "drop", "DROP", "SQL", "sql", "insert", "INSERT" )
msghack= "Olá "& Request.ServerVariables("REMOTE_ADDR")&", detectamos o uso de código hacker em sua ação, estamos monitorando seu acesso!"

For each campo in request.form
for intVer = LBound(hack) to UBound(hack)
if InStr(request.form(campo),hack(intVer)) > 0 then
response.write(msghack)
response.end
end if
next
next


'via querystring #######################################################
For each campo in request.querystring
for intVer = LBound(hack) to UBound(hack)
if InStr(request.querystring(campo),hack(intVer)) > 0 then
response.write(msghack)
response.end
end if
next
next


'############################################ FUNÇÃO ANT SQL INJECTION 
%>

Alguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É só antes de verificar, você usar lCase na variável. Se for uma variável que será utilizada em outra parte do código, você cria uma variável temp e armazena o valor dela usando lCase para a verificação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ex.:

if InStr(lcase(request.querystring(campo)),lcase(hack(intVer))) > 0 then

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou beleza.

Obrigado.

 

Agora. Como faço, para ao invés da mensagem (msghack) , esse script pegar os valores "maliciosos" e substituir por nada?

 

Acho que aí ficaria perfeito. A não ser que existam outras formas de "injetar" num site...

Compartilhar este post


Link para o post
Compartilhar em outros sites

só um complemento, no lugar do lCase pode ser usada um atributo do instr ficando desta forma

 

if InStr(1, request.querystring(campo), hack(intVer), 1) > 0 then

 

ou

 

if InStr(1, request.querystring(campo), hack(intVer), vbTextCompare) > 0 then

 

Eu utilizo essa função que criei, é simples mas funciona:

Function blockInjection(entrada, tipo)
	Dim i
	Dim palavra
	Dim retorno : retorno = False	
	entrada = Trim(entrada&"")
	Select Case tipo
		Case "N"
			If isNumeric(entrada) Then
				retorno = True
			End If
		Case "D"
			If isDate(entrada) Then
				retorno = True
			End If
		Case Else '"S"
			retorno = True
			If entrada <> "" Then
				entrada = Replace(entrada & "", "</script>", "< /script>" )
				Dim arrayReservado : arrayReservado = Array(_
					"""", _
					"UPDATE", _
					"SELECT", _
					"INSERT", _
					"DELETE", _
					"DROP", _
					"XTYPE", _
					"EXEC", _
					"VARCHAR", _
					"DECLARE", _
					"'", _
					"EXECUTE", _
					"XP_", _
					"FROM", _
					"NULL", _
					"SET", _
					"CAST", _
					"CONVERT", _
					"DATABASE", _
					"TABLE", _
					"WHERE", _
					"--" _
					)
				For i = 0 To uBound(arrayReservado)
					palavra = 1
					While palavra <> 0
						palavra = inStr(1, entrada, arrayReservado(i), vbTextCompare)
						If palavra <> 0 Then
						 entrada = Left(entrada, palavra - 1) & "" & Asc(Mid(entrada, palavra, 1)) & ";" & Right(entrada, Len(entrada) - palavra)
						End If
					Wend
				Next
			End If
	End Select
	If retorno = False Then
		Response.Write "Tipo de Entrada inválida"
		Response.End()
	End If
	blockInjection = entrada
End Function

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jonathan,

 

obrigado, por suas observações.

 

Imagino que sua função também dê pra usar como include, sendo chamada nos request...

 

Fora isso, já ouvi que é pssível dar SQL Injection através da barra de endereços. É verdade? Como faço para impedir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É possível sim... o usuário pode usar os parâmetros passados por GET. Você não precisa fazer nada. Somente validar os dados recebidos pelo REQUEST, independente se estão vindo de formulários ou links.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, moçada

 

ficou assim no final:

 

FORM

<form action="ant_request.asp" method="post">
<input name="usuario" type="text">
<input name="senha" type="text">
<input name="enviar" type="submit" value="enviar">
</form>

REQUEST

<!--#include file="ant_function.asp" -->

<%
 usuario = Replace(Request("usuario"), intVer, "")
 senha = Replace(Request("senha"), intVer, "")
response.redirect "ant_end_form.asp?usuario="&usuario& "&senha="&senha
%>

FUNÇÃO/INCLUDE

<%
hack="UPDATE,SELECT,INSERT,DELETE,DROP,XTYPE,EXEC,VARCHAR,DECLARE,',EXECUTE,XP_,FROM,NULL,SET,CAST,CONVERT,DATABASE,TABLE,WHERE,--,',"",@,/,\,#,$,%,¨,&,*,(,),-,+,=,<,>,?,DELET,SQL,OR,OR1,HAVING,UNION,&LT,&GT,FTP,;"
hack =Split(hack,",")


For each campo in request.form
for intVer = LBound(hack) to UBound(hack)
if InStr(ucase(request.form(campo)),ucase(hack(intVer))) > 0 then
response.write("<script>location = 'ant_form.asp';alert('Entrada de dados inválida!')</script>")
response.end
end if
next
next

%>

No entanto, o ideal seria substituir o alert por um replace seguido de um redirect, com os valores já corrigidos.

Vou tentar daqui e fico no aguardo, se alguém conseguir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a função que postei faz o que você necessita e pode usar ela no request. Caso queira tratar em todas as entradas basta colocar todos os tipos como "S" de String

 

nome = blockinjection(request("nome"), "S")

Compartilhar este post


Link para o post
Compartilhar em outros sites

To revivendo esse post pois estou com um problema serio sobre esse assunto. jonathandj será que você poderia me dar uam ajuda?

Estou usando um código similar ao seu para evitar as injeções sql, porem esse código está gerando uma sobrecarga no servidor da locaweb derrubando o servidor. Ele faz um loop grande e com isso consome muito processamento do CPU.

 

Segue o código

  Function BlockInjection(entrada)
	  Dim i
	  Dim palavra
	  Dim arrayReservado : arrayReservado = Array(_
		  "UPDATE", _
		  "SELECT", _
		  "INSERT", _
		  "DELETE", _
		  "DROP", _
		  "XTYPE", _
		  "EXEC", _
		  "VARCHAR", _
		  "DECLARE", _
		  "'", _
		  "EXECUTE", _
		  "XP_", _
		  "FROM", _
		  "NULL", _
		  "SET", _
		  "CAST", _
		  "CONVERT", _
		  "DATABASE", _
		  "TABLE", _
		  "WHERE", _
		  "--", _
		  "-", _
		  ";", _
		  "--", _
		  "|", _
		  """", _
		  "(", _
		  ")", _
		  "%" _
		  )
	  For i = 0 To uBound(arrayReservado)
		  palavra = 1
		  While palavra <> 0
			  palavra = inStr(1, entrada, arrayReservado(i), vbTextCompare)
			  If palavra <> 0 Then
			   entrada = Left(entrada, palavra - 1) & "" & Asc(Mid(entrada, palavra, 1)) & ";" & Right(entrada, Len(entrada) - palavra)
			  End If
		  Wend
	  Next
	  blockInjection = entrada
  End Function

Você consegue me dar alguma dica de onde pode estar o problema nesse código?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenta assim

 

Function SafeSQL(sInput)
  TempString = sInput
  'sBadChars=array("select", "drop", ";", "--", "insert", "delete", "xp_", "#", "%", "&", "'", "(", ")", "/", "\", ":", ";", "<", ">", "=", "[", "]", "?", "`", "|") 
  sBadChars=array("select", "drop", ";", "--", "insert", "delete", "xp_", "#", "%", "&", "'", "(", ")", ":", ";", "<", ">", "=", "[", "]", "?", "`", "|") 
  For iCounter = 0 to uBound(sBadChars)
    TempString = replace(TempString,sBadChars(iCounter),"")
  Next
  SafeSQL = TempString
End function

Compartilhar este post


Link para o post
Compartilhar em outros sites

xanburzum,

 

voce é o cara! Esse código funcionou perfeito viu.

Vou agora solicitar a locaweb um teste performace para ver se está sobrecarregando o servidor.

 

Posto o resultado assim que der.

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.