見出し画像

Owasp Zapを使用したセキュリティチェックの実施

概要

インターネットの進化と普及に伴い、セキュリティの重要性はますます
高まっています。
企業や個人情報のデジタル化が進む中、サイバー攻撃やデータ侵害の脅威も増加しており、セキュリティの厳しさが求められる時代となりました。
IPAで発行されている「安全なウェブサイトの作り方」では、注意が必要な
項目として11もの項目が挙げられています。
そこで今回、OWASP ZAPを使用して、WEBアプリケーションのセキュリティチェックを行う手順について調査したので、概要を記事にまとめます。


プロフィール

定時制高校を卒業後、IT系の専門学校に入学し、プログラミングを学習。
2022年に専門学校を卒業後、スマートスケープ株式会社に新卒で入社。
直近の主な使用言語: Python、Javascript

アプリケーション診断、OWASP ZAPとは

OWASP ZAP(Zed Attack Proxy)は、オープンソースのセキュリティチェックツールで、Webアプリケーションのセキュリティテストと脆弱性診断を行うために使用されます。
OWASPは、[ Open Web Application Security Project ]の略で、セキュリティに関するベストプラクティスやガイドラインを提供する団体です。
OWASP ZAPはその中でもWebアプリケーションのセキュリティテストに
焦点を当てています。(ChatGPT出力)

OWASP ZAPでは「安全なウェブサイトの作り方」で挙げられている11項目うち9項目について、動的/静的スキャンで確認がされるようです。

OWASP ZAPで出来ること

内蔵されている機能には以下のようなものがある:

  • 傍受プロキシサーバー

  • 従来のウェブ・クローラーとAJAXウェブ・クローラー

  • 自動スキャナー

  • パッシブスキャナー

  • 強制ブラウジング

  • ファザー

  • WebSocketのサポート

  • スクリプト言語

  • プラグアンドハックのサポート

プラグイン・ベース・アーキテクチャーを採用し、オンライン「マーケットプレイス」で新機能の追加やアップデートが可能。GUIコントロールパネルは使いやすいと評判です。
全機能の広範なリスト: https://www.zaproxy.org/docs/desktop/start/features/

セキュリティチェックでは、静的スキャンを用いてURIのリストアップを行い、動的スキャンを用いてリストアップしたURIに対して実際に攻撃を仕掛けることで脆弱性を検出できる機能がメインで利用されるようです。

OWASP ZAPを使用するメリット

  1. 利用者が多く、ZAPを利用してセキュリティチェックを行っている記事が多くあるため、情報が豊富。

  2. UIがわかりやすく、使いやすい。

  3. 動的スキャンでの網羅的な攻撃だけでなく、ブレーキングを用いて手動でピンポイントに攻撃が再現できる。

  4.  無料で使用できる。

OWASP ZAPを用いたセキュリティチェックの流れ

  1. 事前準備
    ZAPやブラウザアプリをインストールし、プロキシ設定をする。
    加えてチェック対象となる画面やAPIのURIを事前にリストアップしておくことも重要です。

  2. 静的スキャン
    手動クローリング、スパイダー機能などを使用し、対象アプリのURIをOWASP ZAPに読み込ませる。
    攻撃は行っていませんが、この時点で検出される脆弱性もあるようです。

  3. 動的スキャン
    OWASP ZAPで読み込んだURIに対してあらゆる攻撃を仕掛け、脆弱性を検出する。
    実際に攻撃を仕掛けるため、SaaS等に攻撃を仕掛けないよう、注意が必要です。

  4. 結果の精査
    検出した脆弱性に対して同じ攻撃を仕掛け、脆弱性が正しいか誤検知か
    確認する。
    ZAPのブレーキング機能を用いて、リクエストをインターセプトし、
    bodyやheaderの内容を改ざんすることで、攻撃を再現できます。

ブレーキング(インターセプト)機能の使い方

Burp Suite等、別のツールを使用して、リクエストのインターセプトを行っている記事は多く見かけましたが、OWASP ZAPの標準機能を使用している
記事を全く見かけなかったため、詳しく紹介します。
上記で紹介した流れの、"4. 結果の精査"に当たる箇所です。

まず、アラート上で右クリックし、リクエストの再送をクリックすることで、どのような攻撃が行われたのか確認する

SQLインジェクションのアラートで確認

今回は、URLのパラメータで攻撃が行われていると思われる。

実際に送信された攻撃

文字が重なっていて分かり辛いですが、以下のようなリクエストを送っているようです。
GET http://localhost:8080/WebGoat/SqlInjectionMitigations/servers?column="java.lang.Thread.sleep"(15000)
デコードすると以下の通り
GET http://localhost:8080/WebGoat/SqlInjectionMitigations/servers?column="java.lang.Thread.sleep"(15000)
おそらく、1.5秒程度遅延が発生するようなjavaのスクリプトが埋まっていると予測できますね。

今回は、リクエストのURLのパラメータに攻撃が埋め込まれているため、
一度正規のリクエストを送り、開発者ツールのネットワークタブで処理時間を確認してみます。

正規のレスポンス

?column=1と指定するとなにやらjsonデータが返ってくるようです。
処理速度も109msとかなり速そうです。

次に上記と同じリクエストをインターセプトし、パラメータを改ざんします。
画像の緑色の●をクリックし、赤色にする。

赤色になったらリクエストを送る

ブレークタブに目的のリクエストが表示されるまで、赤色の●の横にある
コマ送りボタン(l▶)でリクエストを進める

目的のリクエストを改ざんする

レスポンスは以下の通りエラーとなっている

画面側の開発者ツールを見ると、エラー画面が出力され、処理時間も
118ms とあまり変わらない

処理時間: 6123 ms
リクエスト: http://localhost:8080/WebGoat/SqlInjectionMitigations/servers?column="java.lang.Thread.sleep"(1)

sleepの後の数値を1500にすると、同じようなエラーページが出力され、
サイズも変わっていませんが処理時間が大幅に伸びることが確認でました。

処理時間: 6123 ms
リクエスト: http://localhost:8080/WebGoat/SqlInjectionMitigations/servers?column="java.lang.Thread.sleep"(1)

よって、スクリプトが実行されてしまっていると思われるため、対策が必要と言えそうですね。

最後に

最後まで読んで頂き誠にありがとうございました。
今回の記事が皆さんの理解や学習にお役立ていただけたら幸いです。
新しいトピックやリクエストがあれば、ぜひコメントを頂けると
嬉しく思います。
今後も役立つような技術ブログを公開していけたらと思いますので
フォローしていただけると幸いです。