MacでOWASP ZAPを使ってBasic認証かけたサイトを簡易脆弱性診断

MacでOWASP ZAPをインストールして、https(SSL)のサイトを簡易的に脆弱性診断を実施した時のメモ。

■単語メモ
・OWASP オワスプ -> Open Web Application Security Project
・ZAP ザップ -> The Zed Attack Proxy

■環境
・MacBook Pro - macOS Sierra ver10.12.6
・ZAP 2.6.0

■インストールと起動
1.Macでアクセスしてそのままインストール
OWASP Zed Attack Proxy Project

2.起動後にJavaエラーが出てJavaか何かを更新した気がする(だいぶ前にやったので忘れた)

3.改めて起動

4.タブ「クイックスタート」をクリックし、https付きで診断したいURLを入力

5.次にBasic認証を突破するためのjsスクリプトを登録する。左上の「サイト」の右にある「+」をクリックして「スクリプト」をクリック。するとスクリプト関連が表示される。

6.左上のfaviconぐらい小さく3つ並んでいるアイコンの一番右側の紙と+が合体しているマークをクリック。マウスオーバーすると「新しいスクリプト」と表示されるやつです。

7.新規スクリプト画面で以下を選択する。

8.右上の空白の入力画面(実行ボタンの真下)に以下のコードを入力する。
-----------------------------------------------------------------------------------------
 org.parosproxy.paros.network.HttpSender.addListener(
   new org.zaproxy.zap.network.HttpSenderListener {
     getListenerOrder: function() {
       return 1;
     },
     onHttpRequestSend: function(msg, initiator) {
       msg.getRequestHeader().setHeader(
         // 第一引数は「Authorization」で、第二引数は「Basic 」と「ユーザー名:パスワード」をBase64でエンコードした文字列
         "Authorization", "Basic ZHJwaGxxxxxxBob3Rv"
         );
     },
     onHttpResponseReceive: function(msg, initiator) {
     }
 });
-----------------------------------------------------------------------------------------
コメント部分以外は以下サイトからコードを引用しています。
引用元:OWASP ZAPでBASIC認証を突破する

【注意】"Authorization", "Basic ZHJwaGxxxxxxBob3Rv"の「Basic 」の後の文字列は、「ユーザー名:パスワード」をBase64でエンコードした文字列を入れる必要があります。
エンコードは以下サイトで変換できます。
Encode to Base64 format
例えば、ユーザー名が「yamada」で、パスワードが「himitsu」だった場合は、「yamada:himitsu」を上記サイトに入力してエンコードしてください。
(jsでBase64エンコードするコードも少し書いたのですが、いまいち上手くいかず、結局Base64エンコードした文字列を直接入力した方が早かったです)

9.「実行」ボタンを押す。「実行」を押しても特に反応はないですが、ちゃんと反映されます。なお、コードがミスったりしていると下にあるウィンドウにエラー内容が表示されます。

10.「クイックスタート」タブに戻って「攻撃」ボタンを押すと診断開始。
なお、 Basic認証の通過に失敗していると、URL入力欄の下に401エラーが表示されます。

■参考にしたサイト
# 本当に助かりました。ありがとうございます。
OWASP ZAP で送信されるリクエストに自動で独自ヘッダを追加する方法
OWASP ZAPでBASIC認証を突破する
・ブラウザを通して診断する場合 → Mac版のOWASP ZAPで脆弱性チェックの設定
・StackOverflow - How to assign basic authentication header to XMLHTTPREQUEST?

req.setRequestHeader('Authorization','Basic ' + Base64StringOfUserColonPassword);

↑「Basic認証できない」の回答が上記

■(参考)診断の所要時間
以下、ZAPをデフォルト設定で診断した場合の所要時間
・Rails5で、Scaffoldで作った直後のアプリ(データのCRUDができる程度、6画面、そのほか少しカスタマイズした程度)を診断 → 約1時間かかった
・全て静的ファイル(HTML, js, CSS, 画像のみ、50画面、サーバーサイドで実行するスクリプトは一切なし) → 約5分

■(参考)ZAPの全般的な操作方法
IPAから、以下マニュアルのP.21「検査ツール実行及び検査結果」に画面付きで丁寧に操作説明が書かれています。それ以外にも診断ツールの比較やどのフェーズで診断すべきか、何が診断できるのか、も含めてわかりやすく説明されています。 # さすがIPA
IPA テクニカルウォッチ 「ウェブサイトにおける脆弱性検査手法」(ウェブアプリケーション検査編)」
※PDFが開きます