■IE:本来不可視な要素のstyle属性がdocument.innerHTMLで活性化する

これは不思議です。IEでのお話し。link要素なりscript要素なりレンダリングされない不可視な要素にstyle属性を付加したとします。そのstyle属性に記述されるJavaScript起動成分は要素が不可視であるがゆえにstyle属性が活かされず、JavaScriptが発動されないことが期待されるのですが、あにはからんや、別途document.body.innerHTMLなどをいじってやると活性化してしまうのです。

<HTML><HEAD>
<style
src="(function(){(function(){(function(){alert();location.reload();})()})()})()" 
style="q:expression(setTimeout(this.src,3000))" >
</style>
</HEAD>
<body>
<input value="Clickして3秒待つ" onClick="d=document.body.innerHTML">
</body>
</HTML>

【なんだこのonclick。d=document.body.innerHTMLって何よ?何もしてないぢゃん】とか思うのです。

document.body.innerHTML等を参照しているWebアプリがあったとして、ユーザ入力をサニタイズする時にうっかりと不可視要素のstyle属性の検査を忘れているとXSSが発動してしまいますよ、というお話しです。そんなワザワザへたれなアプリを作る人はいないものと期待されるのですが。まああんまり危険度は高くないのですけれど、動きがどうにも不思議ですのでご紹介してみました。

さきほどまで膨大にたまっているメールをチェックしていたのですが、style要素のonload属性がその親のdiv要素のstyle属性においてdisplayプロパティがhiddenになっている野生児を見つけたものですから、ヒマが出来たらゴニョゴニョしてみたいなあと思っています。この野生児はキチガイザタです。まあ不可視なものの色々ということで似ているかもと思いましたのでメモ的に日記に書いております。