■ CGI での HTTP_* に関するクロスサイトスクリプティング脆弱性
※この脆弱性は おでん田中さん が 2ちゃんねる のどっかのスレッドで発見した物です。私はこれで何が出来るか、という部分を検証したりしてみました。クロスサイトスクリプティング脆弱性については、IPA の解説等を参考にして下さい。
これを知った時はびびりました。なんせ、自分が作ったCGIスクリプトで USER_AGENT を表示する奴は全部汚染しているからです。
HTTP_USER_AGENT はブラウザの識別子の事で、例えば InternetExplorer なら Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) 等と決まってるわけですが、この USER_AGENT はその辺にあるサードパーティ製のブラウザを使えば自由に編集可能です。自分の好きな名前を名乗る事が出来るんですね。
実はこの USER_AGENT に、実行可能なタグを埋め込んだりする事も出来ちゃう、というのが今回のお話しです。
タグを埋めるとどんな被害があるかと言うと、「対策を取っていない USER_AGENT を表示するCGIスクリプト」にアクセスしただけで、攻撃者の仕掛けた任意のスクリプトが実行されてしまうのです。アクセスログに USER_AGENT を表示するようにしてませんか?もし対策を取っていない場合は非常に危険です。非公開のアクセスログなら、被害も管理人だけで済む(自業自得というヤツ)のですが、もし掲示板スクリプトに USER_AGENT が表示されたら?掲示板にアクセスしに来たユーザーがもれなく危険にさらされる事になってしまいます。
では、どんなスクリプトが動かせるのか?いくつか検証を行ってみました。
・ブラウザクラッシュ --- 有名ですね、ウィンドウを無限に開いてブラウザを落とす事に成功しました。
・任意のページを表示させる --- スパイウェアなんかと同じように、指定したページを強制的に開かせる事が可能です。
・クッキー略取 --- これが一番危険、その掲示板なりログ解析ページだかで使用中のクッキーを取得可能です。
では対策方法 Perl 版。USER_AGENT 以外のもの(Refererとか)も危険なので、環境変数は全部 HTML エスケープしちゃうのが安心です。Perl 以外は詳しく無いので省きますが、基本的にタグに使う「<>」この二つを弾けば平気でしょう。
foreach (%ENV) { s/&(?!(?:amp|quot|lt|gt);)/&/g; s/"/"/g; s/</</g; s/>/>/g; }
一般ユーザーの対策は、JavaScript を切る、というとても消極的な方法くらいしか思い浮かばない。あとは、こういう脆弱性がある事を色々なサイトの管理人さんに伝える、という事でしょうか。
この脆弱性は自分にとってかなり盲点でびっくりしたので、ここで紹介しました。もし自分が無知なだけだったらごめんなさいです。
Posted by Kyosuke Takayama at 2003-10-27 (Mon) 11:35 printable version
1) 葵 (2003-10-27 (Mon) 12:32)
8へぇということで(ぉぃ