• Nenhum resultado encontrado

Aula 5- SQLINjection

N/A
N/A
Protected

Academic year: 2021

Share "Aula 5- SQLINjection"

Copied!
46
0
0

Texto

(1)

Desenvolvimento de Software

Seguro

Aula 5 – SQL Injection

https://sites.google.com/site/thiagoaalves/

(2)

O que é?

 Uma ameaça de segurança que aproveita

de falhas em sistemas web (na sua

maioria), interagindo com as bases de dados.

(3)

O que é?

 A forma mais conhecida de ataques e

chamada de SQL Injection( Injeção SQL).

 O nome vem da utilização do código SQL

para realização de ações nocivas dentro do sistema.

(4)

O que é?

 Injeção SQL é um ataque no qual um

código mal-intencionado é inserido em cadeias de caracteres que são passadas posteriormente para uma instância do servidor SQL.

(5)

O que é?

 Qualquer procedimento que construa

instruções SQL deve ser verificado quanto a vulnerabilidades de injeção

porque o servidor SQL executará todas as consultas sintaticamente válidas que receber. Mesmo dados com parâmetros podem ser manipulados por um invasor qualificado e determinado.

(6)

SQL Injection

(7)

SQL Injection

 A forma principal de injeção SQL consiste

em inserção direta de código em variáveis de entrada de usuário, concatenadas com comandos SQL e executadas.

(8)

SQL Injection

 O processo de “injeção” encerra

prematuramente uma cadeia de

caracteres de texto e anexa um novo comando.

 O comando inserido na injeção pode

apresentar cadeias de caracteres

adicionais anexadas a ele antes de ser executado.

(9)

SQL Injection

 Quando as cadeias de caracteres

armazenadas são concatenadas

subsequentemente em um comando SQL dinâmico, o código mal-intencionado é

(10)

SQL Injection

 O Principal perigo desta técnica, e a

possibilidade de subverter um banco de dados que um atacante, possa realizar as seguinte tarefas:

◦ Inserção de Dados/Tabelas;

◦ Remoção de Dados/Tabelas;

◦ Recuperação de informações sensíveis, não só do banco mas do sistema.

(11)

SQL Injection

 Reflexão:

 Dos problemas apresentados no slide

anterior quais podem ser as

consequências nas bases de dados. A quais perigos você esta suscetível.

(12)

SQL Injection – Exemplo

 Agora vamos ver um exemplo simples de

como e utilizada a SQL Injection.

 A linguagem de programação utilizada no

exemplo foi ASP, e o servidor de banco de dados e SQL Server.

 O Passo a Passo foi consultado no seguinte site:  http://www.macoratti.net/sql_inj.htm

(13)
(14)

SQL Injection – Exemplo

 Geralmente quando o usuário clicar no

botão - Enviar - o script será executado para efetuar a validação dos dados

informados.

 Abaixo temos um script típico para um

(15)

SQL Injection – Exemplo

 <%

dim nomeUsuario, senhaUsuario, consulta dim conn, rS

nomeUsuario = Request.Form("nomeUsuario") senhaUsuario = Request.Form("senhaUsuario")

set conn = server.createObject("ADODB.Connection") set rs = server.createObject("ADODB.Recordset")

consulta = "select count(*) from usuarios where nomeUsuario='" & nomeUsuario & "' and senhaUsuario='" & senhaUsuario & "'"

. . .

(16)

SQL Injection – Exemplo

. . .

conn.Open "Provider=SQLOLEDB; Data Source=(local);Initial Catalog=myDB; User Id=sa; senhaUsuario="

rs.activeConnection = conn rs.open consulta

if not rs.eof then

response.write "Acesso Concedido" else

response.write "Acesso Negado" end if

(17)

SQL Injection – Exemplo

 Vamos analisar o que ocorre quando um

usuário tenta se autenticar.

 Vamos supor que ele é usuário cadastrado

com nome Macoratti e senha 123456. Vamos supor também que este seja um usuário cadastrado e valido dentro do sistema.

 Ao informar o nome e a senha e clicar no

botão Enviar o script do arquivo será

executado. Vamos ver como ficou a instrução SQL montada neste caso :

(18)

SQL Injection – Exemplo

select count(*) from usuarios where nomeUsuario='macoratti' and

senhaUsuario='123456‘

Neste caso o usuário macoratti,

senha 123456 será autenticado e terá acesso ao sistema.

(19)

SQL Injection – Exemplo

 Pergunta:

 Este código e confiável e seguro?  Resposta:

 Não , se você usa este tipo de instrução SQL o

texto final da consulta depende inteiramente do conteúdo das variáveis , e , se o conteúdo destas variáveis não for validado e tratado o texto final poderá ser um SQL adulterado.

(20)

SQL Injection – Exemplo

 Agora vamos pensar no seguinte cenário, um

hacker decidiu invadir sua página. Uma das

primeiras coisas que ele pode fazer é tentar uma injeção SQL , e vai começar verificando se você esta tratando o apóstrofe (aspa simples: ').

 Se você não sabe a presença de um caractere de

apóstrofe (') no conteúdo de uma variável concatenada no SQL é usada para delimitar

strings de texto. Então suponha que ele digite os seguintes dados nos campos nome e senha:

nome = tes'te

(21)

SQL Injection – Exemplo

 Se você não tratar o caso da apóstrofe vai

ocorrer um erro de SQL (incorrect Sintax).

(22)

SQL Injection – Exemplo

 Agora vamos supor que ele descobriu

que o seu código não tem o devido

tratamento, então sua próxima tentativa vai ser a seguinte:

nome = ' ; drop table users--senha =

(23)

SQL Injection – Exemplo

 O que vai acontecer?

O comando irá excluir a tabela users (se

ela existir).

 Mas qual o Problema?

(24)

SQL Injection – Exemplo

 Só com este pequeno teste de tentar

inserir as aspas simples e tentar apagar uma única tabela do seu sistema já vai mostrar uma grande vulnerabilidade.

 Isto é possível pois o caractere (;) indica

o fim de uma linha e o começo de outra em T-SQL , e o caractere (--) no final da linha faz com que o script seja executada sem erro.

(25)

SQL Injection – Exemplo

 Outra coisa que ele pode tentar fazer

para acessar o sistema.

 Ele pode informar os seguintes dados :  nome = admin

senha = ' or

1=1-- veja como vai ficar a consulta SQL

montada:

select count(*) from usuarios where nomeUsuario='admin' and senhaUsuario='' or 1=1--'

(26)

SQL Injection – Exemplo

 Aqui a consulta irá verificar se existe um

usuário com nome de admin e se senha é vazio ou 1 for igual a 1 ( o que é

verdade)

 Se existir um usuário admin ele entrou no

(27)

SQL Injection – Exemplo

 Para tentar descobrir o nome das tabelas e

campos o atacante pode tentar o seguinte:

nome = ' having

1=1--senha =

 isto pode causar o seguinte erro:

Microsoft OLE DB Provider for ODBC

Drivers error '80040e14'

[Microsoft] [ODBC SQL Server Driver]

[SQL Server] Column 'usuarios.codigo' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

(28)

SQL Injection – Exemplo

 Com esta entrada consegue se descobrir

o nome da tabela que é usuários e o nome do campo relacionado no

(29)

SQL Injection – Exemplo

 De posse desta informação ele vai fazer o

mesmo para tentar descobrir o campo de senha.

 Já conhecendo o nome da tabela e das

colunas se ele quiser saber o tipo de dados do campo ele pode tentar a seguinte operação:

(30)

SQL Injection – Exemplo

nome = ' UNION SELECT SUM(nomeUsuario) FROM

(31)

SQL Injection – Exemplo

 Como o SQL Server vai tentar aplicar a

cláusula SUM antes de determinar se o número dos campos nas duas colunas é igual. Ao tentar fazer um SUM em um campo texto o sistema pode emitir a seguinte mensagem de erro:

Microsoft OLE DB Provider for ODBC

Drivers error '80040e7'

[Microsoft] [ODBC SQL Server Driver]

[SQL Server] The Sum or average

aggregate operation cannot take a varchar data type as na argument.

(32)

SQL Injection – Exemplo

 Com isso ele consegue descobrir o tipo

de dado de nomeUsuario.

 E o que ele pode fazer com essa

informação?

(33)

SQL Injection – Exemplo

 Sabendo o nome da tabela, e os campos para logar

ele pode facilmente se inserir dentro da base de dados:

nome = ' ; INSERT INTO usuarios

VALUES('hacker','111111')--senha =

 Com isso ele consegue burlar o código de cadastro e

se logar como hacker e senha 111111.

 Acho que com estes exemplos já deu para você

perceber que você tem que cuidar com muito mais cuidado das suas instruções SQL .Tenha certeza de uma coisa : as possibilidades são muitas.

(34)

Como Evitar ataques por SQL

Injection

 A Principal forma de se evitar uma SQL

Injection e onde muitos esquecem:

(35)

Como Evitar ataques por SQL

Injection

 Uma abordagem tradicional para a

prevenção de ataques é lidar com eles como um problema de validação de

entrada e aceitar apenas caracteres de valores seguros ou identificar e escapar de valores potencialmente maliciosos.

(36)

Como Evitar ataques por SQL

Injection

 Opte sempre por instruções SQL

parametrizadas, elas exigem menos manutenção e podem oferecer mais

garantias no que diz respeito à segurança, contramedidas, tais como limitações de privilégio para o servidor de banco de

dados e assim por diante. Outros pontos para se verificar são:

(37)

Como Evitar ataques por SQL

Injection

◦ Inspecionar todos os pontos de entrada para não permitir o uso de meta-caracteres;

◦ Caso necessite utilizar meta-caracteres, utilize de mecanismos para protegê-los de maneira correta. Existem diversas funções que realizam o

procedimento de escapar caracteres para evitar que eles sejam interpretados de maneira não apropriada pelo aplicativo web.

◦ Utilize, quando possível, funções específicas de banco como stored procedures, que apesar de também serem vulneráveis à ataques de injeção de SQL possuem a condição de evitar exposição exagerada da lógica da aplicação e limitar os tipos de parâmetros recebidos do usuário.

(38)

Como Evitar ataques por SQL

Injection

 Valide todas as Entradas:

 Sempre valide entrada de usuário

testando tipo, comprimento, formato e intervalo. Quando você estiver

implementando precauções contra

entrada mal-intencionada, considere os cenários de arquitetura e implantação de seu aplicativo.

(39)

Como Evitar ataques por SQL

Injection

 Lembre-se de que programas projetados

para executar em um ambiente seguro podem ser copiados para um ambiente sem segurança. As sugestões seguintes devem ser consideradas práticas

(40)

Como Evitar ataques por SQL

Injection

 Não faça suposições sobre o tamanho, o

tipo ou o conteúdo dos dados recebidos pelo seu aplicativo. Sempre faça os

seguintes questionamentos :

◦ Como seu aplicativo se comportará se um usuário errôneo ou mal-intencionado inserir um arquivo MPEG de 10 megabytes onde seu aplicativo espera um código postal?

◦ Como seu aplicativo se comportará se uma instrução DROP TABLE for incorporada em um campo de texto?

(41)

Como Evitar ataques por SQL

Injection

 Teste o tamanho e tipo de dados de

entrada e imponha limites apropriados.

 Teste o conteúdo de variáveis de cadeia

de caracteres e só aceite valores esperados. Rejeite entradas que

contenham dados binários, sequências de escape e caracteres de comentário. Isso pode ajudar a impedir injeção de script e proteger contra explorações de excesso de buffer.

(42)

Como Evitar ataques por SQL

Injection

 Quando você estiver trabalhando com

documentos XML, valide todos os dados em seu esquema à medida que são

inseridos.

 Nunca construa instruções Transact-SQL

diretamente da entrada do usuário.

 Use procedimentos armazenados para

(43)

Como Evitar ataques por SQL

Injection

 Em ambientes de várias camadas, todos os

dados devem ser validados antes de

serem admitidos à zona de confiança. Os dados que não passam pelo processo de validação devem ser rejeitados e um erro deve ser retornado à camada anterior.

(44)

Como Evitar ataques por SQL

Injection

Caractere de entrada Significado em Transact-SQL

; Delimitador de consulta.

' Delimitador de cadeia de dados de caractere.

-- Delimitador de comentário.

/* ... */ Delimitadores de comentário. Texto entre / * e * /

não é avaliado pelo servidor.

xp_ Usado no início do nome de procedimentos

armazenados estendidos de catálogo, como xp_cmdshell.

Sempre que puder, rejeite entrada que contenha os caracteres a seguir.

(45)

Bibliografia

 www-usr.inf.ufsm.br/~candia/aulas/espec/seg/aula_codse guro.ppt? – Acessado em 17/04/2014 as 13:00 Horas  ftp://ftp.registro.br/pub/gts/gts0205/Tutorial-Codeseg.pdf? – Acessado em 17/04/2014 as 13:00 Horas  http://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3 o_de_SQL – Acessado em 17/04/2014 as 18:21 Horas  http://technet.microsoft.com/pt-br/library/ms161953(v=sql.105).aspx – Acessado em 17/04/2014 as 13:00 Horas

(46)

Bibliografia

 http://www.macoratti.net/sql_inj.htm -Acessado em 19/04/2014 as 09:00 Horas  http://www.redesegura.com.br/2012/02/serie -ataques-saiba-mais-sobre-os-ataques-de-injecao-de-sql/ - Acessado em 19/04/2014 as 09:00 Horas  http://juancarloscunha.wordpress.com/2009/ 08/19/tutorial-como-invadir-com-sql- injection-mysql-sql-injection-por-method-_get-e-_post-programa-para-sqlinjection/ -Acessado em 19/04/2014 as 09:00 Horas

Referências

Documentos relacionados

The aim of this study was first to evaluate the production of ethanol and volatile compounds by eight yeast strain utilizing coffee residues coffee pulp and coffee wastewater

O objetivo principal dessa dissertação é apresentar uma proposta de redesign de um Protótipo Inicial de WebGIS para facilitar sua utilização e aumentar as percepções

Regarding the design of the study, we included randomized clinical trials, clinical trials, community studies with comparison of an intervention group with a control group,

Objective: To evaluate costs and length of hospital stay between groups of patients treated for ACS undergoing angioplasty with or without stent implantation (stent+ /

Nos demais tempos, para a formulação 1, valores maiores e diferentes de SS foram en- contrados para os doces acondicionados na embalagem de polipropileno opaca, quando comparado

Por isso, este trabalho prop˜oe uma abordagem para teste de robustez no Archmeds e para isso, contou com o desenvolvimento de uma ferramenta de inje¸c˜ao de falhas chamada WSInject,

Objective: Report our institutional experience with the palliative Senning procedure in children diagnosed with TGA and double outlet right ventricle with severe pulmonary

meio fi'sico Placa Controladora de Rede Placa da INTERTACE DE COMUNICACAO INTEGRADA Ploca da CPU da Eslacdo Hospedeira..