Introdução
sqlmap é uma poderosa ferramenta de teste de penetração open-source que automatiza o processo de detecção e exploração de falhas de SQL injection. Ao realizar um scan, dois dos parâmetros mais importantes que você pode controlar são --level e --risk. Esses parâmetros determinam a abrangência e a agressividade do scan.
- Level: Controla o número de testes a serem realizados. Varia de 1 a 5, com níveis mais altos realizando testes mais extensos em mais pontos de injeção (como cabeçalhos HTTP).
- Risk: Controla o nível de risco das payloads utilizadas. Varia de 1 a 3, com riscos mais altos utilizando payloads potencialmente disruptivas (como consultas baseadas em tempo que podem desacelerar um banco de dados).
Neste laboratório, você aprenderá a usar esses dois parâmetros para ajustar seus scans sqlmap. Você começará com um scan padrão e aumentará progressivamente o nível e o risco para observar como isso afeta o escopo, a duração e os tipos de payloads utilizados no scan.
Compreender o Nível (1) e Risco (1) Padrão
Nesta etapa, você realizará um scan básico com sqlmap sem especificar o level ou risk. Por padrão, sqlmap utiliza --level=1 e --risk=1. Este é o scan menos abrangente e mais seguro.
O Level 1 testa apenas parâmetros GET e POST. O Risk 1 utiliza payloads que geralmente são inofensivas para uma aplicação web, como testes básicos de injeção baseados em booleanos e em erros.
Vamos executar o scan padrão contra a aplicação vulnerável que foi configurada para você. A opção --batch responde automaticamente a todas as perguntas com a escolha padrão, tornando o scan não interativo.
Execute o seguinte comando no seu terminal:
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --batch
Você verá o sqlmap iniciar seu processo de teste. Preste atenção ao resumo no final, que mostra o número de requisições feitas e as vulnerabilidades encontradas.
...
[INFO] testing 'Boolean-based blind - WHERE or HAVING clause'
[INFO] testing 'Error-based - WHERE or HAVING clause'
[INFO] testing 'Time-based blind'
...
[INFO] GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of XXX HTTP(s) requests:
---
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1 AND 2129=2129
Type: error-based
Title: SQLite OR error-based - CUME_DIST
Payload: id=1 OR 1 GROUP BY CUME_DIST(1)
Type: time-based blind
Title: SQLite > 2.0 AND time-based blind
Payload: id=1 AND 7415=CASE WHEN (substr(sqli,1,1)='S') THEN 7415 ELSE 0 END
---
[INFO] fetched data logged to text files under '/home/labex/.local/share/sqlmap/output/127.0.0.1'
...
Este scan inicial é relativamente rápido e confirma a vulnerabilidade no parâmetro id.
Aumentar a Profundidade do Scan com --level=3
Nesta etapa, você aumentará a profundidade do scan definindo o nível para 3. Um nível mais alto instrui o sqlmap a realizar mais testes e verificar vulnerabilidades em locais adicionais.
--level=2adiciona testes para cabeçalhos HTTPCookie.--level=3adiciona testes para cabeçalhos HTTPUser-AgenteReferer.
Ao aumentar o nível, você está pedindo ao sqlmap para ser mais minucioso. Isso naturalmente aumentará o número de requisições e a duração do scan.
Agora, execute o scan novamente, mas desta vez adicione a opção --level=3:
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --level=3 --batch
Observe a saída. Você notará que o sqlmap agora menciona explicitamente testes em cabeçalhos como Cookie e User-Agent.
...
[INFO] testing for SQL injection on GET parameter 'id'
...
[INFO] testing for SQL injection on HTTP Cookie header
...
[INFO] testing for SQL injection on HTTP User-Agent header
...
sqlmap identified the following injection point(s) with a total of YYY HTTP(s) requests:
---
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1 AND 2129=2129
...
---
[INFO] fetched data logged to text files under '/home/labex/.local/share/sqlmap/output/127.0.0.1'
...
Embora nossa aplicação simples não seja vulnerável através desses cabeçalhos, uma aplicação do mundo real pode ser. Você deve notar que o número total de requisições HTTP (YYY) é maior do que na etapa anterior (XXX).
Aumentar a Invasividade do Scan com --risk=2
Nesta etapa, você explorará o parâmetro --risk. Este parâmetro controla o "perigo" dos payloads utilizados.
--risk=1(Padrão): Utiliza payloads majoritariamente inofensivos.--risk=2: Adiciona testes de injeção "time-based blind" com consultas pesadas. Estes podem impor uma carga significativa no servidor de banco de dados.--risk=3: Adiciona testes de injeção SQL baseados emORe outros payloads potencialmente destrutivos que poderiam modificar dados.
Um risco maior pode descobrir vulnerabilidades que testes mais seguros poderiam não detectar, mas também aumenta a chance de interromper o sistema alvo. Deve ser usado com cautela.
Vamos executar um scan com um risco elevado. Voltaremos ao nível padrão (1) para isolar o efeito do parâmetro de risco.
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --risk=2 --batch
Durante este scan, você verá o sqlmap empregando técnicas "time-based" mais agressivas. Esses payloads funcionam fazendo o banco de dados executar uma operação demorada (como uma função de benchmark ou sleep) e, em seguida, medindo o tempo de resposta do servidor para inferir informações.
...
[INFO] testing 'Boolean-based blind - WHERE or HAVING clause'
[INFO] testing 'Error-based - WHERE or HAVING clause'
[INFO] testing 'Time-based blind (heavy query)'
...
[INFO] GET parameter 'id' appears to be 'Time-based blind' injectable
...
O scan com --risk=2 é mais intensivo do que o scan padrão, mesmo no mesmo nível, porque os payloads em si são mais complexos.
Executar um Scan Combinando --level=5 e --risk=3
Nesta etapa, você combinará as configurações de nível e risco mais altas para o scan mais abrangente e agressivo possível.
--level=5: O nível mais alto. Testa todos os pontos de injeção possíveis, incluindo o cabeçalho HTTPHost.--risk=3: O risco mais alto. Utiliza payloads que podem potencialmente modificar entradas do banco de dados. Isso é perigoso e só deve ser usado em sistemas onde você tem permissão explícita para testes destrutivos.
Esta combinação resulta em um scan muito longo e intensivo. É a abordagem "tudo incluído", lançando todos os testes conhecidos contra o alvo.
Execute o seguinte comando. Esteja ciente de que este scan levará significativamente mais tempo do que os anteriores.
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --level=5 --risk=3 --batch
Você verá o sqlmap executando um número massivo de testes em todos os pontos de injeção concebíveis com seus payloads mais potentes.
...
[INFO] testing for SQL injection on GET parameter 'id'
...
[INFO] testing for SQL injection on HTTP Cookie header
...
[INFO] testing for SQL injection on HTTP User-Agent header
...
[INFO] testing for SQL injection on HTTP Referer header
...
[INFO] testing for SQL injection on HTTP Host header
...
[CRITICAL] OR-based injection tests might result in an update of all table rows. Continue? [y/N] y
...
Este scan demonstra a capacidade máxima do sqlmap, mas também destaca a importância de entender as compensações. Um scan como este é frequentemente impraticável e muito arriscado para engajamentos padrão.
Observar o Aumento de Payloads e Duração do Scan
Nesta etapa final, você refletirá sobre os resultados dos scans anteriores. Não há novos comandos para executar. O objetivo é entender o impacto do ajuste de level e risk comparando os resumos dos scans.
Se você revisar a saída do terminal de cada etapa, notará um padrão claro:
- Scan Padrão (
--level=1,--risk=1): A linha de base. Foi rápido e enviou o menor número de requisições. - Nível Aumentado (
--level=3): O número de requisições aumentou porque osqlmaptestou mais pontos de injeção (Cookie, User-Agent). A duração aumentou correspondentemente. - Risco Aumentado (
--risk=2): A duração do scan aumentou, não necessariamente devido a mais requisições, mas porque os payloads baseados em tempo são inerentemente lentos. - Máxima Agressividade (
--level=5,--risk=3): Este scan enviou um número vastamente maior de requisições e levou o maior tempo para ser concluído, por uma margem significativa.
Aqui está um resumo do comportamento esperado:
| Parâmetros do Scan | Pontos de Injeção Testados | Tipos de Payload | Duração Relativa |
|---|---|---|---|
| Padrão (L1, R1) | GET/POST | Boolean básico, erro | Curta |
--level=3 |
GET/POST, Cookie, User-Agent | Boolean básico, erro | Média |
--risk=2 |
GET/POST | Adiciona "time-based" pesados | Média-Longa |
--level=5 --risk=3 |
Todos os cabeçalhos | Adiciona baseados em OR, empilhados | Muito Longa |
A principal conclusão é que existe uma troca direta. Aumentar level e risk fornece testes mais completos e uma maior chance de encontrar vulnerabilidades obscuras, mas isso tem o custo de um tempo de scan significativamente aumentado e um risco maior de interromper o sistema alvo.
Resumo
Neste laboratório, você explorou com sucesso como ajustar a agressividade dos scans do sqlmap usando os parâmetros --level e --risk.
Você aprendeu que:
--levelcontrola o escopo do scan, determinando quais partes de uma requisição HTTP são testadas quanto a vulnerabilidades. Níveis mais altos são mais abrangentes.--riskcontrola a intrusividade do scan, determinando os tipos de payloads SQL utilizados. Riscos mais altos são mais propensos a encontrar vulnerabilidades, mas podem ser perigosos para o banco de dados alvo.- As configurações padrão (
level=1,risk=1) são projetadas para serem rápidas e seguras. - Aumentar esses valores leva a tempos de scan mais longos e requer mais cautela.
Como uma boa prática, sempre comece com configurações de level e risk mais baixas. Aumente-as apenas se os scans iniciais não forem bem-sucedidos e você tiver autorização adequada para realizar testes mais agressivos. Parabéns por completar este laboratório!


