Avant de commencer, je me rends compte que ce que j'essaie de faire est bizarre et bidon. C'est juste pour un pen test isolé, spécifiquement une injection SQL.
Ce que je dois faire, c'est écrire une instruction SQL qui se comporte différemment lorsqu'elle est exécutée sur une base de données MySQL et lorsqu'elle est exécutée sur une base de données SQL Server.
Modifier
La limitation de la requête que je peux construire est que je ne peux modifier que ce qui se trouve après la clause "WHERE id =". Je ne peux modifier aucune autre partie de la requête. Plus précisément, j'ai besoin de pouvoir attacher un " UNION SELECT * FROM some_other_table" qui ne sera exécuté que par le serveur SQL à la fin de mon entrée.
Cela ferait évidemment exploser MySQL car il n'a pas les tables que je réunis.
Plus précisément :
SELECT * FROM USERS
WHERE id = My input -> (MySQL code: 'x' or 1=1 )
(MSSQL code 'x' or 1=1 UNION SELECT * FROM table)
Le problème est que si l'une ou l'autre des instructions est exécutée par la base de données à laquelle elle n'était pas destinée, elle explose (et pas de la manière dont j'en ai besoin).
Cela m'a conduit à la découverte de Commentaires conditionnels/exécutables dans MySQL .
SELECT * FROM USERS
WHERE id = /*! This will be executed but only by mysql */
C'est génial mais je ne peux toujours pas empêcher MySQL d'exécuter MSSQL ! Je peux seulement empêcher MSSQL d'exécuter le code MySQL.
Mon idée initiale était d'avoir un commentaire à l'intérieur de la conditionnelle MySQL comme :
SELECT * FROM USERS
WHERE id = /*! 4 or 1=1 --*/ MSSQL code that is ignored by mysql
Mais le système génère une erreur en me demandant de vérifier ma syntaxe sur une ligne où il n'y a rien près de ''.
Je ne comprends pas vraiment pourquoi cela ne fonctionne pas, mais je sais que cela ne fonctionne avec aucune forme de commentaire MySQL que je connais (j'ai essayé #, /*).
Y a-t-il un moyen de faire fonctionner mon étrange instruction SQL ? Ou existe-t-il un moyen de faire un commentaire conditionnel dans MSSQL ? J'ai juste besoin que MySQL ignore tout ce qui est conditionnel, mais je n'ai aucune idée de la façon dont cela peut se faire sans commentaire.