「ユーザ参加型サービス」 のもつ危険性
一般的なWebアプリケーションでは,
というわけで,
Wikiのセキュリティ要件
基本的にWikiには認証という考えは無く,
Wikiを提供する際に難しいのは,
ここでひとつ例を挙げて考えます。
たとえば見出しを表示する場合,
<H2>見出し</H2>
さて,
- HTMLを構文解析する
- 許可されたタグであるかをチェックする
- 許可された属性,
属性値であるかをチェックする
Wikiにおけるセキュリティ対策の問題点
それでは上記の方法でスクリプトの混入を防ぐことができるかを考えてみます。
まず,
1.
<H2/</onmouseover=alert('sst')
<b>見出し</H2>
2.
<script src=a.js?<H2>見出し</H2>
正解は表1のようになります。
表1 ブラウザによる構文解析の違い
1. | 2. | |
---|---|---|
Internet Explorer 6 | ○ | × |
Internet Explorer 7 | ○ | × |
Firefox 2. | × | ○ |
Opera 9. | × | × |
Safari 3. | × | × |
- ○:実行される
- ×:実行されない
ご覧のとおり,
次に以下をご覧ください。攻撃者は以下のようなHTMLを挿入してくることが考えられます。
- <H2/onmouseover=alert('xss')>見出し</H2>
- <H2 onmouseover=alert('xss')>見出し</H2>
- <H2 style="{javascript:expression(alert('xss'))}">見出し</H2>
- <H2 style="{a:expression(alert('xss'))}">見出し</H2>
- <H2 style="{javascript:expression(alert('xss'))}">見出し</H2>
たとえば構文解析がうまくできていなかった場合,
許可された属性値であるかのチェックがうまくできていなかった場合,
つまり,