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