« 2007年09月 | メイン | 2007年11月 »

2007年10月 アーカイブ

2007年10月01日

miya2000さんの「ブックマークレットの状態を保存する」を再実装してみる

miya2000さんからTBを頂いた。「ブックマークレットの状態を保存する」というBookmarkletを作成した際に、当サイトで公開しているLibraryを参考にして頂いたとの事。おもしろい内容だったので同じ機能を再実装してみた。もとのBookmarkletはボタンによる制御だったが、こちらはリアルタイムにBookmarkletを生成し、キャンセルはダブルクリックとなっている。同時にGOLFを行なったのでかなり分かりにくく、汎用性のないものになってしまった。反省。

javascript:(
    function(t){
        var
         l  =   "addEventListener"
        ,c  =   "childNodes"
        ,g  =   "createElement"
        ,p  =   "appendChild"
        ,z  =   "replace"
        ,m  =   arguments.callee
        ,d  =   document
        ,b  =   d.body
        ,v  =   d[g]("div")
        ,a  =   d[g]("a")
        ,h  =   d[g]("textarea")
        ,s  =   v.style
        ,f  =   false
        ,x
        ,y
        ,r  =   function(){
                    a.href  =   "javascript:("              +
                                m.toString()                +
                                ")(\""                      +
                                v[c][0].value
                                    [z](/\\/ig,"\\\\")
                                    /*[z](/\b/ig,"\\b")*/
                                    [z](/\f/ig,"\\f")
                                    [z](/\n/ig,"\\n")
                                    [z](/\r/ig,"\\r")
                                    [z](/\t/ig,"\\t")
                                    [z](/'/ig,"\\'")
                                    [z](/"/ig,"\\\"")       +
                                "\")"
                }
        ;
        s.cssText="width:30em;padding:5px;position:absolute;top:20px;left:20px;background-color:white;border:black solid 1px;cursor:move;z-index:99";
        h.style.cssText="width:100%;height:7em;display:block";
        a.innerHTML="Bookmarklet";
        b[p](v);
        v[p](h);
        v[p](a);
        h[l]("click",r,0);
        h[l]("keyup",r,0);
        h[l]("change",r,0);
        v[l]("dblclick",function(){b.removeChild(v)},0);
        v[l]("mousedown",function(e){f=true;x=e.pageX-v.offsetLeft;y=e.pageY-v.offsetTop},0);
        d[l]("mousemove",function(e){if(f){s.left=e.pageX-x+"px";s.top=e.pageY-y+"px"}},0);
        d[l]("mouseup",function(){f=false},0);
        h.value=t
    }
)("")
追記(2007/10/01)
変数名が親のscopeの変数と重複していたので変更した。
e="createElement"; -> g="createElement";

2007年10月04日

脆弱性検証用画像を作成

この画像は、Microsoft Internet Explorerの画像ファイルに対する脆弱性を、検証するためのものです。
ユーザが画像を投稿でき、投稿された画像をブラウザ上で表示するようなWebアプリケーションの場合、この脆弱性が発生する可能性があります。
実際に投稿を行い、検証してみて下さい。自分の管理下ではないサイトで行った場合、不正アクセス等の犯罪行為に問われる可能性がありますので取り扱いにはご注意下さい。
「XSS:Cross Site Scripting」とalertが表示、「Phishing」と画面に表示、別ウィンドウ(または別タブ)が開き「Session Hijacking」がGoogleにて検索等の動作が確認された場合、そのWebアプリケーションはセキュリティ上の問題があります。
Cross Site Scriptingをはじめ、Session Hijacking等、JavaScriptを利用した多くのクラッキングが可能となっています。早急に対策の必要があります。
上記画像を右クリックでダウンロードして下さい。
IEは画像をimg要素を用いて表示する場合は、HTTPヘッダを見てファイルの種類を判断しているようです。しかし、IEから画像を直接開いた場合、標準設定ではそのファイルの内容によりファイルの種類を判断しているようです。
IE6の場合、インターネットオプションのセキュリティの設定内にある、「拡張子ではなく、内容によってファイルを開くこと」が有効になっている場合に発生します。
お勧めの対処方法は以下の通りです。
アップロードされた画像の実ファイルへの、直接リンクが発生しないような構造にします。
ダウンロードをさせる場合は必ず、Content-Typeを「application/octet-stream」等に設定し、ブラウザ内への直接表示を避けるようにします。
画像はDBに保存する場合は、ダウンロード時のファイル名が問題になりますが、Content-Dispositionに「attachment; filename="[ファイル名]"」とすると指定可能です。アップロード時にファイル名を保存しておくとよいでしょう。
参考サイト
この脆弱性は以前から概要は把握していたのですが、詳細な実証方法は知りませんでした。
以下のリンク先の、サイボウズ・ラボの竹迫さんのプレゼンファイルを見ていたときに偶然に発見したため、作成に至りました。
竹迫さん、ありがとうございます。