tiga:
例えば、PostgreSQLの場合、以下のようなサブクエリを条件文として追加することで、テーブル名の1文字目を取得することができるのである。
SELECT login_id FROM user_table WHERE mail = ‘[email protected]’ and ascii(lower(substring((SELECT min(TABLENAME) FROM pg_tables whereTABLENAME !~ ‘^(pg_|sql_)’),1,1))) >110 - ’ ;この条件式では、サブクエリとしてSELECT文を挿入し、テーブル名を取得している。次にsubstring関数によって、テーブル名の1文字目を取得する。その取得した文字を判別しやすいようにlower関数で小文字に変換した後、ascii関数によって数字に変換し、数値「110」との比較を行っている。
ここで利用している比較対象の数字「110」は、asciiコードで小文字の「n」を示している。仮にテーブル名がアルファベットのみの場合、「[email protected]」が登録されている状態でこの条件式を挿入し、そのまま処理が進めば「偽」、つまりテーブル名の1文字目はa~mの範囲ということが分かる。逆に、「メールアドレスが重複しています」というエラーメッセージが表示されれば「真」、つまりテーブル名の1文字目はn~z範囲、というように絞り込んでいくことが可能となる。
これを繰り返し行うことで、テーブル名の全体を取得し、さらにはサブクエリを変化させることで深く掘り下げていくことが可能になる。この手法はブラインドSQLインジェクション(Blind SQL Injection)と呼ばれる。
6ヶ月前 | 固定リンク | 2011年 10月 27日 | 

