5 votes

Commentaires conditionnels/exécutables dans MySQL/SQL Server

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.

1voto

Pondlife Points 10490

Je ne suis pas sûr que ce soit ce dont vous avez besoin, mais si j'ai bien compris, vous voulez qu'une instruction SQL renvoie des résultats différents sur MySQL et sur SQL Server (si c'est ce que signifie "se comporte différemment" ?). Si c'est le cas, vous pouvez commencer par utiliser une fonction système qui a le même nom et la même syntaxe mais un comportement différent, comme par exemple SUBSTRING() :

select substring('test', -1, 1)

Sur SQL Server, cela renvoie une chaîne vide, mais sur MySQL, cela renvoie t . Je ne sais pas si utiliser SUBSTRING() est viable dans votre cas, mais sinon vous pouvez trouver une autre fonction plus facile à utiliser dans votre requête.

Si cela ne vous aide pas du tout, je vous suggère de fournir plus de détails sur les limitations dont vous disposez pour construire votre requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X