Segurança

Ataque de truncamento SQL

Ataque de truncamento SQL
A vulnerabilidade de truncamento SQL ocorre quando um banco de dados trunca a entrada do usuário devido a uma restrição no comprimento. Os invasores podem coletar informações sobre o comprimento de um campo crítico (como um nome de usuário) e explorar essas informações para obter acesso não autorizado. Os invasores podem fazer login como outro usuário, como um administrador, com sua própria senha registrada.

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'.

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.org
Nome 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.

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 DATABASE
Consulta 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.

Como instalar e jogar Doom no Linux
Introdução ao Doom A série Doom teve origem nos anos 90 após o lançamento do Doom original. Foi um sucesso instantâneo e, a partir desse momento, a sé...
Vulkan para usuários de Linux
A cada nova geração de placas gráficas, vemos os desenvolvedores de jogos ultrapassarem os limites da fidelidade gráfica e se aproximarem mais do foto...
OpenTTD vs Simutrans
Criar sua própria simulação de transporte pode ser divertido, relaxante e extremamente atraente. É por isso que você precisa ter certeza de experiment...