前回:やられアプリ BadTodo - 4.3 XSS(根本的解決) - demandosigno
Todoリストの編集画面において、URLの欄にjavascript:alert(document.cookie)
と記入して保存します。
その後に誰かがそのリンクをクリックするとXSSが発動します。
HTML上は入力値がそのまま href 属性に出力されています。
<tr> <td>URL</td><td><a href="javascript:alert(document.cookie)"> >>エッチな画像はこちら<<</a></td> </tr>
ウェブ健康診断 仕様 p.10 の確認手法4番目の例にあたります。
href や src などのURL属性値を外部から変更できる場合、URLとしてjavascript:JavaScript式
という形式(javascriptスキーム)でJavaScriptを起動できます。
反射型XSSと持続型XSS(格納型XSS)
前回までのXSSは、攻撃用JavaScriptが攻撃対象サイトとは別のサイト(罠サイト)にあるため「反射型XSS」と言います。
今回の場合、一度保存されるとその後ずっと有効なため「持続型XSS」と言います。
持続型XSSは攻撃者からすると手間がかからず、利用者からも分かりにくい方法になります。
対策
javascriptスキームによるXSSはHTMLのエスケープ漏れが原因ではないので別の対策が必要になります。
URL を出力するときは、「http://」や 「https://」で始まる URL のみの許可を「ホワイトリスト方式」で実装してください。