WebGoatを用いたSQLインジェクション #03

 

次に,「Numeric SQL Injection」に取り組みます.

例題: Numeric SQL Injection

 WebGoatの「Numeric SQL Injection」で提供されている問題に取り組みます.この問題では,SQLインジェクションを行って,すべての場所の天気情報を表示させることが目標です.与えられた元のフォームでは,一か所の天気情報しか表示されません.

f:id:y-cubed:20170612174527p:plain

考え方

 基本的には,「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!」を押して試してみます.

f:id:y-cubed:20170612174620p:plain

 すると,STATIONという列には数字が記入されており,地名には番号が付けられて管理されていることが分かります.SQL文を見てみると,Columbiaを選択したことで実際には「サイトの天気情報の表(weather_data)の中の,ユーザーによって選択された地名番号101(station)と一致する場合,全ての列を表示する」処理がなされたことが分かります.

3.どのようにすればよいか考える

 では,元のSQL文を利用してSQLインジェクションを行う場合には,[station]に何を入力すれば良いでしょうか.課題としては,下の二つが挙げられます.

  • 「String SQL Injection」の場合で用いた方法を利用する.
  • フォームを使うために「Temper Data」を利用してフォームを表示させる. 

解答 - ORを利用した抽出条件の設定

Tamper Dataを用いたフォームの表示

 

 1. firefoxのメニューバーにある「ツール」から「Tamper Data」を選択します.

f:id:y-cubed:20170612180031p:plain

2. 「Tamper Data - Ongoing requests」というウィンドウが出るので,その左上にある「Start Tamper」をクリックする.元のfirefoxのウィンドウに表示されている「Go!」を押す.

f:id:y-cubed:20170612180149p:plain

3. 「Tamper with request?」というウィンドウが出てくるので「Tamper」をクリックする.

f:id:y-cubed:20170612180655p:plain

4. 「Tamper Popup」というウィンドウが出てくる.ウィンドウの右側に,stationというパラメーターに与えるための入力フォームが表示されていることを確認する.この時,元から入力されている地名番号は101になっている.

f:id:y-cubed:20170612180856p:plain

SQLインジェクション

1. 先程の入力フォームに「101 OR 1=1」を入力し,OKを押す.

 

f:id:y-cubed:20170612181625p:plain

2. 「Congratulations...」と表示されたら,SQLインジェクションは成功です!

f:id:y-cubed:20170612181753p:plain