MS Access SQL Injection
Playground Online
Limitações do BD
Concatenação de Strings
A concatenação de strings é possível com os caracteres & (%26)
e + (%2b)
.
Comentários
Não existem comentários no MS Access, mas aparentemente é possível remover o último de uma consulta com um caractere NULL:
Se isso não estiver funcionando, você sempre pode corrigir a sintaxe da consulta:
Consultas Empilhadas
Elas não são suportadas.
LIMIT
O operador LIMIT
não é implementado. No entanto, é possível limitar os resultados da consulta SELECT para as primeiras N linhas da tabela usando o operador TOP
. TOP
aceita como argumento um número inteiro, representando o número de linhas a serem retornadas.
Assim como o TOP
, você pode usar o LAST
que irá obter as linhas do final.
Consultas de UNIÃO/Subconsultas
Em um SQLi, você geralmente desejará de alguma forma executar uma nova consulta para extrair informações de outras tabelas. O MS Access sempre requer que em subconsultas ou consultas extras seja indicado um FROM
. Portanto, se você deseja executar um UNION SELECT
ou UNION ALL SELECT
ou um SELECT
entre parênteses em uma condição, você sempre precisa indicar um FROM
com um nome de tabela válido. Portanto, você precisa saber um nome de tabela válido.
Encadeando equals + Substring
Isso permitirá que você exfiltre valores da tabela atual sem precisar saber o nome da tabela.
O MS Access permite uma sintaxe estranha como '1'=2='3'='asd'=false
. Como geralmente a injeção de SQL estará dentro de uma cláusula WHERE
, podemos abusar disso.
Imagine que você tenha uma injeção de SQL em um banco de dados MS Access e saiba (ou tenha adivinhado) que um nome de coluna é username, e esse é o campo que você deseja exfiltrar. Você pode verificar as diferentes respostas do aplicativo da web quando a técnica de encadeamento de equals é usada e potencialmente exfiltrar conteúdo com uma injeção booleana usando a função Mid
para obter substrings.
Se você conhece o nome da tabela e coluna para fazer dump, você pode usar uma combinação entre Mid
, LAST
e TOP
para vazar todas as informações via SQLi booleano:
Sinta-se à vontade para verificar isso no playground online.
Forçando Nomes de Tabelas
Usando a técnica de encadeamento de iguais, você também pode forçar nomes de tabelas com algo como:
O seguinte é conteúdo de um livro sobre técnicas de hacking. O seguinte conteúdo é do arquivo pentesting-web/sql-injection/ms-access-sql-injection.md.
Translate the relevant English text to Portuguese and return the translation keeping excatly the same markdown and html syntax.
Sinta-se à vontade para verificar isso no playground online.
Nomes comuns de tabelas do Sqlmap: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
Há outra lista em http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Forçando Nomes de Colunas
Você pode forçar os nomes das colunas atuais com o truque de encadeamento de iguais com:
Ou com um group by:
Ou você pode fazer força bruta nos nomes das colunas de uma tabela diferente com:
Despejando dados
Já discutimos a técnica de encadeamento de iguais para despejar dados das tabelas atuais e de outras. Mas existem outras maneiras:
Resumidamente, a consulta utiliza uma declaração "se-então" para acionar um "200 OK" em caso de sucesso ou um "500 Internal Error" caso contrário. Aproveitando o operador TOP 10, é possível selecionar os primeiros dez resultados. O uso subsequente do LAST permite considerar apenas a 10ª tupla. Com base nesse valor, usando o operador MID, é possível realizar uma simples comparação de caracteres. Alterando adequadamente o índice de MID e TOP, podemos extrair o conteúdo do campo "username" para todas as linhas.
Baseado em Tempo
Outras Funções Interessantes
Mid('admin',1,1)
obter subcadeia a partir da posição 1 com comprimento 1 (posição inicial é 1)LEN('1234')
obter comprimento da stringASC('A')
obter valor ASCII do caractereCHR(65)
obter string a partir do valor ASCIIIIF(1=1,'a','b')
se entãoCOUNT(*)
Contar número de itens
Enumerando tabelas
A partir daqui você pode ver uma consulta para obter os nomes das tabelas:
No entanto, observe que é muito comum encontrar Injeções SQL onde não se tem acesso para ler a tabela MSysObjects
.
Acesso ao Sistema de Arquivos
Caminho Completo do Diretório Raiz da Web
O conhecimento do caminho absoluto do diretório raiz da web pode facilitar ataques adicionais. Se os erros da aplicação não estiverem completamente ocultos, o caminho do diretório pode ser descoberto tentando selecionar dados de um banco de dados inexistente.
http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
O MS Access responde com uma mensagem de erro contendo o caminho completo do diretório da web.
Enumeração de Arquivos
O seguinte vetor de ataque pode ser usado para inferir a existência de um arquivo no sistema de arquivos remoto. Se o arquivo especificado existir, o MS Access aciona uma mensagem de erro informando que o formato do banco de dados é inválido:
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
Outra maneira de enumerar arquivos consiste em especificar um item de banco de dados.tabela. Se o arquivo especificado existir, o MS Access exibe uma mensagem de erro de formato de banco de dados.
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00
Adivinhação do Nome do Arquivo .mdb
O nome do arquivo do banco de dados (.mdb) pode ser inferido com a seguinte consulta:
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
Onde name[i] é um nome de arquivo .mdb e realTable é uma tabela existente no banco de dados. Embora o MS Access sempre acione uma mensagem de erro, é possível distinguir entre um nome de arquivo inválido e um nome de arquivo .mdb válido.
Quebrador de Senhas .mdb
Access PassView é uma ferramenta gratuita que pode ser usada para recuperar a senha principal do banco de dados do Microsoft Access 95/97/2000/XP ou Jet Database Engine 3.0/4.0.
Referências
Last updated