ATPS Classificação E Pesquisa - Etapa 3
Monografias: ATPS Classificação E Pesquisa - Etapa 3. Pesquise 862.000+ trabalhos acadêmicosPor: • 2/12/2013 • 1.322 Palavras (6 Páginas) • 998 Visualizações
Relatório 4: Evitando ataques SQL INJECTION
Normalmente, as aplicações web fornecem interfaces para o usuário inserir as informações. Estas entradas de utilizador são posteriormente utilizadas para muitas finalidades um dos quais é a consulta das bases de dados. SQL injection é tentar introduzir esses dados através da interface de usuário do aplicativo web que daria a um usuário mal-intencionado a preciosa a informação para editar/modificar os dados protegidos ou travar todo o sistema, etc. Nos cenários de pior caso o usuário mal-intencionado é capaz de até mesmo penetrar na rede por comprometer a segurança da base de dados da máquina hospedeira.
Existem quatro categorias principais de ataques de injeção de SQL em bancos de dados
o SQL Manipulação: manipulação é o processo de modificar as instruções SQL usando várias operações, como UNIÃO. Outra maneira para a implementação de injeção SQL usando o método manipulação de SQL é alterando a cláusula WHERE da instrução SQL para obter resultados diferentes.
o Injeção de código: A injeção de código é o processo de inserção de novas instruções SQL ou comandos de banco de dados na instrução SQL vulnerável. Um dos ataques de injeção de código é um acrescenta um SQL Server executar o comando para a instrução SQL vulnerável. Este tipo de ataque só é possível quando várias instruções SQL por solicitação do banco de dados são suportadas.
o Chamada de função Injeção: Injeção de chamada de função é processo de inserção de várias funções de banco de dados chama em uma instrução SQL vulnerável. Essas chamadas de função poderiam ser chamadas do sistema operacional ng maki ou manipular os dados no banco de dados.
o Estouro de buffer: buffer overflow é causado pelo uso de injeção na função chamada. Para a maioria das bases de dados comerciais e de origem aberta, manchas estão disponíveis. Este tipo de ataque é possível quando o servidor está sem patch.
SQL INJECTION é uma técnica utilizada pra explorar aplicações web a partir da inserção de consultas SQL como parâmetros de execução destas aplicações. Apesar de ser notavelmente simples se implementar uma proteção contra este tipo de ataque, há um elevado número de sistemas conectados a Internet que ainda são totalmente vulneráveis (JOELSCAMBRAY2003). A Injeção ocorre quando ao ser encontrado um sistema com código inseguro, o atacante insere uma série de instruções SQL dentro de uma consulta (query), por meio da manipulação das entradas de dados de um sistema conectado a internet, conseguindo acesso não autorizado ao ambiente e suas informações, fazendo assim varias alterações na estrutura, como exclusão de colunas, mudança de senhas, alteração de notícias e até mesmo tirar o site de ar.
Exemplos de Ataque em PHP A melhor função para proteger seus sistemas em PHP e MySQL contra SQL Injection é a mysql_real_escape_string(), ela escapa os caracteres especiais como aspas simples e duplas antes de enviar para o banco de dados. Porém esta função não funciona em todas as versões do PHP, então na função que iremos criar temos quer verificar se ela existe, e caso não exista vamos utilizar a função mysql_escape_string(). Também devemos ter em mente que se a diretiva get_magic_quotes_gpc() estiver ON ele irá acrescentar barras invertidas automaticamente antes de aspas simples e duplas, o problema é que ele irá enviar para o banco de dados com as barras invertidas, estragando o texto. Para contornar isso basta usar a função stripslashes() para remover essas barras invertidas.
Então vamos montar a nossa função com o nome de anti_sql_injection(): function anti_sql_injection($str) { if (!is_numeric($str)) { $str = get_magic_quotes_gpc() ? stripslashes($str) : $str; $str = function_exists('mysql_real_escape_string') ? mysql_real_escape_string($str) : mysql_escape_string($str); } return $str; }
Note que em nossa função primeiro verificamos se a o valor informado não é numérico, ou seja, que precisa ser tratado, em seguida verificamos se a diretiva get_magic_quotes_gpc() está ativada, se estiver usamos a função stripslashes() conforme falado anteriormente. Em seguida verificamos se existe a função mysql_real_escape_string(), se existir usamos ela, caso contrário usamos a função mysql_escape_string(). Veja um exemplo de como usar a função: if ($_SERVER['REQUEST_METHOD'] == 'POST') { $usuario = trim($_POST['usuario']); $senha = trim($_POST['senha']); $sql = 'SELECT COUNT(id_usuario) '; $sql .= 'FROM usuarios '; $sql .= 'WHERE usuario = \'' . anti_sql_injection($usuario) . '\' ';
$sql .= 'AND senha = \'' . anti_sql_injection($senha) . '\' '; $query = mysql_query($sql) or die('Erro na consulta: ' . mysql_error()); $total = mysql_result($query, 0); if ($total > 0) { echo 'Usuário e senha corretos.'; } else { echo 'Usuário e/ou senha inválidos.'; } } Exemplos de Ataque em ASP No exemplo abaixo, demonstraremos em ASP as possíveis falhas que podem ocorrer nos websites. Utilizaremos abaixo um exemplo, iremos construir uma tabela de usuário com as seguintes colunas : - Login - varchar (255) - Senha - varchar (255) Após criada, executaremos a query : SELECT * FROM usuarios WHERE login = '[login]' AND senha = '[senha]'; Nos scripts ASP, iremos concatenar esta query em uma variável para construir uma consulta dos dados do usuário usando a seguinte linha: var query = "SELECT * FROM usuarios WHERE login = '" + login +"' AND senha = '" + senha + "'" ; Se o login for uma aspa simples (') a consulta que irá acontecer se torna: SELECT * FROM usuarios WHERE login = ' ' ' AND password = '[password]' ; Isto é uma sintaxe inválida de SQL e irá produzir uma mensagem de erro no browser do usuário: Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server] Unclosed quotation mark before the character string and senha=. A aspa simples fornecida pelo usuário fechou a primeira aspa simples e a segunda aspa simples gerou o erro pois não estava fechada. O atacante pode agora começar a injetar uma string na query para manipular o seu comportamento, por exemplo para efetuar o logon como o primeiro usuário na tabela de usuários você poderia colocar no campo de login: ' or 1=1 -- Isto converte a busca para: SELECT * FROM usuarios WHERE login = ' ' or 1=1- - ' AND senha = '[senha]'; Os dois hifens significam um comentário em Transact-SQL, então todo o restante da linha é ignorado. Como 1 é sempre igual a 1, esta query irá retornar a tabela de usuários inteira. O script ASP irá aceitar o logon, pois resultados foram retornados e o cliente será autenticado como o primeiro usuário da tabela. Se conhecer um usuário, pode logar com o seu nome:
' or login='admin' -- O SQL Injection não ocorre apenas se o usuário não escapear as aspas simples, outra ocorrência é:
sql = "delete from tb_videos where vd_id = " & request("id") Neste caso se o usuário inserir como entrada "0 or 1=1" a query acima irá apagar todos os vídeos do banco de dados. Visto até aqui se pode ter uma ideia do quão exposto está uma aplicação que não implementa segurança contra esta técnica de invasão.
Formas de Correção Em ASP uma forma simples para correção deste problema é utilizar uma instrução replace nos caracteres chave, como no exemplo abaixo: strSenha = Replace(strSenha, "'", "");
Basicamente ele substitui o (') por nada, isto é uma forma de corrigir o problema. Em PHP existem algumas formas de resolver o problema, uma é usar a função: mysql_real_escape_string(); e outra é usar a função:stripslashes();. Exemplificando a solução com o stripslashes, temos: Para toda variável inteira fornecida pelo usuário, passe a seguinte função: $var = intval($var); Isto elimina todos valores não numéricos, deixando apenas valores inteiros. Para as demais variáveis, antes de fazer qualquer operação no banco, passe a seguinte função:
$var = addslashes($var); Esta função retorna uma string com barras invertidas antes de caracteres que precisam ser escapeados. Estes caracteres são aspas simples ('), aspas duplas ("), barra invertida (\) e NULL (o byte NULL). A função stripslashes() retorna uma string com as barras invertidas retiradas. (' se torna ' e assim por diante.) Duas barras invertidas (\\) se tornam uma (\). Por fim, inclua o arquivo ctracker.php no cabeçalho de todas as páginas que recebem variáveis como parâmetro.
...