某バリデーション解析

偉大なる某氏よりとあるルーチンワークの自動化の依頼を受けて、作業を進めてきた。
大した作業にはならないと見積もったが、どんな方法を取ってもバリデーションを突破せず、
調べてみると興味深い事になって来た。


某氏からのヒントによると、これまでこのような事は行われてきていて、
どうも一部では知られているようだ。様々なサイトで、バリデーションなど存在しないかのように語られていた。


ただ、実際にfile_get_content()で確認すると、下記のjsによってリクエストURLが生成され、サーバに値が渡されている。
作られるリクエストURLには3パターンある。


  1.子ウィンドウからのアクセスである場合
  2.隠しウィンドウからのアクセスである場合
  3.上記以外の場合

        var ns4 = (document.layers) ? 1 : 0;
        var ie4 = (document.all) ? 1 : 0;
        var DOM = (document.getElementById) ? 1 : 0;
        var doc_width = 0;
        var doc_height = 0;


上で宣言されている変数は、ブラウザの判定と、スクリーン表示領域の縦横サイズだ。

        if(DOM||ie4){
                doc_width = (ie4) ? document.documentElement.clientWidth : windo
w.innerWidth;
                doc_height = (ie4) ? document.documentElement.clientHeight : win
dow.innerHeight;
                if( doc_width < 150 || doc_height < 100 ){
                        doc_width = (ie4) ? document.body.clientWidth : window.i
nnerWidth;
                        doc_height = (ie4) ? document.body.clientHeight : window
.innerHeight;
                }
        }else{
                doc_width = window.innerWidth;
                doc_height = window.innerHeight;
        }


ブラウザごとに異なるメソッドがあるので、それらを使って、doc_width、doc_heightに実際に画面が表示されているサイズを取得している。

        if( window.parent && window.parent != window.self ){
                url += '?mode=enter&id=1999999&ci' + 'd=1234&t=1422158906&r=&pe=
1';


ここでは、親ウィンドウが存在し、ポップアップなどによってアクセスされた場合に、「pe=1」というフラグを追加送信するURLを作っている。

}else if( doc_width < 150 || doc_height < 100 ){
                url += '?mode=enter&id=1999999&ci' + 'd=1234&t=1422158906&r=&wh=
1';


ここでは、ウィンドウが150 x 100以下の隠し窓だった場合に、「wh=1」というフラグを追加送信するURLを作っている。

        }else{
                var cs = ['999cxxd29999baea27abc3ebabcfd9'];
                var c = '';
                for(var i = 0; i < cs.length; i++){
                        c += '&c' + i + '=' + cs[i]
                }
                url += '?mode=enter&id=9999999&ci' + 'd=1234&t=1422158906' + c +
 '&r=&js=1';
        }


上記二つにあてはまらない場合にのみ、「cs」というハッシュ値から生成した「c」がURLに追加される。
「t」はunix時間で、上記の1422158906の場合、2015/1/25 13:08:26である。
「url」には'/link.php'が入っているので、+=で文字列が連結され、URLは例えば「'/link.php?mode=enter&id=1999999&cid=1234&t=1422158906&c0=999cxxd29999baea27abc3ebabcfd9&r=&js=1'」
になる。


&がついている名前で、その後の=以降の値がサーバに渡るURLになる。

location.replace(url);


で最終的にそのURLへとリダイレクトが行われ、URLに付加されたデータがサーバに送られるのだ。
ここまでで分かるかもしれないが、
このバリデーションチェックは、このURLにアクセスしたブラウザが、ポップアップによるものなのか、隠し窓によるものなのか、正規のアクセスなのかを判定している。
ポップアップでは「pe=1」、隠し窓では「wh=1」、正規アクセスの場合はハッシュ値から生成した「cの値」がサーバに届く。
恐らくは、それらのデータを蓄積した上で、不正ユーザをBANする為に用いている。


興味深いのは、表示領域が150 x 100より広く、親ウィンドウがないスクリプトアクセスがあった場合、
あるいは、上記HTML内のjavascriptを直接読んで、「cs」から「c」を生成して組み立てたURLに直接アクセスがあった場合、
バリデーションが通るのかどうかである。