Segurança em Armazenamento de Dados.

Propaganda
Lidando com Armazenamento de Dados
Paulo Ricardo Lisboa de Almeida
1
Universidade Positivo
Armazenamento de Dados
A grande maioria das aplicações possuem algum mecanismo
para armazenagem de dados
Dados de usuários
Permissões
Configurações ...
2
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
3
Universidade Positivo
Exemplo com SQL
SELECT * FROM users WHERE
username = ‘meuLogin’ and password
= ‘senha’
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
4
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
5
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?
6
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!!!
7
Universidade Positivo
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'
8
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 =
'' OR 1=1;
9
Universidade Positivo
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'
10
Universidade Positivo
Até onde Podemos Chegar?
Algumas soluções
Em user name: ' or 1=1) UNION ALL SELECT users.*
FROM users#
O que o Union All pode possibilitar?
11
Universidade Positivo
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#
Obs.: Devemos casar o número de colunas do select para o Union All Funcionar
12
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!!!
13
Universidade Positivo
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
Ex.: Podemos modificar a senha do usuário admin
14
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?
SELECT * FROM users WHERE username = ‘meuLogin’ and password = ‘senha’
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?
Como Solucionar?
SELECT * FROM users WHERE username =
'Joana D'Arc' and password = 'senha';
SELECT * FROM users WHERE username = ‘meuLogin’ and password = ‘senha’
16
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.
Como burlar esse sistema?
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.
Como burlar esse sistema?
Entrada: Joana D\'Arc
Depois da Sanitização: Joana D\\'Arc
18
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
19
Universidade Positivo
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
20
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
Interpretado sempre como um dado
21
Universidade Positivo
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);
statement.setString(2, nome);
22
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);
statement.setString(2, nome);
23
Universidade Positivo
Queries Parametrizadas
Os parâmetros sempre serão interpretados como dados, e
nunca como sendo parte da estrutura da consulta.
Por quê?
24
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
Interpretado sempre como um dado
25
Universidade Positivo
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, …
26
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
27
Universidade Positivo
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
28
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
delete from pessoa where pessoa_id = ?
29
Universidade Positivo
Download