
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.
Especifique um proxy HTTP a ser usado para a requisição como um dicionário. Por exemplo:
{"http": "10.10.1.10:3128","https": "10.10.1.10:1080"}
Especifique dados POST a serem enviados junto com a requisição. Pode ser uma string ou um dicionário. Por exemplo:
{"input_field":"value"}
ou
input_field=value
Especifique o método para a requisição HTTP. Métodos válidos são
'get','options','head','post','put','patch','delete'
Especifique uma tupla de nome de usuário e senha a ser usada para autenticação básica HTTP. Por exemplo:
("myusername","mypassword")
Depois de configurar seu ataque na interface, você pode exportar o arquivo de configuração. Você verá a opção ao executar a ferramenta. O arquivo de configuração exportado usa ConfigParser e é fácil de ler. Um exemplo de arquivo de configuração pode ser visto abaixo:
`[Request Config] url = http://example.com/sqlivuln/index.php?username=user1&password=secret${injection} method = GET
[HTTP Config] query = ' and ASCII(SUBSTR((SELECT data FROM data LIMIT 1 OFFSET ${row_index:1}),${char_index:1},1))${comparator:>}${char_val:0} # technique = binary_search comparison_attr = size concurrency = 30`
Isso é útil se você planeja retomar um ataque ou apenas ajustar a consulta sem passar pela trabalheira de reconfigurar todas as opções.
Você também pode importar uma configuração da linha de comando ou da interface do usuário. Para importar uma configuração da linha de comando, execute o bbqsl com as seguintes opções:
bbqsql -c config_file
Quando você carrega um arquivo de configuração, seja pela linha de comando ou pela interface do usuário, as mesmas rotinas de validação são executadas nos parâmetros para garantir que são válidos.
Às vezes você precisa fazer algo realmente maluco. Talvez precise criptografar os valores que entram em um campo antes de enviar a requisição ou talvez precise fazer uma codificação tripla de URL. Independentemente disso, essas situações tornam outras ferramentas impossíveis de usar. O BBQSQL permite definir funções "hook" que a ferramenta chamará em vários pontos durante a requisição. Por exemplo, você pode especificar uma função pre_request que recebe a requisição como argumento, faz as mutações necessárias e retorna a requisição modificada para ser enviada ao servidor.
Para implementar isso, crie um arquivo Python e especifique funções hook. Os nomes de funções disponíveis estão listados abaixo. No seu arquivo de hooks, você pode definir quantas ou quantas dessas funções desejar. Em seguida, na seção bbqsql_options do menu, você pode especificar a localização do seu hooks_file. O BBQSQL absorverá este arquivo e usará os hooks que você definiu.
É importante que as funções hook que você especificar tenham exatamente os nomes especificados abaixo, caso contrário o BBQSQL não saberá qual hook chamar. A função args recebe um parâmetro que contém todos os argumentos usados para criar a requisição HTTP. A função pre_request recebe o objeto da requisição antes de ser enviada. A função post_request recebe o objeto da requisição após ser enviada. A função response recebe o objeto de resposta antes de ser retornada ao BBQSQL.
Os seguintes hooks estão disponíveis:
args: Um dicionário dos argumentos sendo enviados para Request().
pre_request: O objeto Request, imediatamente antes de ser enviado.
post_request: O objeto Request, imediatamente após ser enviado.
response: A resposta gerada a partir de uma Request.
Para mais informações sobre como esses hooks funcionam e como seu dicionário de hooks deve ser, consulte a documentação da biblioteca requests sobre seus hooks
Um exemplo de arquivo de hooks pode ser assim:
# file: hooks.py
import time
def pre_request(req):
"""
this hook replaces a placeholder with the current time
expecting the url to look like this:
http://www.google.com?k=v&time=PLACEHOLDER
"""
req.url = req.url.replace('PLACEHOLDER',str(time.time()))
return req
Envie qualquer correção de bug ou solicitação de recurso para https://github.com/Neohapsis/bbqsql/
Por favor! Vemos isso como um ótimo ponto de partida para construir um framework de injeção SQL totalmente funcional. Sinta-se à vontade para bifurcar o código e podemos mesclar suas alterações se forem úteis.
BBQ é absolutamente delicioso e a injeção SQL também!