- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
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.
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**.
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.
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:
* Nomes comuns de tabelas do Sqlmap: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
* Há outra lista em [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
Já discutimos a [**técnica de encadeamento de iguais**](ms-access-sql-injection.md#chaining-equals-+-substring) **para extrair dados das tabelas atuais e de outras tabelas**. Mas existem outras maneiras:
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.
A partir daqui, você pode ver uma consulta para obter os nomes das tabelas: [**aqui**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database)
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.
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:
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**.
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.
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) é 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.