作者: Bruce.
日時: 2007/5/30(00:13)
Bruce.です。

藤岡和夫 さんは書きました (2007/05/29 23:55):
> On Mon, 28 May 2007 23:41:54 +0900
> "Bruce." <kbk@...> さんwrote:
> 
>> XSSではなくOSコマンドインジェクションです。
>> 悪意の第三者が漢字以外のものを入力する可能性はあります。
>> そこに落とし穴があります。
> 
>  OSコマンドインジェクションは、open()、system()関数などの引数をCGIが入
> 力として受け取る場合の問題と理解しているのですが、違うでしょうか。今回の
> スクリプトは、単に検索文字列のパターンを受け取るだけですから、何も起こり
> ようがないと思うのですが・・・

実はひとつ抜け道があるのです。


検索を実行しているのは

		if(s/($pat)/<font color="red">$1<\/font>/g){

ですよね。
で、ここで使っている $pat は

$pat = $in{'PAT'};

でとってきているものを don't care でつかっています。
さて、芸達者なPerl5の正規表現のメタ文字の中には以下のようなものがあります。

 "(?{ code })"
           WARNING: This extended regular expression feature is
           considered highly experimental, and may be changed or deleted
           without notice.

           This zero-width assertion evaluates any embedded Perl code. It
           always succeeds, and its "code" is not interpolated.
           Currently, the rules to determine where the "code" ends are
           somewhat convoluted.

ということで任意のPerlのスクリプト片、さらにはOSに対するコマンドも
埋め込むことができるというわけです。
実は現在のバージョンでは、無指定ではこの機能は有効になりません。
プラグまで宣言してやる必要がありますが、5.005ではそのようには
なっていなかった(危険性が認識されていなかったのでしょう)と記憶しています。

前回書き忘れましたが -T オプションを追加してtaint チェックをしておくべきですね。
外界からの入力を無条件に信じるのは怪我の元です。

-- 
木村浩一
  I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
  mail kbk@...
        web  www.kt.rim.or.jp/~kbk/zakkicho/
             homepage3.nifty.com/farstar/