90 likes | 222 Vues
SQL Injection. Como fazer um SQL Injection Marco Ferreira Rui Cunha. Conceito. SQL Injection é uma vulnerabilidade que resulta da falta de verificação e tratamento de input. A ideia é fazer aceitar strings de SQL de forma a receber e/ou manipular informação de uma base de dados SQL alvo.
E N D
SQL Injection Como fazer um SQL Injection Marco Ferreira Rui Cunha
Conceito • SQL Injection é uma vulnerabilidade que resulta da falta de verificação e tratamento de input. • A ideia é fazer aceitar strings de SQL de forma a receber e/ou manipular informação de uma base de dados SQL alvo. • Não existe uma maneira correcta/óptima de fazer este género de ataques. • É uma forma de descoberta e exploração racional.
Escolha do alvo • Numa primeira perspectiva, tem-se em conta o código em que é programado o site alvo. Ex: se for ASP.NET é assumido que o servidor corre Microsoft SQL junto com o Microsoft IIS.
Inicio do ataque • Introduzimos um email com plicas de forma a verificar se as strings são tratadas, se recebermos o erro 500(server failure) verificamos que elas são tratadas literalmente, estamos no bom caminho. • Se introduzirmos um email com uma plica no fim recebemos o erro "email address is unknown” que é uma resposta não tratada do servidor SQL. • Esta informação, supomos que esteja depois do WHERE, tentamos assim colocar anything' OR ‘X'=‘X em vez do email. • X= X será sempre verdade, em vez de recebermos um único output, esta versão da query irá devolver todos os items da base de dados dos membros. Escolhemos um email ao acaso, e testamos receber a informação de um deles para o seu próprio email. O importante é saber que o email foi enviado com sucesso.
Mapeamento dos campos • Neste passo tentamos adivinhar os nomes dos campos da tabela na base de dados. • “x' AND email IS NULL; --”, esta string serve para tentar adivinhar se existe um campo chamado “email”, ao colocar a plica depois do X e uma continuacao da query para testar o campo emnail, e no fuim o – como inicio de comentario em sqlquery para ignorar o fim de campo que será a plica que existe no codigo da query original. • Desta forma vamos mapear aos poucos e pacientemente os campos existentes na tabela. • Assumimos que encontramos os seguintes campos: email, passwd, login_id, full_name
Encontrar o nome da tabela • Usamos a query parcial “x' AND 1=(SELECT COUNT(*) FROM tabname); --” paraencontrar o nomedatabela. • Eventualmenteencontramosque members é umatabelavalida. • Usamos a query parcial “x' AND members.email IS NULL; --” se nãoretornarerro, verificamosque a nossa query estábemformada e adivinhamos com sucesso o nomedatabela.
Encontrando utilizadores • Usamos a query “x' OR full_name LIKE '%Bob%-” paraencontrar o nome de um utilizador, visto so ser necessario um paraforçar a nossaentrada. A tag % vaiprocurartodososnomesqueincluam, nestecaso bob nosutilizadores. • Nestecasotemos de tercuidadovistosempreque a query é bemsucessedidairáalertar o utilizadorquerecebe um email com a suainformação.
Encontrar a password por Brute-Force • Existem formas de impedir esta etapa como logfiles, accountlockups ou outras formas, mas sendo bem sucessedidos até este ponto, podemos assumir que não existem ou não funcionaram correctamente. • “bob@example.com' AND passwd = 'hello123” será a query que iremos explorar, até que apareça a mensagem com sucesso, e desta alertado o utilizador, não iremos receber memsagens de erro, visto ser uma query bem formada. • Será um processo longo e será boa ideia fazer um script que explore as passwords possiveis.
A Base de Dados não é só de leitura • 'x'; DROP TABLE members; --, aqui está um exemplo de uma query que vai alterar a base de dados, neste caso, apagar a tabela de membros. • x'; INSERT INTO members ('email','passwd','login_id','full_name') VALUES ('steve@unixwiz.net','hello','steve','SteveFriedl');--, adicionar um novo membro. • x'; UPDATE members SET email = 'steve@unixwiz.net' WHERE email = 'bob@example.com, mudar o e-mail do membro, sendopossivelapósestepassofazerumarecuperação de password para o novo e-mail.