SQLインジェクション入門:仕組みと対策
応答の遅れで中身を測る
この回でやること
真偽の差すら画面に出ないとき。条件が真のときだけ応答を遅らせ、返る速さで1ビットを読みます。遅くても成立してしまう手を見ます。
- 読む 約 9 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
応答が返るまでの時間は、画面の反応が真でも偽でも同じときに残る、最後の観測点です。この回は条件が真のときだけ応答を遅らせて、返る速さから中身を1ビットずつ読む手を、同じ users テーブルで見ます。
読み終えると、何も表示していないことが守りにならない理由を、時間という観測点から説明できるようになります。
反応が全部同じでも、時間は作れる
真でも偽でも同じ画面が返るなら、前回の yes・no は投げられません。けれど、条件が真のときだけ数秒待たせる細工を混ぜられます。「admin のパスワードの1文字目が m より後ろなら、3秒待て」を仕込むと、質問の答えが応答の速さへ移ります。
プレーンテキスト
SELECT name, role FROM users
WHERE name = 'tanaka'
AND (1文字目が 'm' より後ろ なら 3秒待つ)画面は同じでも、返るまでの時間だけが2通りに分かれます。速く返れば偽、遅れて返れば真。この差を測れば、前回と同じ yes・no を続けられます。
遅いが、確実に終わる
1回の質問に数秒かかります。1文字あたり数回、それを文字数分。パスワード全体だと数十分から数時間に届くこともあります。それでも機械が待てば済む話で、遅さそのものは抑止になりません。時間さえ観測点になれば、他に何も漏れていなくても中身は出ます。
画面の値、真偽の反応、応答の時間。攻撃側に要るのは、中身によって何か1つ変わるものが1つだけです。時間は最後の砦のようでいて、消すのが難しい観測点です。だから「何も表示していない」は守りになりません。
1回なら気づきにくいです。けれど何百回と続く不自然な遅延は、記録を見れば異常として残ります。時間ベースは他に観測点が無いときに選ぶ、遅くて目立つ最後の手段です。裏を返せば、そこまでしても成立してしまうということでもあります。
直す方向と、この講座で試せる範囲
時間を作る関数は製品ごとに違い、条件で分岐させる書き方もさまざまです。この講座の演習で扱うのはログインの通り抜けまでで、評価器は待ち時間を作る関数を走らせません。ここから先は考え方だけを押さえます。根の直し方は前回までと変わらず、値を命令から切り離して渡せば、括弧の中の条件も分岐も差し込めなくなり、真偽の枝も時間の枝も生まれません。応答時間をならすような小手先ではなく、境界を引き直すのが本筋です。手を動かすなら、自分で用意した練習用のデータベースで、条件を真と偽にしたときの応答時間の差を測ります。試すのは自分が権限を持つ練習用の環境だけにします。