ZAPを使ったHTTPリクエストの書き換え方

# 本記事の対象読者
本記事は脆弱性を再現するためにリクエストの書き換えが必要になった方で、TCP/IPやhttpなど一定の知識がある読者を想定しています。
**本記事を読んでも不明な場合は開発会社様もしくは診断会社様に委託することをご検討ください。**

# おことわり
- 本記事にはセキュリティ上のリスクや障害を起こすリスクのある操作が含まれます、読者の責任において行ってください。特に業務環境など管理権限を持っていない環境では責任者の承認を得てください。筆者は一切の責任を負いかねます。
- ZAPはバージョンアップにより外観や設定、操作が変わることがあります、本記事はバージョン2.16.0で作成しています。

# 使用するソフトウェア
||説明|
|:--:|:--:|
|Firefox|リクエストの送信用に使用します。プロキシ設定でリクエストをZAPに経由させます。httpsエラーを防ぐためZAPの証明書をインストールする必要があります。|
|ZAP|プロキシとして動作し、Firefoxからのリクエストを中継します。中継を保留することでリクエストを書き換えることができます。|

# ZAPのインストール
公式サイトからダウンロードしインストールします。必要に応じてJavaもインストールしてください。

https://www.zaproxy.org/

# Firefoxのインストール(推奨)
Firefoxをインストールします。Firefoxを既に別の用途で使用している方は別のプロファイルを作成して別プロファイルで以降の設定を行ってください。

https://www.mozilla.org/ja/firefox/

ChromeやEdgeでもできますが、普段使っているブラウザの同一プロファイルを使用するのは避けた方が無難です。

# 設定
## ZAP
- ZAPを起動します。
- 内部プロキシで使用するルート証明書を生成します、OKを押して次の画面へ進んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/96472b69-8634-a064-d76e-beac1d51d0a5.png)

- Server Certificatesの画面が開きますので「保存」を押し、生成されたルート証明書を任意の場所に保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/f36dd301-fe53-ceca-03a2-b667f71f0a22.png)

- Network-Local Servers/Proxysで内部プロキシに使用するポートを指定してOKを押します。現在使用していないポートであれば何でも構いません。（バージョン2.16.0のデフォルトは1234でした）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/dce01f6a-6f81-e887-c301-95fa6fe02a9d.png)

- 証跡を保存するかどうかの選択画面が開きます、再現を確認するうえで保存は必須ではありませんので好きなものを選んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/10c57468-39e5-5016-bc59-84d29d3dacf6.png)

## Firefox
FirefoxのProxy設定を行います。

https://support.mozilla.org/ja/kb/connection-settings-firefox

- HTTPプロキシにIPアドレスを127.0.0.1、上記ステップで設定したポート(1234など)を設定します。
- 「このプロキシーをhttpsでも使用する」にチェックを入れます。
- FirefoxでGoogleにアクセスします、この画面もしくはGoogleの画面が正常に表示された場合はプロキシ設定が誤っています。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/ad067c02-4d01-0ac0-3937-b81baf2fd713.png)
- この画面が出た場合、ここまでのステップは正常です。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/341e8a1b-b308-9e7c-4555-ee485333dc17.png)
- ZAPの設定ステップで保存したルート証明書をインポートします。

https://jp.globalsign.com/support/ssl/config/cert-import-firefox.html

- 証明書のインストール後、再度Googleにアクセスしてエラーが出なくなれば設定は完了です。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/30c5a6f8-572c-dea1-bad8-6066e956e659.png)

# リクエストの書き換え
- 検証したい機能のHTTPリクエストが送信される直前の画面までFirefoxで移動します。
- ZAPで「ツール - すべてのリクエストのブレークを切り替え」を選択(またはCTRL+B)します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/bae4926b-e366-3987-1485-68b7d17c9b17.png)

- Firefoxで検証したいリクエストを送信します、初回はリクエストの送信を保留した際にZAPを前面に表示するか聞かれますので好きな方を選択してください。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/4c53ef5b-14d7-d738-edf7-d694f712b9bc.png)
- ZAPで右上のウィンドウに表示されているのが送信を保留しているリクエストです、書き換え対象のリクエストでない場合は目的のリクエストが表示されるまで「ツール-サブミットして次のリクエストかレスポンスへ移動」を選択(またはCTRL+S)してください。目的のリクエストが表示されない場合はリクエストが送信される条件を何らかの理由で満たしていません。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/259ec7af-3fae-e6a0-635e-d126ac85291d.png)

- 目的となるリクエストが表示されたら、上のウィンドウで直接リクエストを書き換えます。（この例ではUser-Agentの末尾に"ngkwtys"を追加）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668649/c2d50fe2-3681-a0ca-9a13-e387abc24ce8.png)
- 他のリクエストも書き換える必要がある場合は「ツール-サブミットして次のリクエストかレスポンスへ移動(CTRL+S)」で次のリクエストに移ります。
- 他に書き換えるリクエストが無い場合は「ツール-Submit and Continue to Next Break Point(CTRL+C)」を選択すると残りのリクエストすべてが送信されます。以上でリクエストの書き換えは完了です。

# Q&A
- コメントする前にChatGPTやClaudeに聞いてみてください。