javascriptスキームとイベントハンドラは二度刺す


新入生の方とそれを指導される方、新社会人の方とそれを指導される方お疲れ様です。

今回はjavascriptスキームとイベントハンドラについて書こうかと思います。
以下のように[userinput]にユーザが任意の文字列を入力出来る時、問題があります。

例えば攻撃者が以下のような文字列を[userinput]に対し入力した場合alertが2度実行されます。
「one’);alert(‘two」

どうすれば対策出来るでしょうか。
ここでは、攻撃者が入力したシングルクォートに「\」(バックスラッシュ)、「\」に「\」を付けるという対策を行ってみます。
「one\’);alert(\’two」という文字列を追加すると結果として以下の様なHTMLタグが生成され、alertは1度しか実行されません。

ではこれで本当に安全でしょうか。
攻撃者は「one');alert('two」という文字列を入力します。
結果として以下の様なHTMLが生成されます。

これをクリックするとどうなるでしょうか。
alertが2度実行されます。

イベントハンドラ内では「'」もしくは「'」を「’」(シングルクォート)の代わりに使用することが出来ます。
ただしユーザが入力した「&」を&に置き換えてやることで対策は可能です。

次に見たいのはjavascriptスキームです。
例えば以下のように[userinput]にユーザが任意の文字列を入力出来る時、問題があります。

例えば攻撃者が以下のような文字列を[userinput]に対し入力した場合alertが2度実行されます。
「one’);alert(‘two」
ここで
「’」を「\’」、「\」を「\\」、「&」を「&」に置き換えるという対策をしてみましょう。
これで完璧でしょうか?答えはNOです。
攻撃者が以下のような文字列を[userinput]に入力します。
「one%27);alert(%27two」
結果として以下の様なタグが生成されます。

するとどうなるでしょうか。何とalertが2度実行されてしまいます。
楽しいですね。javascriptスキーム内では「'」や「'」の他に「%27」を使用することが出来ます。
なのでこういう変なコードを書く事も出来ます。

また蛇足ですがjavascriptスキームはHTMLエンティティを使って記述することが出来ます。なのでこういう書き方も出来るわけですね。
最早素人目には何が実行されるのか意味不明です。この辺に関しては過去の記事を参考にして頂ければと思います。
Javascriptスキームは諦めない

ちなみに上のよくわからないHTMLタグは以下のタグと同じものです。

いかがでしたでしょうか。
ユーザの入力をイベントハンドラやjavascriptスキームの中で使用しているサイトはたとえエスケープ処理を行っていても気をつけたほうがいいかもしれませんね。