content top

domingo, 9 de dezembro de 2012

SQL


Este texto tem como base transmitir conhecimento de prevenção, e está muito superficial, será atualizado constantemente.

SQL Injection
SQL INJECTION
Acessos
Ataques
Blind SQL Injection
Referêcias
SQL (Structured Query Language)
É uma linguagem utilizada para administrar banco de dados . Pois é a mais fácil de ser compreendida e utilizada
Sistemas de bancos de dados que SQL: MySQL, Microsoft SQL, Server, Oracle, PostgreSQL e outros.
Vamos nos atentar ao mais familiar, que é o MySQL.
Um bom exemplo de tabela iria conter:
Nº - Nome - Tipo - Email - Senha
(tabela de usuários)
Instrução ao SQL
SELECT coluna(s) FROM tabela
INSERT INTO tabela VALUES (argumentos)
UPDATE tabela SET (argumentos)
DELETE FROM tabela
Clausulas: WHERE, ORDER BY
Operadores lógicos: ADN, OR, NOT
Curingas: *,_,%
Caracteres relevantes: ' " ; -- , #
PRATICA
SQL Injection, é feito constantemente em aplicações, oque seriam aplicações? PHP, Java ou ASP. O objetivo é extrair informações relevantes da base de dados. O Ataque se resume em explorar vulnerabilidade diretamente na aplicação, que se baseia no problema dos ADMINS:
validar toda forma de input, que seria assumir sempre que ele pode ser malicioso.
A forma padrão de se pegar input:
SELECT * FROM usuários WHERE Nome = 'Jose' AND Senha = '12345'
Você pode usar as aspas simples ou duplas, funciona também.
No login você usaria a string:
' OR 1=1 #
Query
SELECT*FROM usuários WHERE Nome = " OR 1=1 #'AND Senha="
Não importa o quão complexa é a senha, o simbolo de comentário (#) vai fazer a query ignorar oque vem depois de login.
1 é sempre igual a 1, com isso ganharemos acesso ao sistema rápido e fácil.
É possível inserir também Stacking Queries.
Saida: a caracteres problemáticos, aspas simples e duplas?
Codificações interpretadas com mais de um byte pode ser fatal (uso de carácter).
Uma solução bastante usada é a declaração(ões) prepada(s) para separar o input, você irá tratar dele e depois add ao query em questão.
ATAQUES
Ataque que visa obter informações da tabelas do BD. Baseando-se em mensagens de erro do servidor.
Se utiliza a declaração "UNION ALL SELECT", isto exige que ambas as queries chamadas pelos ELECT's tenham o mesmo nº de colunas e o mesmo tipo de dados.
Para se obter informação, você utiliza queries com sintaxe ruim para forçar msgs de erro e obter informações deles.
exemplo: "userid=21". trocamos por: "userid=21'" ou "...='boo'"
Primeiro temos que descobrir quantas colunas tem a tabela
add a seguinte string na query: ORDER BY 1#
E vamos aumentar o valor numerico de 1 em 1, até obter um msg de erro.
Isto funciona porque ORDER BY ordena os resultados da query de acordo com o nome ou numero da coluna que for especificado nela.
ADENDO: existem tipos de dados não-ordenáveis.
Agora devemos descobrir o tipo de dados que cada coluna armazena.
Add a seguinte string na query:
UNION ALL SELECT NULL, NULL, ...(n vezes)#
n é o nº de colunas.
Caso o parâmetro seja uma string, devemos add uma aspas simples ou dupla ante do "#"
O UNION ALL SELECT combina o resultado de duas ou mais queries, por isso funciona.
NULL pode ser combinado com qualquer outro tipo, vamos fazer alguns testes a fim de descobrir os tipos de dados das colunas.
Teste (para n = 4):
(...) UNION SELECT 1,NULL,NULL,NULL,NULL #
Ok.
(...) UNION SELECT 1,2,NULL,NULL,NULL,NULL #
Erro- a coluna não é do tipo numérica.
(...) UNION SELECT 1,'2',NULL,NULL,NULL,NULL #
Ok
E por ai vai.
Sabemos que, toda string possui uma representação em hexadecimal.
Se conseguirmos converter a string e as aspas para um código numérico, poderemos fazer a injeção.
Refaçamos a ultima query:
(...) UNION SELECT 1,'2',NULL,NULL,NULL,NULL #
ficara assim:
(...) UNION SELECT 1,CONCAT(CHAR(27),CHAR(32),CHAR(27),NULL,NULL,NULL,NULL #
podemos fazer diretamente, isso seria uma alternativa:
(...),CONCAT(CHAR(27),CHAR(32),CHAR(27),(...)
Agora sabemos os tipos de dados das colunas, podemos extrair o dado que desejarmos, violando a confidencialidade do servidor.
Com oque nos ja obtivemos, podemos descobri nomes-padrão de outras tabelas.
Naturalmente agora nós coletaríamos informações, oque usar? UNION ALL SELECT
Isso nos da também a possibilidade de novos ataques, podemos usar a função LOAD_FILE() para ver os conteúdos de algum arquivo importante rodando no servidor, ou tentar ver a hash da senha do admin e quebra-la.
ADENDO
"@@version" essa constante  mostra a versão do banco de dados SQL, isso ajuda a confirmar qual a base de dados que estamos lidando.
Burle os filtros, um exemplo de filtragem é usar os espaços em branco, basta troca-los por '/**/' (sem aspas)
Mesmo quando o adm do banco de dados é cuidadoso e atento aos detalhes, faz a higienização do input e deixa sistema estupidamente seguro, faz diversas barreiras de defesa, ainda assim pode estar vulnerável a SQL Injection
BLIND SQL INJECTION
Este método é e deve ser usado silenciosamente.
Vejamos se a URL aceita receber operações logicas (AND, OR) e matemáticas
(...)userid=00-1
(...)userid=10 AND 1=1
(...)userid='b'+'oo'
Realizado:
1º: pergunte a base de dados, registro por registro nas tabelas, cada letra das palavras;
Isso que dizer: perguntamos a base de dados se o 1º caractere da primeira coluna possui valor ASCII maior que "x". Analisemos a resposta, e já vamos preparando outra pergunta até descobrir o primeiro carácter.
2ª fazer consultas a base de dados tentando descobrir por exemplo:
nome das tabelas, e colunas por força bruta, fazendo uso de funções de delay.
Nessa usaríamos algo como a declaração IF para fazer essas perguntas, caso isso seja satisfatório, forçar o server a esperar um tempo e só então retornar alguma coisa. No MySQL usamos a função  BENCHMARK(numero de vezes, ação) para o serviço.
ADENDO
Podemos combinar essas duas formas de ataque de BLIND
Existe também ferramentas que fazem Blind SQL Injection de uma forma extremamente efetiva.
DICAS:
PREOCUPE-SE COM TODA FORMA DE ENTRADA
Todo input é malicioso até que se prove o contrario, mas ele deve ser validado não se esqueça, pois é por conta da invalides que se tem acesso.
Fique atento aos privilégio dos usuários, varias formas de ataque que não foram abordadas aqui podem ser facilmente evitada dessa forma
SQL injection não se aplica a sites somente, pode se usar em SO em ataques mas complexos, então fique atento e pesquise sobre como prevenir sobre as formas de ataques e defesa.
Um exemplo de solução para PHP+SQL
$name = "José";
$name = mysql_real_escape_string($name);
$SQL = "SELECT * FROM users WHERE username = '$name'";
$malcious_input = "' OR 1'";
// The Above Is The Malicious Input. Don't Be Scared!
// With The mysql_real_escape_string() usage, the following is obtained:
\' OR 1\'
// Notice how the slashes escape the quotes! Now users can't enter malicious data
LINKS UTEIS

content top