Burp SuiteでWebアプリのQAをする

OPENLOGIの大島です:innocent:
[OPENLOGI Advent Calendar 2017](https://qiita.com/advent-calendar/2017/openlogi)の9日目の記事です。

弊社のサービス開発では品質をより向上させるため、日々QA(Quality Assurance)が行われています。ただQAとかテストって結構めんどくさかったり難しかったりして完全に実施するのは難しいものです:thinking_face:

その１つにフロント側でバリデーション（入力チェック）がかかっている部分は通常の操作ではサーバ側の挙動を確認できないというのがあります。

今回はその解決策として、Burp Suiteというツールを用いたサーバ側の処理のQA方法を紹介します。

## Burp Suiteとは
ローカルプロキシツールです。HTTPリクエストやレスポンスを中継して、中身を確認したり自由にいじれたりできます。普通はWeb脆弱性診断などに使われるんですが、今回はもっと広い意味での動作確認に使ってみます。

### 一応注意事項
改変リクエストは攻撃として扱われるため、許可なく他人のサイトに送信すると不正アクセス禁止法にひっかかります。おやめください:pray: また自分が管理するサイトでもAWSなど外部サーバーに対して実施する場合はあらかじめ申請が必要です。
というわけで、基本的には自身のローカル開発環境に対して実施するようにしましょう。

## 導入
ここからBurp Suiteをダウンロード&インストールします。
https://portswigger.net/burp

開くとProject設定とか聞かれますが、TemporaryでOKです。

## 設定
ブラウザとサーバ間に挟むようにプロキシを設定します。`ブラウザ⇔Burp` と `Burp⇔サーバ` の２つの設定をします。

### ブラウザ⇔Burp
 - 上部の`Proxy`タブ→`Options`タブ→`Proxy Listeners`  
ここでBurpが待ち受けするIP/ポートを指定します。
<img width="500<img width="1328" alt="Burp Suite Free Edition v1.7.23 - Temporary Project-2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/d03e2569-8627-7be1-9a72-f1b8fcbc31e2.jpeg">

今回は`127.0.0.1:8888`を指定します。これがBurpが待受しているIP/Port番号になります。

<img width="500" alt="Edit proxy listener.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/bd0ea9c6-af3a-d13c-750c-888a33d81e27.jpeg">

ブラウザ側でプロキシ設定をします。Firefoxだと `about:preferences#general`にアクセスして`ネットワークプロキシ`タブです。  
ここにBurpの`Listener`の値を指定します。
<img width="576" alt="設定-2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/009a2a3b-a3a5-be21-5a78-1ed19dcf0b77.jpeg">

### Burp⇔サーバ
スコープの設定をします。スコープで指定した対象のみにリクエストが送信されます。これをしないと予期しないところへリクエストを送ってしまうかもしれないので、設定しておきましょう。

<img width="1151" alt="Burp Suite Free Edition v1.7.23 - Temporary Project-3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/a2f88c48-4d0f-d15e-4e59-1e068c657923.jpeg">

## 基本の使い方
Proxyタブ→Interceptタブを見ると以下のように表示されています。
<img width="1328" alt="Burp Suite Free Edition v1.7.23 - Temporary Project-5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/9fbe6852-d5a1-acf2-1816-a9fac67ff703.jpeg">

 - 図の状態は、ブラウザが送ろうとしているリクエストをBurpが中断している状態です。ブラウザ上では通信中になっています。ボタンの機能は下記の通りです
   - `Forward` : このリクエストを送信します
   - `Drop` : このリクエストを削除します
   - `Intercept is on` : リクエストを中断している状態を示しています。ボタンを押すとoffになり、溜まっている全てのリクエストが送信されます
   - `Action` : このリクエストを他のタブ(機能)へコピーして使えるようにします
 - リクエストの中身が見えていますが、書き換えて送信ができます

通常は`Intercept` をOffにしてブラウザを操作し、確認したいリクエストを送る直前でOnにします
<img width="710" alt="Burp_Suite_Free_Edition_v1_7_23_-_Temporary_Project.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/8d9b990a-e4c7-345c-9d41-1358d9f13129.jpeg">

例えば入力フォームで日時指定する項目があったとして、ここで書き換えて送信することで、本来はフロントの入力チェックで制限がかかっているような値でも自由に書き換えることができます。サーバ側で正しくエラーとして処理してくれることが確認できればOKです。

## 応用編
いちいちこんなことするのめんどくせえ！と思われたかもしれません。僕もそう思います:pray:
Burpには繰り返しテストしたいときに便利な機能があります。今回は`Repeater`と`Intruder`を紹介します。

### HTTP History
その前にHTTP Historyについて紹介です。リクエストとレスポンスの履歴が全部確認できます。
数が多いので目的のものを探すのが大変なのですが、例えば`Params`カラムにチェックがあるものはパラメーターがあるリクエストを示していたり、`Edited`は改変したものを示していたりするので、うまく見つけましょう。

<img width="1421" alt="Burp_Suite_Free_Edition_v1_7_23_-_Temporary_Project.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/8b1c35b6-e062-b35e-b2b1-1125baf0453e.jpeg">

適当な行で右クリックすると、そのリクエストに対してアクションができます。今回はさっきのPOSTリクエストを`Repeater`の機能で使用できるように、`Send to Repeater`で送っておきます。

<img width="711" alt="スクリーンショット_2017-12-08_3_05_36.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/1003dc8c-e740-2acc-1f17-e07a98e8f1e3.jpeg">


### Repeater
指定したリクエストを繰り返し送信できる機能です。`Go`を押すたびに左に書いてあるリクエストが送信されます。
先程の`Send To Repeater` により指定したリクエストが左側に表示されているかと思いますが、ここからちょっとずつ値を書き換えながら繰り返し送信してみることができます。ちなみにレスポンスは右側に表示されるだけで、ブラウザには反映されません。

<img width="712" alt="Burp_Suite_Free_Edition_v1_7_23_-_Temporary_Project.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/f14a93bf-4b5c-6157-8cbb-bfdef2b289ed.jpeg">

### Intruder
リクエストの複数のパラメータを複数の好きな内容に改変して、それぞれリクエストを送ってくれるすごいやつです。

#### `Positions`タブ
`§`で囲まれている、色付けされた部分が指定した値に改変されます。改変される場所は自由に設定可能です。
<img width="705" alt="Burp_Suite_Free_Edition_v1_7_23_-_Temporary_Project.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/14466a4b-8073-623a-3e98-0aa037528b34.jpeg">

#### `Payloads`タブ
Payload Optionsで指定した値が代入されます。
下記の設定では指定した値を1つ1つのパラメータに順番に代入してリクエストを送ってくれます。
<img width="693" alt="Burp_Suite_Free_Edition_v1_7_23_-_Temporary_Project.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/9dd439d4-2495-6e2e-976b-07a62c69502b.jpeg">

右上の`Start attack`を押すとリクエストの送信が始まり、以下のように結果を一覧で確認できます。

<img width="592" alt="Intruder_attack_2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/180075/aae0a754-b169-f175-4e63-ddfca29f2309.jpeg">

このへんはだいぶセキュリティテストめいてきますが使いたくなる場面もあるかも・・ないかもしれません。

## まとめ
ローカルプロキシツールBurp Suiteで動作確認を行う方法を紹介しました。Webセキュリティ関連で使われることが多い本ツールですが、うまく使えば開発者の動作確認の手段としても有効です。みなさんも良かったら使ってみてください:pray: