クロスサイトスクリプティング用のルール
完成したクロスサイトスクリプティング用ルールをリスト1に示す。
# スクリプトを呼び出せるタグは禁止
SecFilter ""
SecFilter ""
SecFilter ""
SecFilter ""
# 疑似プロトコルは禁止
SecFilter "javascript:"
SecFilter "vbscript:"
SecFilter "about:"
# スクリプトを呼び出せるので禁止
SecFilter "expression\("
SecFilter "&{.*};"
# イベントハンドラは禁止
SecFilter "onError"
SecFilter "onUnload"
SecFilter "onBlur"
SecFilter "onFocus"
SecFilter "onClick"
SecFilter "onMouseOver"
SecFilter "onMouseOut"
SecFilter "onSubmit"
SecFilter "onReset"
SecFilter "onChange"
SecFilter "onSelect"
SecFilter "onAbort"
# CookieやBasic認証情報にアクセスできるので禁止
SecFilter "document\.cookie"
SecFilter "Microsoft\.XMLHTTP"
# 改行コードは禁止(ただし、TEXTAREAが存在する場合はこのままではダメ)
SecFilter "\x0d"
SecFilter "\x0a"
この設定は、管理しやすいように別ファイルにして、Includeディレクティブでhttpd.confに読み込ませるようにしよう。筆者はファイル名をmodsec.confとした。
Include conf/modsec.conf
このように設定しておくことにより、クロスサイトスクリプティングの脆弱性を突いた攻撃が成功することはないはずである。ただし、完全に防御できることを保証するものではないので、ご了承願いたい。また、上記の設定で禁止文字列としたものが、正しい文字列として入力される場合もある。例えば、掲示板でWebアプリケーションの脆弱性について議論するような場合である。このような例外については、また別途考えていきたいと思う。
Snortのルールを流用する
ここまでは、自力でクロスサイトスクリプティング用のフィルタリングルールを作成した。次は、Snortのルールをmod_securityのルールとして流用する方法を紹介しよう。Snortとは、オープンソースのIDS(侵入検知システム)である。詳細は以下のサイトやほかの連載を参照していただきたい。
まずはSnortのルールをmod_security用に変換するスクリプト「snort2modsec.pl」を以下のURLからダウンロードする。バージョンやモジュールに依存した処理は行っていないので、perlであれば、どのバージョンのものでも問題なく動くはずである。このサイトから変換済みのルールもダウンロードできるのだが、せっかくなので自分で変換してみることにしよう。
【snort2modsec.pl】
http://www.modsecurity.org/documentation/converted-snort-rules.html
Snortのルールは以下のURLからダウンロードできる。いくつか種類があるが、今回は以下の最新のスナップショットを利用した。
このファイルを解凍すると、攻撃対象によってルールが分類されているが、mod_securityではこのうちファイル名が「web-」で始まっているものを流用する。変換は以下のようにして行う。
$ perl snort2modsec.pl web-attacks.rules > web-attacks.rules $ perl snort2modsec.pl web-cgi.rules > web-cgi.rules $ perl snort2modsec.pl web-client.rules > web-client.rules $ perl snort2modsec.pl web-coldfusion.rules > web-coldfusion.rules $ perl snort2modsec.pl web-frontpage.rules > web-frontpage.rules $ perl snort2modsec.pl web-iis.rules > web-iis.rules $ perl snort2modsec.pl web-misc.rules > web-misc.rules $ perl snort2modsec.pl web-php.rules > web-php.rules
これらもまたIncludeディレクティブで読み込ませるようにする。なお、前述したクロスサイトスクリプティング用のルールは、xss.rulesとして別ファイルとして読み込ませるようにし、基本設定のみをmodsec.confに残すようにすると、すっきりすると思う。
以下にmodsec.confの記述方法を示す。
<IfModule mod_security.c> SecFilterEngine On SecFilterScanPOST On SecFilterSelective HTTP_Transfer-Encoding "!^$" SecFilterDefaultAction "deny,log,status:406" SecFilterCheckURLEncoding On SecFilterDebugLog logs/modsec_log SecFilterDebugLevel 1 SecAuditEngine RelevantOnly SecAuditLog logs/audit_log Include conf/xss.rules Include conf/web-attacks.rules Include conf/web-cgi.rules Include conf/web-client.rules Include conf/web-coldfusion.rules Include conf/web-frontpage.rules Include conf/web-iis.rules Include conf/web-misc.rules Include conf/web-php.rules </IfModule>
これでapacheを再起動すれば新しいルールが有効になるはずである。
筆者はこれらのルールを実際の商用サイトで運用したわけではないため、デフォルト設定のままでは誤検知が発生することが予想される。どのルールにマッチしたかは、mod_securityが出力するaudit_logのmod_security-messageの行に示されている。今回作成したクロスサイトスクリプティング用のルールにマッチした場合、以下のようなメッセージがaudit_logに出力される。
mod_security-message: Access denied with code 406. Pattern match "" at THE_REQUEST
今回はクロスサイトスクリプティングを検知するルールと、Snortのルールを流用する方法について説明した。Webアプリケーションへの攻撃は、もっと多くのパターンがあるため、これらを検知するための設定についても紹介していきたいと思う。
「第13回」へ→
著者紹介
中村隆之(なかむらたかゆき)
三井物産セキュアディレクション勤務。 セキュリティコンサルタントとして主にWebアプリケーションのセキュリティ検査に従事しており、大手ポータルサイト、オンラインバンキングなどの数多くの 検査実績を持つ。また、セキュアネットワーク及び暗号関連の研究に携わり、大手製造、官公庁、金融機関へのセキュリティシステム導入など数多くの実績を持つ。
主に、不正アクセス監視サービス、セキュリティ検査、セキュリティポリシー策定支援などのサービス提供している。また、セキュリティに関する教育サービスも実施中。
- Webアプリケーションの脆弱性を総括する
- OSコマンドインジェクションを防ぐルールを作成する
- mod_securityのXSS対策ルールを作成する
- Webアプリケーションファイアウォールによる防御
- 安全なWebアプリケーション開発のススメ
- オンラインショッピングにおける脆弱性の注意点
- ロジック系の検査 〜 問い合わせ画面に含まれる脆弱性 〜
- Webアプリケーションの検査(3)〜 攻撃されないためのセッション管理の検査方法 〜
- Webアプリケーションの検査(2)〜 Webサイトのセッションまわりを調べる方法 〜
- Webアプリケーションの検査テクニック(1)
- エラーメッセージの危険性
- 気を付けたい貧弱なセッション管理
- 顧客データがすべて盗まれる?!〜OSやデータベースへの攻撃〜
- サーバのファイルが丸見え?!
Copyright © ITmedia, Inc. All Rights Reserved.