Vulnerabilidade de truncamento SQL geralmente existe em bancos de dados MySQL. Esta vulnerabilidade foi descrita pela primeira vez em CVE-2008-4106, que estava relacionada ao WordPress CMS.
Como funcionam os ataques de truncamento SQL
Este ataque funciona devido ao truncamento da entrada do usuário em bancos de dados usando as funções de 'seleção' e 'inserção'.
- Quando a entrada é fornecida no campo do formulário, a função 'selecionar' verifica a redundância correspondente às entradas no banco de dados.
- Depois de verificar a redundância, a função de 'inserção' verifica o comprimento da entrada, e a entrada do usuário irá truncar se o comprimento exceder.
Suponha que um desenvolvedor crie a tabela “usuários” por meio da seguinte consulta:
criar tabela de usuários (user_id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR (20) NÃO NULO,
senha VARCHAR (40) NÃO NULO,
PRIMARY KEY (user_id)
);
Usando este esquema, se o desenvolvedor criar uma conta de administrador com o seguinte:
user_name = 'admin'senha = “secret_p4ssw0ord”
Obviamente, essas credenciais não são públicas. Há apenas uma conta de administrador no banco de dados, e se um invasor tentar registrar outra conta com o nome de usuário 'admin', o invasor falhará devido às verificações de redundância do banco de dados. O invasor ainda pode ignorar essa verificação de redundância para adicionar outra conta de administrador, explorando a vulnerabilidade de truncamento SQL. Suponha que o invasor registre outra conta com a seguinte entrada:
User_name = 'adminxxxxxxxxxxxxxxxrandom'(x são os espaços)
E
Senha = ”RandomUser”
O banco de dados pegará o 'user_name' (26 caracteres) e verificará se este já existe. Então, a entrada user_name será truncada, e 'admin' ('admin' com espaço) será inserido no banco de dados, resultando em dois usuários admin duplicados.
O invasor é então capaz de criar um usuário 'admin' com sua própria senha. Agora, o banco de dados tem duas entradas admin 'user_name', mas com senhas diferentes. O invasor pode fazer login com as credenciais recém-criadas para obter um painel de administração porque os nomes de usuário “admin” e “admin” são iguais para o nível do banco de dados. Agora, veremos um exemplo de ataque prático.
Ataque de amostra
Neste exemplo, vamos pegar um cenário do site overthewire.org. A comunidade overthewire fornece CTFs de jogos de guerra nos quais podemos praticar nossos conceitos de segurança. O cenário de truncamento SQL ocorre no jogo natas Nível 26-> 27. Podemos acessar o nível usando o seguinte:
URL: http: // natas27.natas.laboratórios.overthewire.orgNome de usuário: natas27
Senha: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
Este nível está disponível em: https: // overthewire.org / wargames / natas / natas27.html. Será exibida uma página de login vulnerável a um ataque de truncamento SQL.
Ao inspecionar o código-fonte, você verá que o comprimento do nome de usuário é 64, conforme mostrado abaixo.
Já existe um usuário chamado 'natas28'. Nosso objetivo é criar outro usuário chamado 'natas28' usando o ataque SQL_truncation. Então, vamos inserir natas28, seguido por 57 espaços e um alfabeto aleatório (no nosso caso, a), nome de usuário e qualquer senha. A letra 'a' não é visível na captura de tela por causa do nome de usuário de 65 caracteres. Após a criação da conta do usuário, você será capaz de ver o 'uma.'
Se o banco de dados contém vulnerabilidade sql_truncation, então o banco de dados agora deve ter dois nomes de usuário 'natas28'. Um nome de usuário conterá nossa senha. Vamos tentar inserir as credenciais na página de login.
Agora, estamos logados como o usuário 'natas28'.
Mitigação
Para atenuar esse ataque, precisaremos considerar vários fatores.
- Não devemos permitir a duplicação de identidades críticas como o nome de usuário. Devemos fazer com que essas identidades sejam chaves primárias.
- A função truncate deve ser implementada para todos os campos de formulários de front-end, bem como código de back-end, para que os bancos de dados recebam entradas truncadas.
- O modo estrito deve ser ativado no nível do banco de dados. Sem o modo estrito habilitado, os bancos de dados apenas dão avisos no back-end, mas ainda salvam os dados duplicados. Com o modo estrito, os bancos de dados fornecem erros em caso de duplicação e evitam salvar dados.
Por exemplo, vamos verificar o modo estrito usando a seguinte consulta:
mysql> select @@ sql_mode
Vamos criar um banco de dados e os usuários da tabela.'
mysql> teste CREATE DATABASEConsulta OK, 1 linha afetada (0.02 seg)
mysql> Use test
Banco de dados alterado
usuários mysql> CREATE TABLE (nome de usuário VARCHAR (10), senha VARCHAR (10));
Consulta OK, 0 linhas afetadas (0.05 seg)
A seguir, criaremos um usuário administrador com credenciais usando a consulta INSERT.
mysql> INSERT INTO usuários VALORES ('admin', 'senha1');Consulta OK, 1 linha afetada (0.01 seg)
Podemos ver as informações da tabela de 'usuários' usando a opção 'selecionar * dos usuários'.
O comprimento do nome de usuário é 10 caracteres. Agora, vamos tentar o ataque de truncamento SQL.
Quando tentamos inserir o seguinte:
Nome de usuário = 'adminxxxxxa'(x são os espaços)
E
Senha = 'pass2'
Obteremos um erro, o que significa que o modo estrito é totalmente eficaz.
valores de usuários mysql> INSERT INTO ('admin a', 'pass2')ERRO 1406 (22001): Dados muito longos para a coluna 'nome de usuário' na linha 1
Sem o modo estrito habilitado, o banco de dados irá gerar avisos, mas ainda irá inserir os dados na tabela.
Conclusão
Os invasores podem obter acesso a contas de alto privilégio se a vulnerabilidade sql_trunction existe em seu aplicativo. O invasor pode obter facilmente informações sobre um nome de usuário e o comprimento de seu banco de dados usando os campos críticos e, em seguida, criar o mesmo nome de usuário, seguido por espaços e alfabeto aleatório após o comprimento mínimo, resultando na criação de várias contas de alto privilégio. Esta vulnerabilidade é crítica, mas pode ser evitada se você tomar algumas precauções de segurança, como ativar o modo estrito para entradas do usuário e tornar o campo confidencial a chave primária no banco de dados.