WebGoatを用いたクロスサイトスクリプティング #03

演習: Phishing with XSS

 最後に,WebGoatの「Phishing with XSS」を解きます.「Phishing with XSS」では,どのようにフィッシングが行われるのかを学ぶことができます.

フィッシング(Phishing)とは,金融機関などを騙ったWebサイトやメールによって,そのユーザIDやパスワードなどを入力させ,盗み出そうとする詐欺のことです. (セコムトラストシステムズ BCP用語辞典より引用)

これらのユーザIDやパスワードは「クレデンシャル情報」と呼ばれます.

 この問題での目標は,XSSとHTMLの挿入によって,下の3つを達成することです.

  • クレデンシャル情報を入力することができるようなHTMLを挿入すること
  • クレジデンシャル情報を修正できるようにするためのjavascriptを加えること.
  • クレジデンシャル情報を http://localhost/webgoat/catcher?PROPERTY=yes...にポストすること.

考え方

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

LAB: SQL Injection

 WebGoatの「String SQL Injection」及び「Numeric SQL Injection」を終えたら,次に「LAB: SQL Injection」に取り組みます.この問題は全部で4つのステージで構成されています.

  • stage1
  • stage2
  • stage3
  • stage4

Stage1

問題

 ステージ1ではString SQL Ingectionを用いてユーザー認証を回避することが目標です.「Goat Hills Financial Human Resources」という架空の会社でのサービスで.社長である「Neville」という人のアカウントに正しいパスワードなしでログインします.Nevilleのアカウントでは,全プロフィールを閲覧できたり,検索・アカウント作成・アカウント消去ができます.

 今回も手法としては「String SQL Injection」と同じなので試して見ましょう.

 

解答

  1. ユーザー名を「Neville Barthlomew」にする.このとき,パスワードは入れず,Loginボタンも押さない.

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

  2. firefoxのメニューバーから,ツール「Tamper Data」を選択する.
  3. 出てきた「Tamper Data - Ongoing requests」のウィンドウの左上にある「Start Temper」ボタンを押す.

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

  4. 出てきた「Tamper with request?」のウィンドウの「Tamper」ボタンをクリックする.

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

  5. 出てきた「Tamper Popup」のウィンドウをみるとパスワードを入力するフィールドがあることがわかる.ここに「String SQL Injection」と同じように「x' OR 'a'='a」を入力し,「ok」を押す.

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

  6. 正解を知らせる表示が出ることを確認する.実際に,全スタッフのプロフィールを表示・作成・削除できることを確かめる.
    ※ 他のポップアップが出た場合は,「temper」→「ok」の順でポップアップを消す.他のリクエストをtamperするか否かを聞いているだけのポップアップなので,対応しない場合処理が止まってしまう.

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

 

Stage2 

問題 

 Parameterized Query #1 (解説省略)

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

前回の続きから解説します.

SQL Injectionとは

SQLインジェクションとは,データベース駆動型のサイトに対して行われる攻撃行為です.攻撃には,OSコマンドやスクリプト,データベースクエリなどが用いられます.SQLインジェクションを防ぐには,このような入力データを確認する必要があります.

 

String SQL Injection

 初めに,String SQL Injectionの練習としてWebGoatの「String SQL Injection」で提供されている問題に取り組みます.この問題では,SQLインジェクションを行って,登録されたクレジットカード番号を表示させることが目標です.「与えられたフォームは本来自分のクレジットカード番号しか表示できない」というシステムをどう利用するかがポイントです.解答は,「Solution Videos」で確認することもできます.

考え方

 ここでは,SQLについてほとんど知識がない,という状態を想定して,知識がなくてもできるアプローチ方法を考えます.主に,「わからなければ逐次調べる」というやり方です.今回の問題の指示通り「Smith」という名前を用いてSQLインジェクションして見ます.想定している方法は下のリスト通りです.

  • 書かれているSQL文を読む
  • 与えられた名前を試してみる
  • どのようになればいいか考える

1.書かれているSQL文を読む

 初めに,ヒントとして与えられている『SELECT * FROM user_data WHERE last_name = ?』というSQL文について調べてみます.「SELECT」をキーワードにして調べるとに下のリンクが出てくるので参考にします.

SQL講座|SELECT文とは

リンクより,SQLでは下のようなルールでデータベースを検索できることがわかります.

  • SELECT 〇〇: 表示するデータベースの列を選ぶ.全ての列の場合は〇〇の箇所に「*」を入れる.
  • FROM ▲▲: ▲▲という表にある〇〇という列を表示する.
  • WHERE ◇◇: 検索する際の条件

 よって,今回与えられたSQLでは,「サイトのユーザーデータが入っている表(user_data)中の,苗字(last_name)が?である全ての列を表示する」という意味であることが分かります.

2. 与えられた名前を試してみる

 次に,与えられたSQL文でどのように処理されているかを確認するために,与えられたユーザー名「Smith」を入力してみます.

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

 すると,下のようにSmithさんのクレジットカード情報が表示されました.SQL文を見てみると,Smithと入力したことで実際に「サイトのユーザーデータが入っている表(user_data)中の,苗字(last_name)がSmithである全ての列を表示する」処理がなされたことが分かります.

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

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

 では,元のSQL文を利用してSQLインジェクションを行う場合には,?に何を入力すれば良いでしょうか.今回の場合,抽出条件をWHEREで抽出する際に,一工夫すれば良さそうだと考えられます.

 

解答 − シングルクォートによる攻撃

 SQLインジェクションの基本の攻撃文として,「'(シングルクォート)」を用いる方法があります.今回の場合は,?の部分に「' OR 'a' ='a」を入力すれば解決することがわかります.

 ******

 SQLインジェクションの有名な攻撃文は,以下のリンク等で確認できます.ただ,種類が多いので,参考程度の確認で大丈夫だと思います.

SQL Injection Cheat Sheet | Netsparker

まとめ

 復習として実践するための課題としては,下のような内容が挙げられます.

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

はじめに

1. Oracle VM VirtualBoxを起動します.

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

 

2.  起動した後に表示されるIPアドレスを確認します.今回の場合は,http://192.168.56.101だとわかります.

 

3. ブラウザを起動し,先ほど確認したIPアドレスを入力してOWASP BWAにアクセスします.

 

4. OWASP BWAの中のOWASP WebGoatをクリックします.この時,ユーザー名とパスワードを聞かれるので,下の通りに入力します.

 ユーザー名: root

 パスワード: owaspbwa

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

 

4. 下のような画面が開きます.

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