Ir para conteúdo

POWERED BY:

Arquivado

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

gbs

Há Vulnerabilidade?

Recommended Posts

Pessoal,

 

Estou fazendo um site que possui "milhões" de formulários e páginas, e só de pensar em alterar página por página, textbox por textbox para protegê-lo contra SQL Injection já dava vontade de chorar. http://forum.imasters.com.br/public/style_emoticons/default/natal_biggrin.gif

 

Pensando nisso andei dando uma pesquisada por aí e tentei criar um include que protegesse todas as páginas do meu site contra SQL Injection.

 

Acho que cheguei a algum lugar.

 

Desenvolvi o seguinte código:

 

<%
'Tendo como expressões proibidas: select drop insert delete update where xp_ -- ' `;

'Defino as configurações regionais para Brasil
session.LCID = 1046

'Crio a Função
Function FuncProtect(sInput) 
Dim VetBad, i 
BooIlegal=False
'Defino todas as expressões proibidas 
VetBad=array("select", "drop", "insert", "delete", "update", "where", "xp_", "--", CHR(39), CHR(96), CHR(59)) 
	For i = 0 to uBound(VetBad) 
	  If Instr(lcase(sInput),VetBad(i))>0 Then
		FuncProtect=True
	  End If
	Next 
End function
'Finalizo a Função

'Pego todas as possíveis querystring's da página
URLSor = request.ServerVariables("QUERY_STRING")
'Pego as expressões que são substituidas por outras e substituo elas por delete para que sejam identificadas
URLS = URLSor
URLS = CStr(Replace(URLS,"%60","delete"))

'Pego todos os possíveis formulários da página
FORMULARIOSor = Request.Form
'Pego as expressões que são substituidas por outras e substituo elas por delete para que sejam identificadas
FORMULARIOS = FORMULARIOSor
FORMULARIOS = CStr(Replace(FORMULARIOS,"%27","delete"))
FORMULARIOS = CStr(Replace(FORMULARIOS,"%60","delete"))
FORMULARIOS = CStr(Replace(FORMULARIOS,"%3B","delete"))

'Verifico se há algo proibido nas variáveis
If FuncProtect(URLS)=True OR FuncProtect(FORMULARIOS)=True Then
	'Defino para qual página o usuário será redirecionado caso seja encontrado algo de errado nas variáveis 
	Response.Redirect("../protect/index.asp")
'Caso esteja tudo certo, o usuário continua navegando normalmente.
End If
%>

Achei mais conveniente redirecionar para uma página do que substituir por outros caracteres para evitar causar algum erro na página.

 

Aí coloco um include no topo de todas as páginas e teoricamente pronto. http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Até onde testei funcionou perfeitamente.

 

Alguém vê alguma possível falha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

alguns caracteres não precisam ser bloqueados

por exemplo

 

";", "<", ">", "[", "]", "?",

 

 

a interrogação é utilizada em frases interrogativas

 

se por acaso precisar incluir uma pergunta

 

" INSERT INTO table VALUES(' o que ? ') "

 

 

 

obs. proteja-se tb contra inserção no formato ASC

Compartilhar este post


Link para o post
Compartilhar em outros sites

alguns caracteres não precisam ser bloqueados

por exemplo

 

";", "<", ">", "[", "]", "?",

 

 

a interrogação é utilizada em frases interrogativas

 

se por acaso precisar incluir uma pergunta

 

" INSERT INTO table VALUES(' o que ? ') "

 

 

 

obs. proteja-se tb contra inserção no formato ASC

 

OK.

 

Bloqueando então: select drop insert delete update where xp_ -- ' `;

 

Tudo certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum... nao .

 

você deve entender muito bem de SQL pra poder desenvolver uma função anti-SQL injection.

 

sugiro que procure funções já prontas. existem diversas funções prontas em sites de scripts avançados.

 

 

ou se preferir desenvolver uma função propria estude bastante o SQL e principalmente as vulnerabilidades e funções avançadas do SQL SERVER,

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum... nao .

 

você deve entender muito bem de SQL pra poder desenvolver uma função anti-SQL injection.

 

sugiro que procure funções já prontas. existem diversas funções prontas em sites de scripts avançados.

 

 

ou se preferir desenvolver uma função propria estude bastante o SQL e principalmente as vulnerabilidades e funções avançadas do SQL SERVER,

 

OK, vou estudar mais a respeito então.

 

Obrigado por enquanto!

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum... nao .

 

você deve entender muito bem de SQL pra poder desenvolver uma função anti-SQL injection.

 

sugiro que procure funções já prontas. existem diversas funções prontas em sites de scripts avançados.

 

 

ou se preferir desenvolver uma função propria estude bastante o SQL e principalmente as vulnerabilidades e funções avançadas do SQL SERVER,

 

OK, vou estudar mais a respeito então.

 

Obrigado por enquanto!

 

 

e ai pessoal achei o topico interesante, mas num entendi nada podem me explicar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostaria de compartilhar uma informação sobre uso da Session.LCID.

Eu li no código do autor do tópico e não sabia direito para o quê servia, então depois de pesquisar achei: http://lib.seven.com.br/ampliar.asp?codcat...p;codartigo=757

E nessa página tem um anexo com os códigos de todos os países: http://lib.seven.com.br/arquivos/757/lcid.htm

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostaria de compartilhar uma informação sobre uso da Session.LCID.

Eu li no código do autor do tópico e não sabia direito para o quê servia, então depois de pesquisar achei: http://lib.seven.com.br/ampliar.asp?codcat...p;codartigo=757

E nessa página tem um anexo com os códigos de todos os países: http://lib.seven.com.br/arquivos/757/lcid.htm

 

Abraço.

Mas o que o lcid tem a ver com sql injection?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nada a ver com o injection.

Eu como mais ou menos iniciante não conhecia o comando Session.LCID e resolvi postar mais sobre ele pra quem também não conhece e de repente possa ter ficado curioso.

 

Sobre o SQL Injection eu uso essa função:

<%
'previnindo SQL Injection
function limpalogin(str)
str = trim(str)
str = lcase(str)
str = replace(str,"=","")
str = replace(str,"'","")
str = replace(str,"""""","")
str = replace(str," or ","")
str = replace(str," and ","")
str = replace(str,"(","")
str = replace(str,")","")
str = replace(str,"<","[")
str = replace(str,">","]")
str = replace(str,"update","")
str = replace(str,"-shutdown","")
str = replace(str,"--","")
str = replace(str,"'","")
str = replace(str,"#","")
str = replace(str,"$","")
str = replace(str,"%","")
str = replace(str,"¨","")
str = replace(str,"&","")
str = replace(str,"'or'1'='1'","")
str = replace(str,"--","")
str = replace(str,"insert","")
str = replace(str,"drop","")
str = replace(str,"delet","")
str = replace(str,"xp_","")
str = replace(str,"select","")
str = replace(str,"*","")
limpalogin = str
end function
%>

Daí a cada request.form você usa a função e já fica livre de injections.

 

Abraços,

Giancarlo Braga.

Compartilhar este post


Link para o post
Compartilhar em outros sites

...

 

Daí a cada request.form você usa a função e já fica livre de injections.

 

Abraços,

Giancarlo Braga.

Então Giancarlo, o código que postei tem a mesma idéia, só que ao invés de substituir ele redireciona para outra página e ao invés de colocar em cada request.form a função, faço com que ele pegue todos os possíveis formulários e querystring's da página.

 

Só mudam um pouco as expressões proibidas, mas isso é só adicionar/remover no código...

 

Mas a idéia é não ter que colocar request.form por request.form...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cuidado com esse monte de replaces. Até onde vi a troca da ' (aspa simples) por '' (duas aspas simples) já resolve o problema e não restringe a entrada de dados. Imaginem aqui no fórum se esse editor tivesse que substituir todas essas palavras e símbolos para evitar SQLInjection, como postaríamos SQL's e outros códigos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cuidado com esse monte de replaces. Até onde vi a troca da ' (aspa simples) por '' (duas aspas simples) já resolve o problema e não restringe a entrada de dados. Imaginem aqui no fórum se esse editor tivesse que substituir todas essas palavras e símbolos para evitar SQLInjection, como postaríamos SQL's e outros códigos?

Realmente, causaria problemas.

 

Se for ver seria só trocar '(simples) por ''(duas simples).

Mas tem também o ;(ponto-e-vírgula: ";DROP TEBLE..."), mas o problema é que os usuários também podem querer utilizá-lo...

 

Achei essa documentação interessante no msnd: SQL Injection

 

When you can, reject input that contains the following characters:

 

; Query delimiter.

 

' Character data string delimiter.

 

-- Comment delimiter.

 

/* ... */ Comment delimiters. Text between /* and */ is not evaluated by the server.

 

xp_ Used at the start of the name of catalog-extended stored procedures, such as xp_cmdshell.

Seria necessário então: ; ' -- /* */ xp_

 

Rejeitando isso, insert, or, delete, drop, etc., poderiam entrar normalmente...

 

E se previnir também para que não sejam exibidos possíveis erros causados intencionalmente, redirecionando para uma página, por exemplo:

 

If Err.Number <> 0 then
Response.Redirect("pagina.asp")
End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

mais uma dica.. atualmente o próprio SQL server possui segurança contra SQL injections.

os problemas com sistemas e websites que aceitam injeções é devido à má configuração e falta de administração ou atualização do servidor.

 

SQL server é um excelente servidor de banco de dados porém, como qualquer outro software, se for mal utilizado trará dor de cabeça.

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.