
Ferramenta de Exploração de Injeção SQL
#BBQSQL# Uma Ferramenta de Exploração de Injeção SQL Cega
A injeção SQL cega pode ser um saco para explorar. Quando as ferramentas disponíveis funcionam, funcionam bem, mas quando não funcionam, você tem que escrever algo personalizado. Isso é demorado e tedioso. O BBQSQL pode ajudar a resolver esses problemas.
O BBQSQL é um framework de injeção SQL cega escrito em Python. É extremamente útil ao atacar vulnerabilidades complicadas de injeção SQL. O BBQSQL também é uma ferramenta semiautomática, permitindo bastante personalização para aqueles achados de injeção SQL difíceis de acionar. A ferramenta foi construída para ser independente de banco de dados e é extremamente versátil. Ela também possui uma interface de usuário intuitiva para facilitar a configuração de ataques. O gevent do Python também é implementado, tornando o BBQSQL extremamente rápido.
Tentamos escrever a ferramenta de forma que seja muito autoexplicativa ao configurar um ataque na interface. No entanto, para ser completo, incluímos um Readme detalhado que deve fornecer informações adicionais sobre os detalhes de cada opção de configuração. Uma coisa a notar é que toda opção de configuração na interface tem uma descrição associada, então se você optar por iniciar a ferramenta sem ler esta página, poderá se virar em um ataque.
Semelhante a outras ferramentas de injeção SQL, você fornece certas informações da solicitação.
Deve fornecer as informações usuais:
Em seguida, especifique onde a injeção será aplicada e qual sintaxe estamos injetando. Continue lendo para mais detalhes.
Isso deve ser direto, mas nada é. Tente executar:
sudo pip install bbqsql
Se isso não funcionar, você pode instalar a partir do código-fonte. A ferramenta requer gevent e requests.
No menu você verá um local para as opções do BBQSQL. Aqui você especifica as seguintes opções:
Isso é descrito em mais detalhes abaixo na visão geral da sintaxe de consulta.
O nome de um arquivo para exportar os resultados. Deixe em branco se não quiser salvar em arquivo.
O BBQSQL utiliza duas técnicas ao conduzir um ataque de injeção SQL cega. A primeira e padrão é a binary_search. Veja a Wikipedia para mais informações.
A segunda técnica que você pode usar é a frequency_search. A busca por frequência baseia-se em uma análise da língua inglesa para determinar a frequência com que uma letra ocorre. Este método de busca é muito rápido contra dados não entrópicos, mas pode ser lento contra dados não-ingleses ou ofuscados.
Você pode especificar binary_search ou frequency_search como valor para este parâmetro.
Isso especifica o tipo de injeção SQL que você descobriu. Aqui você pode definir qual atributo da resposta HTTP o bbqsql deve analisar para determinar verdadeiro/falso.
Você pode especificar: status_code, url, time, size, text, content, encoding, cookies, headers ou history
Se você identificou injeção SQL que resulta em um código de status de servidor diferente, defina 'status_code' aqui. Se o cookie for diferente, defina 'cookie'. Se o tamanho da resposta for diferente, defina 'size'. Você entendeu a ideia.
A concorrência é baseada na biblioteca gevent em Python. Funcionalmente, parece agir como threading, mas os detalhes de como isso funciona podem ser vistos em nossa palestra DefCon aqui [inserir link aqui]. Esta configuração controla a quantidade de concorrência para executar o ataque. É útil para limitar requisições e acelerar os tempos de ataque. Para servidores web de alto desempenho como nginx, conseguimos definir a concorrência para 75. Por padrão, é definido como '30'.
Se você encontrar uma vulnerabilidade de injeção SQL que tenha algumas peculiaridades estranhas (como certos caracteres não podem ser incluídos ou funções como ASCII/CHAR não funcionam), provavelmente você já se viu escrevendo algum tipo de script com sua sintaxe de injeção personalizada. O BBQSQL elimina a parte de script e fornece uma maneira de você colar sua sintaxe de consulta personalizada e explorar com facilidade.
O campo de consulta é onde você construirá sua consulta usada para exfiltrar informações do banco de dados. A suposição é que você já identificou a injeção SQL em um parâmetro vulnerável e testou uma consulta que é bem-sucedida.
Abaixo está um exemplo de consulta que você pode usar para construir sua consulta.
Neste exemplo, o atacante está tentando selecionar a versão do banco de dados:
vulnerable_parameter'; if(ASCII(SUBSTRING((SELECT @@version LIMIT 1 OFFSET ${row_index}) , ${char_index} ,1))) ${comparator:>}ASCII(${char_val}) WAITFOR DELAY '0\:0\:0${sleep}'; --
A sintaxe da consulta é baseada em espaços reservados que informam ao BBQSQL como executar o ataque.
Você precisa fornecer os seguintes espaços reservados de informações para que o ataque funcione. Depois de colocá-los em sua consulta, o bbqSQL fará o resto:
${row_index}: Isso informa ao bbqSQL para iterar linhas aqui. Como estamos usando LIMIT, podemos ver n número de linhas dependendo do valor de ${row_index}.
${char_index}: Isso informa ao bbqSQL qual caractere da subconsulta consultar.
${char_val}: Isso informa ao bbqSQL onde comparar os resultados da subconsulta para validar o resultado.
${comparator}: É assim que você informa ao BBQSQL como comparar as respostas para determinar se o resultado é verdadeiro ou não. Por padrão, o símbolo > é usado.
${sleep}: Isso é opcional, mas informa ao bbqSQL onde inserir o número de segundos para pausar ao realizar injeção SQL baseada em tempo.
Nem todos esses espaços reservados são necessários. Por exemplo, se você descobriu injeção SQL cega baseada em booleano, pode omitir o parâmetro ${sleep}.
O BBQSQL tem muitos parâmetros HTTP que você pode configurar ao configurar seu ataque. No mínimo, você deve fornecer a URL, onde deseja que a consulta de injeção seja executada e o método. As seguintes opções podem ser definidas:
Você especifica onde deseja que a consulta de injeção seja inserida usando o template ${injection}. Sem o template de injeção, a ferramenta não saberá onde inserir a consulta.
Forneça arquivos para serem enviados com a requisição. Defina o valor como o caminho e o BBQSQL cuidará de abrir/incluir o arquivo.
Cabeçalhos HTTP a serem enviados com as requisições. Pode ser uma string ou um dicionário. Por exemplo:
{"User-Agent":"bbqsql"}
ou
"User-Agent: bbqsql"
Um dicionário ou string de cookies a serem enviados com a requisição. Por exemplo:
{"PHPSESSIONID":"123123"}
ou
PHPSESSIONID=123123;JSESSIONID=foobar
Especifique uma URL para onde as requisições devem ser enviadas.
Isso é um booleano que determina se os redirecionamentos HTTP serão seguidos ao fazer requisições.