anti-XSS system (4)

Date 2006-06-25 18:20:31 | Category: PHP

in englishin japanese
「大きな傘」(BigUmbrella)XSS対策システムの最終回。考察編です。
(3)に示したコードには、議論の余地が2つ残っています。

・疑うべきリクエストのパターンがそれで良いのか

(3)で示したチェックパターンはこうです。
preg_match( '/[<\'"].{15}/s' , $val , $regs )


タグの開始文字<および、HTMLのクオーティングを破るための'と"から始まる全16文字について、そのまま出力されていたらアウト、というチェックですが、それで本当に抜けがないでしょうか?

とりあえず怖いのは、リクエスト文字列をそのまま、<a>タグのhrefや<img>タグのsrcに渡しているケースで、この場合、java-script: から始まる文字列も(IE対策のためにはその間に制御文字が入っているものも)潰す必要があります。つまり、BigUmbrellaを本格運用するなら、"java-script:"対策も追加しておくべきでしょう。

リテラルクオーティングキャラクターである"および'を潰しているからといって、JavaScriptでリテラルを表現できないなどと考えるのは軽率で、文字コードを羅列し結合することで、十分に攻撃力を持つリテラルの表現は可能なはずです。

・チェック対象リクエストは、POSTとGETだけで良いのか

(3)では、GETとPOSTのみについてチェックしていますが、これも本来なら不十分です。ただし、それはCOOKIEについてではありません。もちろん、COOKIE経由のXSSがないという保証はありませんから、チェックを入れても構いません。ただ、冷静に考えれば、COOKIEに意図しないそんなリクエストが埋め込まれている時点でXSSなどの攻撃を受けているのは明らかで、手遅れと言わざるを得ないでしょう。すでに体がびしょ濡れなのに、「傘」をさしても意味がないのです。

むしろ問題となりがちなのは、SERVER(ENV)変数です。PHP側でデコードされるSERVER変数が3つほどあります。その中で一番有名なのはPHP_SELFですが、PATH_INFOなどを直接表示してしまっているスクリプトも少なからず存在してそうです。

とりあえず最低限足しておくべきなのは、3つのSERVER変数(PHP_SELF,PATH_INFO,PATH_TRANSLATED)についてのチェックです。実際には他のSERVER変数についても、通常のリクエストで<'"が登場することは滅多にないようなので、SERVER変数全てについて無条件でチェックする、なんていうのでも、サーバ負荷への影響は大きくないかもしれません。


なお、この「大きな傘」は、XSS対策にしかなりません。同じJavaScript系攻撃でも、ScriptInsertion(別名 HtmlInjection)にはほぼ無力です。

「対策方法」という観点からも、XSSとScriptInsertionは別物であることがお判りいただけるでしょう。

ScriptInsertion攻撃からサイト全体を守るための「大きな傘」となると難しいのですが、怪しいリクエストが見つかった時点で、サーバ管理者にメールをする、なんて地道な方法しかないかもしれません。

メールを送るとなると、可能な限りノイズを減らしたいところです。リクエストが怪しいかどうかの判断には、<'"なんて汎用的なキャラクターではなく、JavaScript特有の関数名であればかなりノイズは減らせますが、それで十分かどうかはなんとも言えないところです。

とにかく、JavaScriptで最も怖いのは、"XMLHttpRequest"なので、この文字列と、動的にXMLHttpRequestという関数名を生成・実行する"eval"の2つを検出することは最低限必要でしょう。あとは定番ですが、cookieも押さえておきます。

実際の所、こんな方法でサイト全体のScriptInsertion対策になるのか、と問われたら、自分自身でも「疑わしい」としか答えようがないのですが…

以上、宿題を残しつつも、anti-XSSシステムについてはこれにていったん終了とします。




You can read more news at PEAK XOOPS.
http://xoops.peak.ne.jp

The URL for this story is:
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=129