【Web技術】BurpSuiteでウェブ健康診断をしてみる
こんにちは、新人エンジニアのスズキです。
先日、初めての健康診断に行ってきました。
自分の健康について考えることはほとんどなかったので、これを機に生活習慣を見直したいと思います。
さて、人間と同じくwebアプリにも健康診断が必要です。
今回は簡易的な脆弱性診断である『ウェブ健康診断』を紹介します。
この記事の目次
注意事項
- 自身で管理している環境以外に対して、診断や攻撃を行わないでください。
- ウェブ健康診断は検査パターンを絞り込んだものです。
脆弱性が検出されなかった場合も、完全に安全とは言い切れません。
ウェブ健康診断とは
ウェブ健康診断とは、現在IPA(情報処理推進機構)が公開している簡易的な脆弱性診断仕様です。
「ウェブ健康診断」とは、ウェブサイトを人間に例えるなら、その名のとおり「健康診断」にあたるような位置づけの診断です。人間ドックに比べると精密ではありませんが、LASDECが平成19年度に実施したWebアプリケーション脆弱性診断結果等も考慮しながら重要な診断項目を検討し、改良を重ねたものです。
ウェブ健康診断は「基本的な対策が出来ているかどうかを診断するもの」とご理解ください。また、診断対象のウェブアプリケーションの全てのページを診断するものではなく、診断対象の規模にもよりますが、基本は抜き取り調査(診断)です。
引用元:『ウェブ健康診断仕様』(IPA)
ウェブ健康診断には13種類の診断項目があります。
今回は、その中でも三大脆弱性と呼ばれる
- SQLインジェクション
- XSS(クロスサイトスクリプティング)
- CSRF(クロスサイトリクエストフォージェリ)
の診断方法を紹介します。
ウェブ健康診断の準備
まずは診断に必要なツールを準備します。
ローカルプロキシツール『BurpSuite』の準備
- Javaのインストール
BurpSuiteはJavaがなければ使用できません。
以下のURLからJavaをダウンロードします。ダウンロードしたファイルをダブルクリックし、インストールします。
※お使いのPCに既にJavaがインストールされている場合は不要です。 -
BurpSuiteのインストール
以下のURLからBurpSuiteのダウンロードします。https://portswigger.net/burp/communitydownload
『Download the latest version』から最新版をダウンロードします。
ダウンロードしたファイルをダブルクリックし、インストールします。
-
BurpSuiteの起動
インストールしたBurpSuiteを起動します。
1つ目の画面は『Temporary project』を選択、『Next』
2つ目の画面は『Use burp defaults』を選択、『StarBurp』
これでBurpSuiteの準備は完了です。
ブラウザの準備
GoogleChromeではセキュリティ機能の解除に手間がかかるため、Firefoxを使用します。
ブラウザとwebサーバー間の通信をBurpSuiteで中継するための設定を行います。
- Firefoxのメニューから、
『オプション』
→『一般』
→『ネットワーク設定』
→『接続設定』を開く - 『手動でプロキシーを設定する』にチェック、
『HTTPプロキシー』を「127.0.0.1」、
『ポート』を「8080」、
『このプロキシーをFTPとHTTPSでも使用する』にチェック。 - 『OK』をクリックで設定完了
※バージョンによって名称などが異なる場合があります。
これでブラウザの設定は完了です。
それではウェブ健康診断を始めましょう。
SQLインジェクション
データベースと連携したウェブアプリケーションの多くは、利用者からの入力情報を基にSQL文(データベースへの命令文)を組み立てています。
ここで、SQL文の組み立て方法に問題がある場合、攻撃によってデータベースの不正利用をまねく可能性があります。このような問題を「SQLインジェクションの脆弱性」と呼び、問題を悪用した攻撃を、「SQLインジェクション攻撃」と呼びます。
引用元:『ウェブ健康診断仕様』(IPA)
診断対象
SQLインジェクション | |
---|---|
診断対象画面(機能)名称 | 診断対象画面(機能)の定義/説明 |
DBアクセス | 検索機能やデータ登録・参照機能等、SQLを利用していると想定される画面。実際にSQLを使っているか、他の手段(ファイル、オブジェクトDB等)を利用しているかは分からないので、通常SQLを利用していると想定されるものを列挙します。 |
引用元:『ウェブ健康診断仕様』(IPA)
診断方法
以下の検出パターンをパラメータに挿入し、レスポンスを確認します。
SQLインジェクション | ||
---|---|---|
No. | 検出パターン | 脆弱性有無の判定基準 |
1 |
' シングルクォート1つ |
エラーになる |
2 |
検索キー と 検索キー'and'a'='a の比較 |
検索キーのみと同じ結果になる |
3 |
検索キー(数値) と 検索キー(数値) and 1=1 の比較 |
検索キーのみと同じ結果になる |
引用元:『ウェブ健康診断仕様』(IPA)
- BurpSuiteの『Proxy』タブ→『HTTP history』タブから診断対象のリクエストを右クリック→『Send to Intruder』
- 『Intruder』タブ→『Postions』タブのリクエストボディを確認
name=§ここに検出パターンが挿入される§
- 『Intruder』タブ内の『Payloads』タブ→『Payload Options[Simple list]』のテキストボックス内に検出パターンを入力し、『Add』で追加
※通信内容からヘッダなどの情報を除いた部分をペイロード(Payload)といいます。 - 『Payloads』タブ下部→『Payload Encording』のチェックを外す
- 『Start Atack』で診断(攻撃)開始
- レスポンスを確認し、判定基準に則って、脆弱性の有無を判定
XSS(クロスサイト・スクリプティング)
ウェブアプリケーションの中には、検索のキーワードの表示画面や個人情報登録時の確認画面、掲示板、ウェブのログ統計画面等、利用者からの入力内容やHTTPヘッダの情報を処理し、ウェブページとして出力するものがあります。
ここで、ウェブページへの出力処理に問題がある場合、そのウェブページにスクリプト等を埋め込まれてしまいます。
この問題を「クロスサイト・スクリプティングの脆弱性」と呼び、この問題を悪用した攻撃手法を、「クロスサイト・スクリプティング攻撃」と呼びます。クロスサイト・スクリプティング攻撃の影響は、ウェブサイト自体に対してではなく、そのウェブサイトのページを閲覧している利用者に及びます。
引用元:『ウェブ健康診断仕様』(IPA)
診断対象
XSS(クロスサイト・スクリプティング) | |
---|---|
診断対象画面(機能)名称 | 診断対象画面(機能)の定義/説明 |
入力内容確認 | ユーザが入力した値を次の画面で表示し、確認できるようになっている画面。一般的に、データ入力の画面は、「入力」→「確認」→「登録」の3画面構成になっていることが多く、その場合の2番目の画面を指します。なお、ウェブサイトによっては「入力」→「登録」という構成で「入力内容確認」がない場合もあります。 |
引用元:『ウェブ健康診断仕様』(IPA)
診断方法
以下の検出パターンをパラメータに挿入し、レスポンスを確認します。
XSS(クロスサイト・スクリプティング) | ||
---|---|---|
No. | 検出パターン | 脆弱性有無の判定基準 |
1 |
'>"><hr> |
エスケープ等されずに出力される |
2 |
'>"><script>alert(document.cookie)</script> |
エスケープ等されずに出力される |
3 |
<script>alert(document.cookie)</script> |
エスケープ等されずに出力される |
4 |
javascript:alert(document.cookie); |
href属性等に出力される |
引用元:『ウェブ健康診断仕様』(IPA)
- 先ほどのSQLインジェクションと同じ手順でリクエストを送信
- レスポンスを確認し、判定基準に則って、脆弱性の有無を判定
CSRF(クロスサイトリクエストフォージェリ)
ウェブサイトの中には、サービスの提供に際しログイン機能を設けているものがあります。
ここで、ログインした利用者からのリクエストについて、その利用者が意図したリクエストであるかどうかを識別する仕組みを持たないウェブサイトは、外部サイトを経由した悪意のあるリクエストを受け入れてしまう場合があります。
このようなウェブサイトにログインした利用者は、悪意のある人が用意した罠により、利用者が予期しない処理を実行させられてしまう可能性があります。
このような問題を「CSRF(Cross-SiteRequestForgeries/クロスサイト・リクエスト・フォージェリ)の脆弱性」と呼び、これを悪用した攻撃を、「CSRF攻撃」と呼びます。
引用元:『ウェブ健康診断仕様』(IPA)
診断対象
CSRF(クロスサイトリクエストフォージェリ) | |
---|---|
診断対象画面(機能)名称 | 診断対象画面(機能)の定義/説明 |
パスワード変更 | ユーザが自分のパスワードを変更する画面。 |
DB更新 | データの新規登録や変更により、データベースに更新処理を行っていると想定される画面。実際にDB更新を行っているかどうかは外部からは判別できないので、DB更新と想定される画面を探します。 |
メール送信 | アプリケーションがメールを送信している画面。重要な処理(パスワード変更、申し込み処理等)の際に確認メールが送信される場合があります。そのような処理がないか探します。 |
引用元:『ウェブ健康診断仕様』(IPA)
診断方法
CSRF(クロスサイトリクエストフォージェリ) | |||
---|---|---|---|
No. | 検出パターン | 脆弱性有無の判定基準 | |
1 | ログイン状態において、特定副作用を持つ画面に対して外部からパラメータを強制する。この際に、Refererが送出されないように抑止すること | 特定副作用((たとえば送金、商品購入、退会処理、パスワードや設定の変更など、ウェブサイトの利用者にとって重要で、取り消しできない処理)が実行される |
引用元:『ウェブ健康診断仕様』(IPA)
- 特定副作用を実行させる罠ページを作成
以下のサンプルをブラウザで開き『CSRF罠リンク』をクリックすると、新しいタブで同じページが開きます。
そして、元のタブでは、「name1=value1」「name2=value2」「name3=value3」の3つのパラメータが、『診断対象URL』へ、『POST』メソッドで送信されます。
診断の際には、
- formタグのaction属性とmethod属性
- inputタグの数(パラメータの数)
- inputタグのname属性とvalue属性
を変更してください。
<!DOCTYPE html> <html> <head> <title>CSRF罠ページ</title> <script> function csrf() { let trap = document.getElementById("trap"); trap.submit(); } </script> </head> <body> <a href="" onclick="csrf();" target="_blank">CSRF罠リンク</a> <form id="trap" action="診断対象URL" method="POST"> <!--以下ペイロード--> <input name="name1" value="value1"> <input name="name2" value="value2"> <input name="name3" value="value3"> </form> </body> </html>
- 罠のリンクをクリック
- 特定副作用が実行されているか確認し、脆弱性の有無を判定
まとめ
今回は、ウェブ健康診断の中でも特に重要な3つの脆弱性を診断する方法を紹介しました。
脆弱性診断は、その費用や専門性から、どうしても敷居が高く感じてしまいます。
しかし、webのセキュリティを確保することは、企業にとって重要な課題のひとつです。
今まで敬遠していた方も、無料のツールのみで実施できるウェブ健康診断から脆弱性診断に挑戦してみてはいかがでしょうか。
参考文献
- 『Webセキュリティ担当者のための脆弱性診断スタートガイド』上野宣(翔泳社,2016)
- 『安全なウェブサイトの作り方』
- 『ウェブ健康診断仕様』
- 『エンジニアKのセキュリティ日誌』