2009-09-03 9 views
0

これはセキュリティオーディットの一部なので、クエリを変更する方法はありません。FROM文の後にさらにテーブルを選択しますか?

基本的には、私が見つけたので、基本的には次のようになり、ステートメントの操作を可能にする欠陥である:

$query = "DELETE FROM `products` WHERE `products`.`whatever` = $variable"; 

これはPHPですので、私の知る限りでは、複数のクエリを実行する方法はありません。このSQLインジェクションを使用して、 "0 OR 1 = 1#"を実行してこのテーブルをクリアすることができました。

これはうまくいきますが、削除するテーブルをさらに選択することはできません。

これは私が何をしたいのか擬似コードでは、次のとおりです。

DELETE FROM `products` WHERE `products`.`whatever` = **0 OR 1=1, FROM `othertable` WHERE `othertable`.`othercolumn` = 0 OR 1=1** 

とにかく、このもっともらしいですか?

これが信頼できない場合は、これを使用できる方法はありますか?

+0

SQLインジェクションの方法やその防止方法をお尋ねしますか? – Corey

+0

SQLインジェクションクエリを構築する方法 –

答えて

2

同じDELETEステートメントに対して複数のFROM句を使用することはできません。そのため、あなたは望みどおりに行えません。 MySQLのDBは「ステートメントごとに複数のクエリを許可する」はオンになっていた場合、それは次のようになりたいように、あなたは、1クエリを削除し、最後にもう一つ上のタックを終了しようとすることができます:

DELETE FROM `products` WHERE `products`.`whatever` = **0 OR 1=1; DELETE FROM `othertable` WHERE `othertable`.`othercolumn` = 0 OR 1=1** 

をしかし、それはそれです。

+0

ええ、ありがとう。これはできないのですか?私はMySQLのバグを投稿するかもしれません。 xD –

+0

@Jose:MySQLの問題ではありません。 PHPドライバモジュールは単純にサポートしていません。 – zombat

+0

実際には、1つのクエリで複数のテーブルから削除できますが、FROM句で指定する必要があります(あとで遅れてしまいます)。 PHPは* 1つの呼び出しで複数のクエリを許可しないように設定されています*他の言語はもっと許容的かもしれません。 –

2

おそらく私はこの質問を完全に理解していないかもしれませんが、SQLコマンドを文字列として作成し、その文字列をMySQLデータベースに対して直接実行していると思います。

コマンドセパレータ(通常は ';')を使用して複数のコマンドを区切ることができます。したがって、あなたが好きなコマンドを実行することができます。this comicが適切に説明しています。

データベース構成で複数のコマンドがサポートされている場合(または将来誰かが今日の設定を変更した場合)、入力の一部としてコマンド区切り文字を使用しないようにする必要があります。このタイプの攻撃を防ぐために入力を消毒する方法については、this articleを参照してください。

+0

LOL、面白いxDです。しかし、私たちのビジネスに戻ると、セミコロンはMySQL API(PHPが使用する)内では動作しません。したがって、複数のコマンドを実行する方法はありません。 –

+0

はい、この回答は技術的に正しくありません。 PHP用の標準MySQLドライバモジュールは、クエリ内の複数のステートメントをサポートしていないので、データベース設定が何であるか、ステートメントをどのように分離するかは関係ありません。しかし、MySQLiのmulti_query()のような他のモジュールもこれをサポートしています。 – zombat

+0

実際、有効になっている場合は、サポートしています。 –

1

前述のとおり、複数のクエリは通常のMySQLドライバモジュールではサポートされていません。 the manual for mysql_queryから:

するmysql_query()のユニークなクエリ (複数のクエリがサポートされていません) 指定されたlink_identifierが指すサーバ上の現在アクティブなデータベースへ を送信します。あなたの注入作業のため残念ながら

DELETE構文は、複数のテーブルがFROM句でそれらを指定することにより、削除をサポートしています。あなたの注射された変数はWHEREの一部なので、あなたがすることができる最も大きな損害は指定された単一のテーブルにあります。

一般的な考え方とは異なり、実際にはPHPから複数のMySQL文を実行できますが、MySQLiなどの別のデータベースドライバモジュールを使用するだけで済みます。 MySQLi::multi_query()を参照してください。

+0

ええ、ありがとう、それは本当に有害ではありませんが、それは私が言及したように、セキュリティオーディションの一部です:P –

関連する問題