Calendar参戦です。GMOアドマーケティングのN.Sです。この度Webアプリケーションの脆弱性診断について研修を受けたので、内容について共有します。ZAPという自動診断ツールを使って、診断から対策までの流れをざっと説明します。Suite:https://portswigger.net/burp/communitydownload対象サイト今回は脆弱性診断レッスン用のサイト「WebGoat」をローカル環境に構築して利用します。pullすることができます。webgoat/webgoat-8.0これで「http://localhost:10080/WebGoat」にアクセスし、ログイン画面に入れればOKです。(入れない場合は、ポートフォワーディングが8080に向いてないか、アドレスに「/WebGoat」を付けてないことが多いです。環境ができたら、早速診断していきましょう。ZAPというWebアプリケーション自動診断用のツールを使います。(Mac/Windows共に対応)引用元:https://github.com/zaproxy開くと以下のような画面が開きます。・1,2の結果が正しいのか手動で確認4.脆弱性対応1.静的スキャン対象Webサイトをクロールし、いくつURIがあるのかなど確認できます。この静的スキャンだけでも少し脆弱性は分析してくれるのですが、どちらかというと後ほど行う動的スキャンの事前準備の意味合いが強いです。ZAPをプロキシとして設定されたブラウザを立ち上げます。ZAPで保持してくれるため、ブラウザと自動診断の状態を連携させることができます。サインアップしてサイト内を巡回してみます。サイドバーとコンテンツエリアの画面構成になってます。※ここでサイドバーのボタンを全てクリックしておいてください。ZAPのサイト一覧がどんどん増えてくのが分かると思います。これを「手動クロール」といいます。ZAPのクロール機能である程度ページは網羅してくれるのですが、#(ハッシュタグ)や?(クエリパラメータ)で指定するページは自動クロールしてくれません。ZAPに認識させていく必要があるのです。手動クロールできたら、次は「スパイダー機能」で自動クロールさせましょう。開始位置に「http://localhost:10080/WebGoat」を指定し、「スキャン開始」します。自動クロール後、画面がログアウトされていますね。汗どうやらログアウトボタンを踏んでそれっきりになっているようです。これではクロールもままなりません。認証を突破する方法はいくつか存在するのですが、ここではForm-based認証を紹介します。「既定のコンテキスト」→「認証」にてログイン時の認証方法を設定しておきます。下の欄に「\Q/WebGoat/login\E」とありますが、これはログアウト状態を判定するため、ログアウト時のレスポンス内容を一部で良いので登録しています。(「\Q」と「\E」で囲む必要があります。)続いて突破用のユーザを作ります。「既定のコンテキスト」→「ユーザ」でログインできるユーザを登録します。再度スパイダーで自動クロールします。今度は「ユーザー」に今ほど登録したユーザを設定します。これでログアウトされずに自動クロールできました。検出URI数も結構増え、私の環境だと475件となりました。全てのURIを検出できたと思うので、次は動的スキャンを行います。2.動的スキャン動的スキャンでは、先程と同じコンテキストを使い、実際に攻撃コードを仕掛けていきます。その前に、動的スキャンは静的スキャンと何が違うのか簡単に説明します。静的スキャンは各ページを単にクロールしており、攻撃コードは送っていませんでした。動的スキャンはパラメータを付与・変更し、あらゆるパターンの攻撃コードをシステムに送り込みます。ログイン画面で以下のようなパラメータがあったとします。←間違っている上記内容では本来ログインできませんが、以下のようなパラメータに変更してログインできるか検査しています。—また、動的スキャンを行う前に以下のことをお願いします。・プロテクトモードに設定コンテキストで指定したURL内にのみ攻撃するモードです。「コンテキスト」→「コンテキストに含める」にて「http://localhost:10080/WebGoat.*」と登録してください。・実際に攻撃するため、データのバックアップを取るなど、万が一に備えておきましょう。・何万件というリクエストを投げるので、インフラ担当や場合によってはクラウド事業者に一言伝えておきましょう。(BANされる恐れがあります。)・IPS(侵入防止システム)をオフにしておきましょう。IPSでリクエストが遮断され、アプリケーションの診断ができなくなるのを防ぐため。それでは自動スキャンをかけます。下タブの「自動スキャン」→「新規スキャン」押下。(コンテキストやユーザはスパイダーと同じ設定にします。)自動スキャンを開始しますが、結構時間がかかります。WebGoatだと2〜3時間ほどかかりました。(ちなみにスキャン結果はセッションファイル化できるので、講習などではセッションファイルを渡しちゃうことも多いです。)2時間後・・・71171件のリクエストを投げてくれ、スキャン結果がずらずらと出ています。下のアラートタブを見ると、SQLインジェクションなどクリティカルな脆弱性が検知されています。ZAPは結構誤検知も多いため、本当に脆弱性が存在するのか手動で精査する必要があります。今回はXSSを精査してみます。(IPアドレスが先程までと変わっているのは気にしないでください(^_^;))対象のページはこんな感じのユーザIDを入力して、関連情報を出力するページのようです。Suiteというプロキシツールを使います。Suiteインストールサイトhttps://portswigger.net/burp/communitydownloadまずはプロキシの設定です。「Proxy」→「Options」でProxyListenerを設定します。手動プロキシを設定します。▼FireFoxの例プロキシを設定したブラウザで攻撃時のリクエストを投げます。Suiteがリクエストをインターセプトしてくれるので、パラメータを攻撃コードに変えてみます。WebGoat画面で攻撃コードが実行されたことが確認できました。この流れで各アラートに対して精査を行っていきます。(これがかなり時間がかかります。見つかったXSSに対して対応しましょう。▼XSSの場合だと、以下のような対応策を施すべきです。・ウェブページに出力する全ての要素に対して、エスケープ処理を施す。javascript:から始まるものは除外する・要素の内容を動的に生成しない。・スタイルシートを任意のサイトから取り込めるようにしない。メソッドを無効化する。対応策を考えるにあたり、よく参考にされるのは、以下の資料です。OWASPの公式サイトhttps://www.owasp.org/index.php/Main_PageIPAが発行している「安全なウェブサイトの作り方」https://www.ipa.go.jp/files/000017316.pdfまとめ標準的なWebアプリケーションのスキャン実施〜対策までをざっくりご説明しました。ZAPを使う際、適当にURLを入れてスキャンするだけでもある程度結果が出るので満足しがちなのですが、実はあまりページをカバーできてないというケースが多いようです。そのため、最初のクローリングでしっかりページを網羅させておくことが診断漏れを防ぐためのミソです。脆弱性診断は継続することが重要なのでCIに組み込んでおくと良いのですが、その辺の話もいずれブログにしたいところです。ここまで読んで頂き、ありがとうございました!明日は、【PHPとGo言語のURLパーサについて】についてのお話です。@gmoap_engineer本ブログで発信される情報は、各エンジニア個人の見解であり、弊社の公式見解ではありません。本ブログに掲載、引用等をしている商品またはサービス等の名称は、各社の商標または登録商標です。その他の事項について一切責任を負いかねます。発表する情報には注意を払っておりますが、公式発表、見解については、弊社WEBサイトおよびプレスリリースなどをご確認ください。GMOインターネットグループにおけるソーシャルメディア運用ポリシーについては次のページをご確認ください。本ブログに掲載のあるソフトウェアのダウンロードは自己責任で御願い致します。ソフトウェアのダウンロードの結果、ご利用者に何らかの損失・損害が生じたといえども、当社ではその責任を負いかねます。本ブログに掲載のあるソフトウェアを扱う際は、各ソフトウェアの公式リファレンスを参照のもとご使用下さい。ソフトウェアの実行の結果、ご利用者に何らかの損失・損害が生じたといえども、当社ではその責任を負いかねます。