WebGoatを用いたSQLインジェクション #03
次に,「Numeric SQL Injection」に取り組みます.
例題: Numeric SQL Injection
WebGoatの「Numeric SQL Injection」で提供されている問題に取り組みます.この問題では,SQLインジェクションを行って,すべての場所の天気情報を表示させることが目標です.与えられた元のフォームでは,一か所の天気情報しか表示されません.
考え方
基本的には,「String SQL Injection」の場合と同じような解き方です.ただし,今回の場合は,SQL文を挿入することができるようなフォームが与えられていません.そこで,firefoxのアドオンの1つである「Tamper Data」を用いてフォームを出すところがポイントになります.考える手順としては下のようです.
- 書かれているSQL文を読む
- 与えられた地名で試してみる
- どのようになればいいか考える
1. 書かれているSQL文を読む
初めに,ヒントとして与えられている『SELECT * FROM weather_data WHERE station = [station]』というSQL文について考えます.前回の「String SQL Injection」の解説から,今回与えられたSQL文では,「サイトの天気情報の表(weather_data)の中の,ユーザーによって選択された場所(station)と一致する場合,全ての列を表示する」という処理が行われていることが分かります.
2. 与えられた地名で試してみる
次に,与えられたSQL文でどのように処理されているかを確認するために,与えられた地名「Columbia」を選択して,「Go!」を押して試してみます.
すると,STATIONという列には数字が記入されており,地名には番号が付けられて管理されていることが分かります.SQL文を見てみると,Columbiaを選択したことで実際には「サイトの天気情報の表(weather_data)の中の,ユーザーによって選択された地名番号101(station)と一致する場合,全ての列を表示する」処理がなされたことが分かります.
3.どのようにすればよいか考える
では,元のSQL文を利用してSQLインジェクションを行う場合には,[station]に何を入力すれば良いでしょうか.課題としては,下の二つが挙げられます.
- 「String SQL Injection」の場合で用いた方法を利用する.
- フォームを使うために「Temper Data」を利用してフォームを表示させる.
解答 - ORを利用した抽出条件の設定
Tamper Dataを用いたフォームの表示
1. firefoxのメニューバーにある「ツール」から「Tamper Data」を選択します.
2. 「Tamper Data - Ongoing requests」というウィンドウが出るので,その左上にある「Start Tamper」をクリックする.元のfirefoxのウィンドウに表示されている「Go!」を押す.
3. 「Tamper with request?」というウィンドウが出てくるので「Tamper」をクリックする.
4. 「Tamper Popup」というウィンドウが出てくる.ウィンドウの右側に,stationというパラメーターに与えるための入力フォームが表示されていることを確認する.この時,元から入力されている地名番号は101になっている.
SQLインジェクション
1. 先程の入力フォームに「101 OR 1=1」を入力し,OKを押す.
2. 「Congratulations...」と表示されたら,SQLインジェクションは成功です!