#魔法の言葉:クロスサイトスクリプティング
「クロスサイトのテストやって」との上司指示。
「承知しました!」・・・知らんけど。
ってことで、まとめサイトをググってみた。
##クロスサイトスクリプティング とは
- セキュリティホールの一種
- HTTPレスポンスに埋め込まれたJavascriptやタグにより、ブラウザ側に誤動作を行わせる
- 略称:XSS
##具体例
- サイト利用者のCookie情報や入力情報が盗まれる
##ブラウザ仕様の注意点
- IEのデフォルト設定では拡張子ではなく、ファイルの内容によってファイルタイプを決定する。HTTPレスポンスのContent-Typeがimage/bmpであり、かつ拡張子がbmpであっても、ファイルの内容がHTMLであれば、HTMLと判断し、スクリプトが実行される。
##対策
- スクリプトを埋め込む必要がない箇所には、登録自体を禁止、または受け渡しを禁止する
- タグを無効化してから表示する
- aタグのリンクに入力データを使用したい場合、URLを絶対パスで記述する
- スクリプトのコード内には入力データをなるべく使用しない
- TMLで特別な意味を持つデータである「<」「>」「"」「'」「&」をそれぞれ、「<」「>」「"」「'」「&」に変換する
- IEはファイルアップロードが可能なアプリケーションの場合、ファイルの内容にHTMLタグが含まれていないことなどアップロードしても安全なファイルであことを確認する仕様にする
##テストをする前に
###何が不具合と認識されるのか調べる
サイトポリシーを参照して、何が不具合に当たるのかを確認する。
- 例1. 入力OKだが表示は無効
- 例2. 入力自体が禁止
- 例3. 機能的にHTMLは入力OK
##テスト方法・其の1
手段 1
- URLパラメータに、スクリプトを指定してアクセスしてみる
- スクリプトが無効化されているか確認する
手段 2
- 入力ホーム欄にスクリプトを入力して処理してみる
(例えば<ahref=’http://attack’>attack<\/a>と入力して登録) - 入力内容を表示するページへ遷移し、スクリプトが無効化されているか確認する。
(例えば"attack"がリンク表示されていれば NG)
##テストデータ例・其の1
<!-- シングルクォートを利用したケース -->
>>'<script>alert('Test')</script>
<!-- ダブルクォートを利用したケース -->
>"><script>alert("Test")</script>
<!-- IMGタグのsrc属性にJavascriptを利用したケース -->
>"><img src="javascript:alert('Test')">
<!-- IE限定でstyle属性を利用したケース -->
" style = "background:url(javascript:alert('Test'))" OA="
<!-- Javascriptに入力データを動的に埋め込むケース -->
'+ alert('Test') +'
##テスト方法・其の二
Hiddenフィールドやセレクトボッックス、ラジオボタンの脆弱性チェック
→ HTTPリクエストを変更できるプロキシを利用
- ブラウザのプロキシ設定で以下を設定
・ プロキシサーバ:localhost
・ ポート番号:8080 - HTTP Proxyが転送するHTTPリクエスト/レスポンス処理方法を「Manual」に設定
→ 受け取ったHTTPリクエストをHTTP Proxyで受け、内容を変更してサーバへ転送が可能になる - 受け取ったリクエスト/レスポンスを変更して送信
・ 入力するパラメータ値はテスト其の1を参照