O Que é o SQL Injection?
SQL Injection é um tipo de vulnerabilidade bastante encontrada em aplicações Web. Mesmo sendo conhecida por muitos especialistas da área, aplicações ainda são construídas com esse tipo de vulnerabilidade, que são exploradas por meio de ataques.
Segundo o ranking de vulnerabilidades criado pela (Open Web Application Security Project) (OWASP, 2017), SQL Injection é a vulnerabilidade mais encontrada em aplicações Web, que permite a um usuário mal-intencionado invadir bancos de dados associados a páginas Web explorando falhas de programação.
Explorando uma vulnerabilidade do tipo SQL Injection, o usuário malicioso consegue acessar o banco de dados da aplicação Web a partir de cláusulas SQL específicas inseridas em campos da página Web. A aplicação, que não faz uma verificação desses dados inseridos, permite fazer alterações no banco de dados, principalmente retornar dados armazenados ou excluí-los.
Como ocorre o ataque a vulnerabilidades SQL Injection?
Para explicar, como ocorre um ataque por meio de SQL Injection, vamos utilizar a seguinte página de acesso (Figura 1) para uma aplicação Web qualquer, onde o usuário insere um e-mail e senha que serão validados pelo sistema para conceder ou não acesso para o usuário.

Figura 1. Exemplo de interface para acesso com e-mail e senha.
No caso da Figura 1, o usuário tem acesso à aplicação Web quando insere os dados “Victor” no campo “e-mail” e a senha “1234”. Depois de selecionar o botão “Entrar”, o código irá executar uma cláusula SQL para verificar se os dados inseridos pelo usuário são iguais aos cadastrados no banco de dados. Após a verificação, o sistema retorna “verdadeiro”, caso o e-mail e senha forem corretos e “falso”, caso a entrada do usuário seja incoerente com o banco de dados. Essa clausula SQL será como exibida na Figura 2:
select * from tabela_Usuarios where campo_email = 'Victor' and campo_senha = '1234';
Figura 2. Exemplo de cláusula SQL do código.
Contudo, esta cláusula SQL (Figura 2) não realiza quaisquer técnicas de sanitização de dados inseridos pelo usuário. Logo, o mesmo pode inserir qualquer entrada no campo e-mail e senha.
Num perfil de ataque SQL Injection, o usuário mal-intencionado irá explorar as falhas da aplicação (provenientes de uma cláusula SQL sem tratamento de dados) para conseguir acesso ao sistema, procurando inserir valores que sejam sempre verdadeiros para o sistema.
select * from tabela_Usuarios where campo_email = '' OR 1=1; /*' and campo_senha = '/*--';
Figura 3.1 Exemplo de cláusula SQL Injection para acessar a aplicação Web.
No caso da Figura 3.1, o usuário malicioso inseriu os valores “ ‘ OR 1 = 1; /*’ ” e “ /*-- ” nos campos e-mail e senha, respectivamente. Essa entrada de dados pelo usuário configura um caso de SQL Injection, pois mesmo os valores sendo incoerentes para conceder acesso a aplicação Web, quando o sistema for executado retornará sempre verdadeiro. O ataque ocorre devido aos caracteres especiais “ /* ” e “--” e também pela condição sempre verdadeira de “1 = 1”. Nesse caso os caracteres especiais serão interpretados como comentários de código para a linguagem SQL, anulando, portanto, o código após os caracteres especiais e verificando apenas a condição “1=1”, que sempre retornará verdadeiro, permitindo ao usuário acessar a aplicação sem saber o e-mail e senha corretos.
Em um caso mais grave, o usuário mal-intencionado pode já saber algumas informações do banco de dados, como nome de tabelas e colunas, para formular uma cláusula SQL Injection mais elaborada.
select * from tabela_Usuarios where campo_email = '123'; DROP TABLE senha; /*' and campo_senha = '/*--';
Figura 3.2 Exemplo de cláusula SQL Injection para excluir dados do sistema.
No caso da Figura 3.2, o usuário mal-intencionado executa o comando da própria linguagem SQL “DROP TABLE senha”, onde excluirá qualquer tabela especificada. Também é possível alterar, adicionar e retornar dados já armazenado no banco de dados.
Como prevenir-se de ataques SQL Injection?
Mais importante que conter ataques é preveni-los. Pensando nisso, desenvolvedores devem adotar técnicas de codificação segura, tais como boas práticas ao programar na criação de um sistema Web eficiente e protegido para o usuário final. Destacamos algumas práticas que podem ser adotadas por programadores para garantir um código seguro.
1. Em PHP:
De acordo com a DevMedia (DevMedia, 2012), a linguagem mais utilizada em back-end de aplicações Web, que é o PHP 7.0, vem embutida com diversos recursos que permitem sanitizar dados de entrada do usuário e prevenir aplicaçãoaplicações Web contra possíveis ataques SQL Injection. Um exemplo são as “prepared statements” que podem ser usadas na criação de uma cláusula SQL.
$query = "select * from usuario where campo_email=:email and campo_senha=:senha"; $stmt = $conn->prepare($query); $stmt->bindParam(':email',$usuario, PDO::PARAM_STR);
Figura 4 Possível solução para SQL Injection em PHP.
Na Figura 4, perceba que criar um clausula SQL passando os dados de entrada do usuário por parâmetro, tal como em “:email” e “:senha”, evitando concatenar os dados de entrada do usuário é um método simples e eficaz para evitar tentativas de SQL Injection , por isso optar por um código mais elaborado, implementando aspectos de segurança, garantirá a segurança e integridade da aplicação Web para o usuário final.
Além disso, é possível utilizar as funções de String do PHP 7.0, tais como filter_input() (para verificar se o dado inserido condiz com o campo especificado), str_replace() (para trocar alguns caracteres por outros) ou addlashes() (que executa o procedimento chamado “escape”, que troca as aspas inseridas por barras simples e barras simples por duplas). Também é possível alterar as configurações do PHP para não exibir erros de SQL para o usuário final, protegendo a aplicação contra exposição de dados importantes
2. Em JavaScript:
Segundo a W3 School (W3 School, 2015), também encontramos soluções para SQL Injection na linguagem JavaScript, que mesmo não sendo a mais utlizada na criação do back-end em aplicações Web, ainda é vulnerável a ataques SQL Injection.
String sql = "select * from tabela_usuarios where login='" + campo_login +"' and senha='" + campo_senha + "'";
Figura 5 Exemplo de query SQL em JavaScript.
Na figura 5, exibido um código construído com vulnerabilidade, pois é concatenar a entrada do usuário na construção da consulta SQL ameaça o sistema contra possíveis ataques SQL Injection, torna vulnerável a segurança do banco de dado e prejudica a proteção de dados do usuário final.
String sql = "select * from tabela_Usuarios where campo_email = ? and campo_senha = ?"; PreparedStatement prep = con.prepareStatement(sql); prep.setString(1,email); prep.setString(2,senha);
Figura 6 Exemplo de query SQL em JavaScript.
Na figura 6, no caso de uma tentativa de ataque, o código evita sua execução utilizando os “named parameters”, um recurso da linguagem Java Script que permite criar a cláusula SQL sem concatenar a entrada do usuário, garantido proteção para a aplicação Web.
Demonstração
Disponibilizamos o link de um protótipo criado durante nossa pesquisa cientifica para demonstrar um casos de SQL Injection em um sistema vulnerável (Acha que conseguiria fazer um SQL Injection? Clique Aqui!).
Referências
OWASP, T. Top 10-2017. The Ten Most Critical Web Application Security Risks. OWASP Foundation. The free and open software security community. URL: https://www. owasp.org/index.php/Top_10-2017_Top_10, 2017.
DevMedia. Sql Injection em Ambientes Web. 2012. Disponível https://www.devmedia.com.br/sql-injection-em-ambientes-web/9733 . Acesso em: 29 jun 2020.
W3School. SQL Injection. 2015. Disponível em https://www.w3schools.com/sql/sql_injection.asp. Acesso em: 29 jun 2020.