5

始める前に、私が試みていることが奇妙でハックであることを認識しています。これは、隔離された侵入テスト、特に SQL インジェクション用です。

私がしなければならないことは、MySQL データベースで実行するときと SQL Server データベースで実行するときの動作が異なる SQL ステートメントを作成することです。

編集

作成できるクエリの制限は、"WHERE id =" 句の後にあるものしか変更できないことです。クエリの他の部分に影響を与えることはできません。具体的には、SQL サーバーによってのみ実行される "UNION SELECT * FROM some_other_table" を入力の最後に添付できるようにする必要があります。

MySQL には私が結合しているテーブルがないため、これは明らかに MySQL を爆破します。

具体的には:

SELECT * FROM USERS 
WHERE id = My input -> (MySQL code: 'x' or 1=1 )
                       (MSSQL code 'x' or 1=1 UNION SELECT * FROM table)

問題は、いずれかのステートメントが意図されていないデータベースによって実行された場合、それが爆発することです (そして、私が必要とする方法ではありません)。

これにより、MySQL で Conditional/Executable Comments が発見されました。

SELECT * FROM USERS 
WHERE id = /*! This will be executed but only by mysql */

それは素晴らしいことですが、それでも MySQL が MSSQL を実行するのを防ぐことはできません! MSSQL が MySQL コードを実行するのを止めることしかできません。

私の最初のアイデアは、次のように MySQL 条件内にコメントを入れることでした。

SELECT * FROM USERS
WHERE id = /*! 4 or 1=1 --*/ MSSQL code that is ignored by mysql

しかし、これは「」の近くに何もない行で構文をチェックするようにというエラーをスローします。

なぜこれが機能しないのか完全には理解できませんが、私が知っているどの形式の MySQL コメントでも機能しないことはわかっています (試行 #、/*)。

奇妙な SQL ステートメントを機能させる方法はありますか? または、MSSQL で条件付きコメントを行う方法はありますか? 条件付きの後にMySQLが何も無視する必要があるだけですが、コメントなしでそれを実現する方法がわかりません。

4

1 に答える 1

1

これが必要かどうかはわかりませんが、正しく理解している場合は、MySQL と SQL Server で異なる結果を返す 1 つの SQL ステートメントが必要です (それが「異なる動作」を意味する場合)。その場合、開始する場所の 1 つは、次のように、名前と構文が同じで動作が異なるシステム関数を使用することですSUBSTRING()

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

SQL Server では空の文字列を返しますが、MySQL ではt. あなたのケースで使用できるかどうかはわかりませんSUBSTRING()が、そうでない場合は、クエリで使いやすい別の関数を見つけることができるかもしれません。

これがまったく役に立たない場合は、クエリを作成する際にどのような制限があるかについて、さらに詳細を提供することをお勧めします.

于 2012-11-15T19:50:59.703 に答える