Software Seguro
Trabalho Escolar: Software Seguro. Pesquise 862.000+ trabalhos acadêmicosPor: tiago22santos • 2/5/2014 • 1.205 Palavras (5 Páginas) • 292 Visualizações
Relatório 4: Evitando Ataques SQL INJECTION
Três exemplos de ataques utilizando SQL INJECTION
SELECT * FROM tabela_usuarios WHERE login = '123' AND senha = ' ' or '1' = '1'
SELECT * FROM tabela_usuarios WHERE login = '123' AND senha = ‘or’=1 SELECT * FROM tabela_usuarios WHERE login = '123' AND senha= ')or('1'='1
Http://ww.devmedia.com.br/sql-injection
‘or’=1 '
)or('a'='a
‘or=1
')or('1'='1
‘or’a’=‘a
'or'1'='1
Observe que o comando passado no campo da senha fez com que independente do login e senha informados, a condição seja sempre verdadeira, permitindo assim o acesso do usuário à aplicação sem o mesmo possuir a devida permissão.
Existem diversas possibilidades de comandos que podem ser executados indevidamente através da passagem de parâmetros, onde alguns exemplos podem ser observados na tabela 1:
SQL esperado
Parâmetros informados
SQL resultante
Comantário
Campo_login
Campo_senha
SELECT *
FROM tabela_usuarios WHERE login = 'campo_login' AND senha = 'campo_senha'
marcos’;--
SELECT * FROM tabela_usuarios WHERE login = 'marcos';--' AND senha = 'campo_senha'
Se o usuário já souber o login (no caso, login do usuário marcos) então consegue logar sem senha, já que os caracteres “--“ são comentários no SQL
' OR 1=1 --
SELECT * FROM tabela_usuarios WHERE login = '' OR 1=1--' AND senha = 'campo_senha'
Neste caso, não é necessário saber nem o login nem a senha, pois a condição “OR 1=1” sempre vai ser satisfeita e todos os comandos posteriores são comentados pelos carecteres “--”
123'; DROP TABLE produtos; --
SELECT * FROM tabela_usuarios WHERE login = '123'; DROP TABLE produtos;-- ' AND senha = 'campo_senha'
Este caso é muito parecido com o primeiro mas um comando para apagar uma tabela é executado antes do comentário. Na verdade aqui o objetivo era somente apagar a tabela, por isso foi passado um login qualquer.
Tabela 1 – Passagem de parâmetros SQL injection
Apesar desse tipo de ataque poder ocasionar grandes danos ao banco de dados, ele pode ser evitado apenas com boas práticas de programação, independente da linguagem. Em seguida serão abordadas formas de prevenção na linguagem PHP e JAVA.
3. Prevenção do SQL Injection na linguagem PHP
De acordo com Alves (2007), para se proteger da utilização da SQL Injection, certas providências devem ser tomadas. Algumas das ações serão realizadas no servidor de banco de dados, outras devem ser garantidas pelo código fonte.
Ainda de acordo com o mesmo autor, deve-se tomar cuidado com a configuração do usuário que estabelece a conexão com o banco de dados. O ideal é que as permissões de acesso deste usuário estejam restritamente limitadas às funções que irá realizar, ou seja, para a exibição de um relatório, a conexão com o banco de dados deve ser realizada por um usuário com permissões de leitura e acesso somente às tabelas necessárias para sua operação.
Todos os valores originados da coleta de dados externos, devem ser validados e tratados a fim de impedir a execução de eventuais instruções destrutivas ou operações que não sejam as esperadas.
Um tratamento básico para a execução de querys com variáveis contendo valores informados pelo usuário (ALVES, 2007):
$usuario = $_POST['usuario'];$senha = $_POST['senha'];$usuario_escape = addslashes($usuario);$senha_escape = addslashes($senha);$query_string = "SELECT * FROM usuarios WHERE codigo = '{$usuario_escape}' AND senha = '{$senha_escape}'";?>
Através da função addslashes() será adicionada uma barra invertida antes de cada aspa simples e aspa dupla encontrada (processo conhecido como escape). Se a diretiva de configuração do PHP magic_quotes_gpc estiver ativada, o escape é realizado automaticamente sobre os dados de cookies e dados recebidos através dos métodos GET e POST. Neste caso, não deve ser efetuado o tratamento com addslashes(). A função get_magic_quotes_gpc(), disponível nas versões do PHP a partir da 3.0.6, retorna a configuração atual da diretiva magic_quotes_gpc.
Abaixo, a query string resultante da aplicação do tratamento mencionado:
SELECT * FROM usuarios WHERE codigo = '' AND senha = '\' or 1=\'1'
Deve-se também evitar a exibição das mensagens de erro em um servidor de aplicação em produção, pois geralmente nos erros ou alertas são exibidos caminhos de diretórios do sistema de arquivos e informações à respeito do esquema do banco de dados,
...