1 Universidade Positivo
Lidando com Armazenamento de Dados
Armazenamento de Dados
A grande maioria das aplicações possuem algum mecanismo para armazenagem de dados
Dados de usuários Permissões
3 Universidade Positivo
Injeção em Contextos Interpretados
Muitas das ferramentas utilizadas para comunicação com repositórios de dados são interpretadas
Ex.: SQL, LDAP
Exposição a vulnerabilidades do tipo Code Injection
Geralmente uma injeção de código pode ser feita devido a uma falha de validação de input
Exemplo com SQL
No exemplo, se a consulta retornar um resultado, é
considerado que o usuário existe no banco de dados com aquele login e senha
Login efetuado com sucesso Observações
Em SQL, strings devem ficar entre aspas simples (‘)
Comentários no código sql são adicionados pela sequência -- ou # dependendo do SQBD
SELECT * FROM users WHERE
username = ‘meuLogin’ and password = ‘senha’
5 Universidade Positivo
Exercício
Considere o exemplo do slide anterior e descreva possíveis formas de se passar pelo sistema de login considerando:
Que você sabe que existe um usuário de login Alice, mas que você não sabe a senha
Que você não possui nem o login nem a senha de nenhum usuário
Você pode utilizar uma das seguintes aplicações demo para fazer seus testes:
http://www.codebashing.com/sql_demo http://sqlzoo.net/hack/
Obs.: No interpretador da aplicação # ou -- representa um comentário
Exercício
Dependendo da sequência que digitarmos nos campos de entrada, obtemos uma mensagem de erro.
Ex.: user name: '#sadsad O que isso nos revela?
7 Universidade Positivo
Exercício
Dependendo da sequência que digitarmos nos campos de entrada, obtemos uma mensagem de erro.
Ex.: user name: '#sadsad O que isso nos revela?
Uma string incorreta foi capaz de gerar um erro no sistema Logo, o sistema está interpretando comandos dessa string Não conseguimos burlar a segurança, mas estamos no caminho certo!!!
Exercício
Algumas soluções
Inserir no campo “User Name” o valor usuario1234’-- Inserir qualquer coisa na senha
SELECT * FROM users WHERE username = 'usuario1234'--' AND password = 'foo'
9 Universidade Positivo
Exercício
Algumas soluções
Inserir no campo “User Name” o valor usuario1234 Inserir na senha ‘ OR 1=1
SELECT * FROM users WHERE username = 'usuario1234' AND password =
Exercício
Algumas soluções
Inserir no campo “User Name” o valor ‘ OR 1=1-- Inserir qualquer coisa na senha
SELECT * FROM users WHERE username = '' OR 1=1--' AND password = 'foo'
11 Universidade Positivo
Até onde Podemos Chegar?
Algumas soluções
Em user name: ' or 1=1) UNION ALL SELECT users.* FROM users#
Algumas soluções
Em user name: ' or 1=1) UNION ALL SELECT users.* FROM users#
O que o Union All pode possibilitar?
Se conseguirmos imprimir o resultado dessa consulta na tela, podemos ter uma lista de todos usuários do sistema Podemos criar variantes mais perigosas
' or 1=1) UNION ALL select * from information_schema.tables#
13 Universidade Positivo
SQL Injection
Aplicações Web geralmente constroem SQLs dinamicamente através dos dados inseridos pelos usuários
Falhas de segurança podem tornar o sistema vulnerável a SQL Injection
O exercício anterior explorava SQL Injection através do campo login e senha de uma aplicação vulnerável
Em alguns casos uma SQL Injection pode permitir ao atacante:
Ler e alterar qualquer dado no banco
Obter acesso ao banco e ao servidor do banco de dados como um todo!!!
SQL Injection
Com SQL Injection podemos recuperar informações arbitrárias do sistema
Select
Inserir informações no banco de dados Insert
Ex.: Podemos inserir um novo login e senha no banco para podemos logar quando quisermos
Modificar informações no banco de dados Update
15 Universidade Positivo
SQL Injection – Vulnerabilidade Básica
Preconceito contra Joana D'Arc
Pode impedir que um usuário comum entre no sistema Qual o problema?
SQL Injection – Vulnerabilidade Básica
Preconceito contra Joana D'Arc
Pode impedir que um usuário comum entre no sistema Qual o problema?
Como Solucionar?
SELECT * FROM users WHERE username = ‘meuLogin’ and password = ‘senha’
SELECT * FROM users WHERE username =
17 Universidade Positivo
SQL Injection – Vulnerabilidade Básica
Preconceito contra Joana D'Arc
Muitos desenvolvedores podem ser tendenciosos em fazer uma sanitização simples da entrada
Ex.: colocar um caractere de escape nas aspas
Entrada: Joana D'Arc
Depois da Sanitização: Joana D\'Arc
Um usuário comum de nome “Joana D'Arc” agora pode utilizar o sistema. Mas ainda temos uma falha grave de segurança.
SQL Injection – Vulnerabilidade Básica
Preconceito contra Joana D'Arc
Muitos desenvolvedores podem ser tendenciosos em fazer uma sanitização simples da entrada
Ex.: colocar um caractere de escape nas aspas
Entrada: Joana D'Arc
Depois da Sanitização: Joana D\'Arc
Um usuário comum de nome “Joana D'Arc” agora pode utilizar o sistema. Mas ainda temos uma falha grave de segurança.
Como burlar esse sistema?
Entrada: Joana D\'Arc
19 Universidade Positivo
Como Prevenir SQL Injections?
Sanitização das entradas Solução Parcial
Pode impedir alguns ataques, mas os algoritmos de sanitização sempre são propensos a falhas
Como Prevenir SQL Injections?
Stored Procedures Solução parcial
Criam-se as Sqls estáticas no banco de dados para inserção, por exemplo.
Problemas
SQL Injections ainda são possíveis em Stored
Procedures, principalmente se elas tiverem problemas de desgn
Pode ser considerada uma má prática de
desenvolvimento do ponto da Eng. De Software Custo de desenvolvimento
21 Universidade Positivo
Queries Parametrizadas
Os parâmetros sempre serão interpretados como dados, e nunca como sendo parte da estrutura da consulta.
A estrutura da consulta foi definida no primeiro passo A API do banco de dados (driver) garante que qualquer placeholder definido será tratado de maneira segura
Como Prevenir SQL Injections?
Queries Parametrizadas (Parametrized Queries)
Solução efetiva que geralmente pode ser utilizada
String sql = "insert into pessoa (cpf,nome,nascimento) values (?,?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, cpf);
23 Universidade Positivo
Queries Parametrizadas
O comando é construído em dois passos:
A estrutura da consulta é definida, deixando-se alguns espaços reservados (placeholders) para as entradas de usuário
Os conteúdos dos espaços reservados é especificado pela aplicação
String sql = "insert into pessoa (cpf,nome,nascimento) values (?,?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, cpf);
Queries Parametrizadas
Os parâmetros sempre serão interpretados como dados, e nunca como sendo parte da estrutura da consulta.
25 Universidade Positivo
Queries Parametrizadas
Os parâmetros sempre serão interpretados como dados, e nunca como sendo parte da estrutura da consulta.
A estrutura da consulta foi definida no primeiro passo A API do banco de dados (driver) garante que qualquer placeholder definido será tratado de maneira segura
Queries Parametrizadas
Para que as queries parametrizadas tenham efeito, temos que manter em mente que:
Todas consultas no sistema devem ser parametrizadas
Todos itens de dados inseridos devem ser parametrizados
De nada adianta parametrizar alguns itens, e outros não Placeholders devem ser utilizados somente para especificar os dados, e nunca a estrutura da consulta
Ex:. Não devem ser utilizados para especificar colunas, tabelas, schemas, …
27 Universidade Positivo
Demais Mecanismos de Defesa
A aplicação deve ter o menor nível de privilégios possível para acessar o banco de dados
Se a aplicação somente precisa consultar informações no banco, e nunca inserir ou atualizar, deve-se criar um
usuário no banco que possa somente fazer consultas que será utilizado pela aplicação
A aplicação nunca deve ter privilégios de root (administrador) no banco de dados
Desabilitar as funcionalidades do banco de dados que não são utilizadas
Ex.: o banco pode ter uma funcionalidade serializar os dados via SOAP, que não é utilizada pela aplicação
Aplicar patches de correção no banco de dados recomentados pelo fabricante
Exercício (Valor 1,0)
Considere o banco de dados da imagem que contém somente a tabela pessoa
Crie uma aplicação que insira, atualize e remova os dados nessa tabela utilizando a linguagem de sua preferência e queries parametrizadas
A grande maioria das linguagens oferece drivers para conexão com bancos de dados utilizando queries
parametrizadas
Java (JDBC), .Net, C++, PHP, …
Utilize o banco de Dados de sua preferência PostgreSQL, HSLQDB, Oracle, …
Os scripts para criação de um banco HSQLDB, bem como uma aplicação de exemplo encontram-se no site da disciplina
29 Universidade Positivo
Exercício (Valor 1,0)
Exemplos: Insert:
insert into pessoa (cpf,nome,nascimento) values (?,?,?) Update:
update pessoa set cpf = ?, nome = ?, nascimento = ? where pessoa_id = ?
Delete